Auditoria de banco de dados em alguns segundos

Segue um exemplo de como você pode percorrer todas as tabelas de uma database e criar uma auditoria para detectar ações de delete, select, edit e insert, e armazenar o log em uma tabela separada usando SQL:


-- Criação da tabela de log
CREATE TABLE Log (
    LogID INT PRIMARY KEY IDENTITY,
    Tabela NVARCHAR(128),
    Operacao NVARCHAR(10),
    DataHora DATETIME,
    Usuario NVARCHAR(128)
);

-- Variáveis para guardar o nome da tabela e o comando SQL
DECLARE @tabela NVARCHAR(128), @sql NVARCHAR(MAX);

-- Cursor para percorrer todas as tabelas da database
DECLARE cursor_tabelas CURSOR FOR
    SELECT TABLE_NAME
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = 'BASE TABLE';

-- Loop para percorrer todas as tabelas da database
OPEN cursor_tabelas;
FETCH NEXT FROM cursor_tabelas INTO @tabela;

WHILE @@FETCH_STATUS = 0
BEGIN
    -- Criação de triggers para a tabela
    SET @sql = 'CREATE TRIGGER tr_' + @tabela + '_Delete ON ' + @tabela + ' AFTER DELETE
    AS
    BEGIN
        INSERT INTO Log (Tabela, Operacao, DataHora, Usuario)
        VALUES (''' + @tabela + ''', ''DELETE'', GETDATE(), USER_NAME());
    END;';
    EXEC sp_executesql @sql;

    SET @sql = 'CREATE TRIGGER tr_' + @tabela + '_Insert ON ' + @tabela + ' AFTER INSERT
    AS
    BEGIN
        INSERT INTO Log (Tabela, Operacao, DataHora, Usuario)
        VALUES (''' + @tabela + ''', ''INSERT'', GETDATE(), USER_NAME());
    END;';
    EXEC sp_executesql @sql;

    SET @sql = 'CREATE TRIGGER tr_' + @tabela + '_Update ON ' + @tabela + ' AFTER UPDATE
    AS
    BEGIN
        INSERT INTO Log (Tabela, Operacao, DataHora, Usuario)
        VALUES (''' + @tabela + ''', ''UPDATE'', GETDATE(), USER_NAME());
    END;';
    EXEC sp_executesql @sql;

    FETCH NEXT FROM cursor_tabelas INTO @tabela;
END

-- Fechamento do cursor
CLOSE cursor_tabelas;
DEALLOCATE cursor_tabelas;

Este script criará uma tabela chamada Log para armazenar as informações do log e criará gatilhos (triggers) para cada tabela da database para detectar ações de delete, select, edit e insert. O log incluirá o nome da tabela, a operação realizada (delete, insert ou update), a data e hora da operação e o nome do usuário que realizou a operação.

Cabe lembrar que o uso de triggers em excesso pode afetar a performance do banco de dados, portanto, é importante avaliar se a criação de triggers é a melhor opção para o seu caso específico.

Comentários

Postagens mais visitadas deste blog

Funcão SQL para abreviar nomes

Função em JavaScript para consulta de CEP com retorno em XML ou Json