Na minha opinião é meio complicado você trabalhar com triggers pois além do desempenho você pode acabar com um grande problema na mão quando uma dessas triggers der algum problema e você não souber mais quem está chamando quem.

Não sei como você fez o seu sistema, no nosso caso existe um função que controla os comando DML, se você tem algo parecido, ou seja um ponto central (seja uma classe, procedure, pl) que controle os comandos para você é mais fácil por exemplo criar uma tabela de parâmetro onde você diria qual tabela iria ter auditoria e a que nível, e a partir daí programar o seu sistema de controle de escrita para daí sim disparar os seus Inserts, Updates e Deletes.

Existem outras maneiras de se fazer é claro e triggers até pode ser uma solução, mas tenha MUITO cuidado com elas.

Abraço,
Fabiano Machado Dias

Andre Lopes escreveu:
Desde já obrigado a ambos, pois deram-me duas ideias.

Realmente não sei muito bem o que adoptar, por agora. Já tenho a base de dados terminada e não me apetecia mexer muito mais nela, em relação á auditoria tenho os 3 campos que referi em todas as tabelas.

Com a solução da tabela única fica tudo centralizado, tem o senão de ser mais difícil fazer SELECT's ao campo DADOS, com a solução de espelhar todas as tabelas é mais fácil fazer SELECT's, mas vai-me dar mais um dia de trabalho espelhar todas as tabelas...

Vou pensar neste assunto seriamente enquanto durmo...

Mais uma vez obrigado.


Cumprimentos,


On Sat, Dec 12, 2009 at 12:24 AM, Lucas Souza <lucassouzadav...@gmail.com> wrote:


2009/12/11 Tiago Adami <adam...@gmail.com>
2009/12/11 Andre Lopes <lopes80an...@gmail.com>:
> Boas,
>

...
>
> A minha pergunta... Como fazem auditoria a DELETE's?


Oi Andre, vou te passar um exemplo da faculdade :) (foi feito para o Oracle, mas espero que te de uma ideia e te ajude ;)


CREATE TABLE AUDITORIA (
TABELA VARCHAR2(50) NOT NULL,
DATA DATE NOT NULL,
OPERACAO CHAR(1) NOT NULL,
USUARIO VARCHAR2(50) NOT NULL,
DADOS VARCHAR2(2000) NOT NULL
);


CREATE TRIGGER TRG_AUDIT_EMPREGADO
AFTER DELETE OR INSERT OR UPDATE
ON EMPREGADO
FOR EACH ROW
DECLARE
  DADOS VARCHAR2(2000);
  BEGIN
   IF DELETING THEN
     DADOS := 'CÓDIGO : '|| :OLD.CODEMP || ‘ NOME : '|| :OLD.NOME ||       ‘ SALÁRIO : '|| :OLD.SALARIO;
     INSERT INTO AUDITORIA VALUES('EMPREGADO',SYSDATE,'D',USER,DADOS);
   END IF;
  
  IF INSERTING THEN
    DADOS := 'CÓDIGO : '|| :NEW.CODEMP ||       ‘ NOME : '|| :NEW.NOME ||       ‘ SALÁRIO : '|| :NEW.SALARIO;
    INSERT INTO AUDITORIA VALUES('EMPREGADO',SYSDATE,'I',USER,DADOS);
   END IF;
 
  IF UPDATING THEN
    DADOS := 'CÓDIGO OLD: '|| :OLD.CODEMP ||      ‘ NOME OLD: '|| :OLD.NOME || ‘ SALÁRIO OLD: '|| :OLD.SALARIO ||
       'CÓDIGO NEW: '|| :NEW.CODEMP ||     ‘ NOME NEW: '|| :NEW.NOME ||         ‘ SALÁRIO NEW: '|| :NEW.SALARIO;
    INSERT INTO AUDITORIA VALUES('EMPREGADO',SYSDATE,'U',USER,DADOS);
   END IF;                                                                                                      32
END;


--
Lucas de Souza D'Ávila
Graduando em Sistemas de Informação - CV Lattes: http://lattes.cnpq.br/9245658982061645

http://twitter.com/lucasdsd

_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



_______________________________________________ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a