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:

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

Fabio Zanela

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
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??

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar