Respeitosamente, Triggers bem implementadas podem ser uma grande coisa ao sistema. Claro que precisas tomar cuidado com situações de chamadas cíclicas ou mesmo de encadeamento de chamada de triggers, pois nesse caso poderias ter performance reduzida ou mesmo deadlocks. Já implementei sistemas robustos que usavam triggers para logs internos e não tive perda de performance alguma.
Gravar em uma tabela separada (específica para logs) que não tenha triggers pode ser viável. Em alguns sistemas que modelei, criei um schema para os logs (dentro do mesmo banco de dados) e nele criei uma tabela de log correspondente à tabela específica. Então criei uma trigger na tabela a ser vistoriada para que gravasse na tabela de log. Há várias formas de montar uma tabela de log, precisas encontrar a melhor para si, eu gostava de utilizar uma que possuisse todos os campos da tabela original (ou talvez sem algum campo que possua data de atualização, se houver) mais dois campos, um timestamp que tenha a data e hora da gravação nessa tabela (valor default: now()) e outro campo indicando o tipo de alteração: I (inserção), U (atualização) ou D (delete). Abraços, 2009/12/11 Wolak Sistemas - Fabiano Machado Dias < [email protected]> > 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 > <[email protected]>wrote: > >> >> >> 2009/12/11 Tiago Adami <[email protected]> >> >>> 2009/12/11 Andre Lopes <[email protected]>: >>> > 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 >> [email protected] >> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral >> >> > ------------------------------ > > _______________________________________________ > pgbr-geral mailing > [email protected]https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > > > > _______________________________________________ > pgbr-geral mailing list > [email protected] > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > > -- André de Camargo Fernandes
_______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
