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

Reply via email to