Em 19 de abril de 2010 15:38, Wagner Santos <[email protected]> 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 [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
