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

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

Funcão SQL para abreviar nomes

Produtividade com NHibernate 2.0