Log de Ações utilizando trigger
27/11/2020
0
Boa tarde pessoal
preciso de uma ajuda de vocês estou desenvolvendo uma aplicação Delphi\Firebird e gostaria de implementar um Log de Auditoria que registrasse todas as inclusões, alterações ou exclusões, mostrando o usuário, data, hora, a tabela e o registro e que operação foi feita (Inclusão, Exclusão e Alteração)
eu tenho a seguinte tabela usuários:
e criei a tabela Auditoria com a seguinte estrutura
porém gostaria de saber como fazer uma trigger que eu consiga pegar todas essas informações de diversas tabelas, o problema maior é pegar o nome da tabela, o nome do usuário ativo no sistema da tabela Usuários, o id e a operação se foi inclusão, exclusão ou alteração
alguém tem alguma ideia de como fazer isso somente pelo banco de dados utilizando triggers ou procedures??
pode até ser uma trigger por tabela mas teria que conseguir acessar essas informações
desde já agradeço
Att.
Fabio Zanela
preciso de uma ajuda de vocês estou desenvolvendo uma aplicação Delphi\Firebird e gostaria de implementar um Log de Auditoria que registrasse todas as inclusões, alterações ou exclusões, mostrando o usuário, data, hora, a tabela e o registro e que operação foi feita (Inclusão, Exclusão e Alteração)
eu tenho a seguinte tabela usuários:
CREATE TABLE USUARIOS ( ID ID NOT NULL /* ID = INTEGER NOT NULL */, NOME NOME /* NOME = VARCHAR(50) */, USUARIO USUARIO /* USUARIO = CHAR(15) NOT NULL */, SENHA SENHA /* SENHA = CHAR(15) NOT NULL */, ATIVO ESCOLHA /* ESCOLHA = CHAR(20) */ );
e criei a tabela Auditoria com a seguinte estrutura
CREATE TABLE AUDITORIA ( ID ID NOT NULL /* ID = INTEGER NOT NULL */, USUARIO ID /* ID = INTEGER NOT NULL */, DATA DATA /* DATA = DATE */, HORA HORA /* HORA = TIME */, TABELA NOME /* NOME = VARCHAR(50) */, REGISTRO ID /* ID = INTEGER NOT NULL */, "OPERAÇÃO" ESCOLHA /* ESCOLHA = CHAR(20) */ ); ALTER TABLE AUDITORIA ADD CONSTRAINT FK_AUDITORIA_USUARIO_ID FOREIGN KEY (USUARIO) REFERENCES USUARIOS (ID);
porém gostaria de saber como fazer uma trigger que eu consiga pegar todas essas informações de diversas tabelas, o problema maior é pegar o nome da tabela, o nome do usuário ativo no sistema da tabela Usuários, o id e a operação se foi inclusão, exclusão ou alteração
alguém tem alguma ideia de como fazer isso somente pelo banco de dados utilizando triggers ou procedures??
pode até ser uma trigger por tabela mas teria que conseguir acessar essas informações
desde já agradeço
Att.
Fabio Zanela
Fabio Zanela
Curtir tópico
+ 0
Responder
Posts
27/11/2020
Emerson Nascimento
você deve fazer os gatilhos nas tabelas que quer monitorar, e a partir dali gravar na auditoria.
por exemplo:
trigger para auditar a tabela de clientes
trigger para auditar a tabela de produtos
procedure para gravar o registro de auditoria
por exemplo:
trigger para auditar a tabela de clientes
CREATE TRIGGER AUDIT_CLIENTE FOR CLIENTE AFTER DELETE OR INSERT OR UPDATE POSITION 4 -- IDEAL QUE SEJA O ULTIMO TRIGGER DA TABELA AS BEGIN IF (INSERTING) THEN EXECUTE PROCEDURE ADDAUDITORIA('USUARIO', 'CLIENTE', NEW.ID, 'INSERT'); IF (DELETING) THEN EXECUTE PROCEDURE ADDAUDITORIA('USUARIO', 'CLIENTE', OLD.ID, 'DELETE'); IF (UPDATING) THEN EXECUTE PROCEDURE ADDAUDITORIA('USUARIO', 'CLIENTE', OLD.ID, 'UPDATE'); END
trigger para auditar a tabela de produtos
CREATE TRIGGER AUDIT_PRODUTO FOR PRODUTO AFTER DELETE OR INSERT OR UPDATE POSITION 4 -- IDEAL QUE SEJA O ULTIMO TRIGGER DA TABELA AS BEGIN IF (INSERTING) THEN EXECUTE PROCEDURE ADDAUDITORIA('USUARIO', 'PRODUTO', NEW.ID, 'INSERT'); IF (DELETING) THEN EXECUTE PROCEDURE ADDAUDITORIA('USUARIO', 'PRODUTO', OLD.ID, 'DELETE'); IF (UPDATING) THEN EXECUTE PROCEDURE ADDAUDITORIA('USUARIO', 'PRODUTO', OLD.ID, 'UPDATE'); END
procedure para gravar o registro de auditoria
CREATE PROCEDURE ADDAUDITORIA( USUARIO ID /* ID = INTEGER NOT NULL */, TABELA NOME /* NOME = VARCHAR(50) */, REGISTRO ID /* ID = INTEGER NOT NULL */, OPERACAO ESCOLHA /* ESCOLHA = CHAR(20) */ ) AS BEGIN INSERT INTO AUDITORIA(USUARIO, DATA, HORA, TABELA, REGISTRO, OPERACAO) VALUES (:USUARIO, CURRENT_DATE, CURRENT_TIME, :TABELA, :REGISTRO, :OPERACAO); END
Responder
27/11/2020
Fabio Zanela
Obrigado ja me ajudou bastante duas questões eu faço os triggers do tipo Before ou After??
segundo como pegar o ID do usuário e o nome da tabela?? no caso do nome da tabela só manualmente??
segundo como pegar o ID do usuário e o nome da tabela?? no caso do nome da tabela só manualmente??
Responder
Clique aqui para fazer login e interagir na Comunidade :)