Existe uma solução feita pelo MAURO H. C. MATOS para auditoria. Acho que pode te ajudar!
http://pgfoundry.org/pipermail/brasil-usuarios/attachments/20060120/54649853/historico5.zip Em 19 de abril de 2010 18:00, Osvaldo Kussama <osvaldo.kuss...@gmail.com>escreveu: > Em 19 de abril de 2010 15:38, Wagner Santos <wagner.gsan...@gmail.com> > escreveu: > > Obrigado pela ajuda de todos. > > Baseado nos exemplos minha trigger seria algo parecido com : > > -- Function: process_tb_audit() > > -- DROP FUNCTION process_tb_audit(); > > CREATE OR REPLACE FUNCTION process_tb_audit() > > RETURNS trigger AS > > $BODY$ > > BEGIN > > -- > > -- Create a row in emp_audit to reflect the operation performed > on > > emp, > > -- make use of the special variable TG_OP to work out the > operation. > > -- > > IF (TG_OP = 'DELETE') THEN > > INSERT INTO audit SELECT user, now(),OLD.gid; > > RETURN OLD; > > ELSIF (TG_OP = 'UPDATE') THEN > > INSERT INTO audit SELECT user, now(),NEW.gid; > > RETURN NEW; > > ELSIF (TG_OP = 'INSERT') THEN > > INSERT INTO audit SELECT user, now(),NEW.gid; > > RETURN NEW; > > END IF; > > RETURN NULL; -- result is ignored since this is an AFTER trigger > > END; > > $BODY$ > > LANGUAGE 'plpgsql' VOLATILE > > COST 100; > > ALTER FUNCTION process_tb_audit() OWNER TO "admin"; > > Note que em sua versão você não está guardando na tabela audit qual > foi a operação realizada. > > > > > > Porém, algumas modificacoes são necessárias para que eu possa usá-la > > corretamente: > > Ao invés de: INSERT INTO audit SELECT user, now(),NEW.gid; > > Gostaria de pegar o nome da tabela sendo alterada, por exemplo: > > INSERT INTO $TABELA$ SELECT user, now(),NEW.gid; > > É possivel? > > Um outro detalhe, esse teste que estou fazendo está inserindo em uma > outra > > tabela (audit) gostaria de fazer um update na tabela atual com o nome de > > usuario e a data, seria assim: > > UPDATE $TABELA$ set usuario=SELECT user, set dataAlter= now() where ???? > > E o que eu coloco no where? > > Veja: > > http://www.postgresql.org/docs/current/interactive/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN > Seria algo do tipo: > EXECUTE 'UPDATE ' || TG_TABLE_SCHEMA || '.' || TG_TABLE_NAME || ' SET > usuario = ' || CURRENT_USER || ', dataAlter = ' || CURRENT_DATE ' > WHERE chave = ' || old.chave; > > O único *problema* é que esta solução entrará em loop (a trigger > disparará a trigger e assim sucessivamente). > Para evitá-lo você precisa testar quando a trigger está sendo > disparada pela própria função da trigger. > > Dê uma reavaliada no que deseja deixar registrado, por ex. quando você > excluir um registro você não quer deixar rastro nenhum? > > Osvaldo > _______________________________________________ > pgbr-geral mailing list > pgbr-geral@listas.postgresql.org.br > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > -- Verônica Alessandra F. de Almeida Produtos & Internet - Banco de dados 55 11 3736 4515 veron...@climatempo.com.br www.climatempo.com.br Climatempo. O Céu fala. A gente entende.
_______________________________________________ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral