Obrigado a todos pela ajuda... O que quero é algo bem simples: Todas as minhas tabelas (nao sei se é a melhor forma mas já me passaram assim) tem um campo data e usuario, a ideia é que essa informação seja preenchida com quem inseriu a informação ou com quem alterou a informação e a data dessa modificação.
Imagino que seja bem simples, e próximo do que estou fazendo. O problema é o típico de empresas do governo, não colocam os especialistas certos para fazer o trabalho (eu programa em java, não sei muito sobre triggers). Novamente, agradeço a todos. ---------- Wagner Santos MSN/Gtalk: [email protected] Site: http://www.geracaoelias.blog.br meadiciona:http://meadiciona.com/wagnergsantos/ On Mon, Apr 19, 2010 at 8:35 PM, Jean <[email protected]> wrote: > Wagner, > > tenho usado a função abaixo, em TCL... mas ainda nao fiz uma interface para > analisar os dados... basta criar uma trigger pra cada tabela que desejar > logar, usando a função. Crie a tabela primeiro. > > CREATE TABLE "public"."audit_table" ( > "ts" TIMESTAMP WITH TIME ZONE, > "usr" VARCHAR(10), > "tbl" VARCHAR(40), > "fld" VARCHAR(40), > "pk_name" VARCHAR(30), > "pk_value" VARCHAR(20), > "mod_type" CHAR(6), > "old_val" TEXT, > "new_val" TEXT > ) WITHOUT OIDS; > > > CREATE OR REPLACE FUNCTION "public"."log_to_audit_table" () RETURNS trigger > AS > $body$ > spi_exec "SELECT CURRENT_USER AS tguser" > > #skip changes on audit_table > if {[string equal -nocase $TG_table_name audit_table]} { return OK } > > #get PK name > set pk_name "" > spi_exec "SELECT a.attname AS pk_name FROM pg_class c, pg_attribute a, > pg_index i > WHERE c.relname = '$TG_table_name' > AND c.oid=i.indrelid > AND a.attnum > 0 > AND a.attrelid = i.indexrelid > AND i.indisprimary='t'" > > switch $TG_op { > INSERT { > set pk_value "" > > #get PK value > foreach field $TG_relatts { > if {[string equal -nocase [lindex [array get NEW $field] 0] $pk_name]} > { > set pk_value [lindex [array get NEW $field] 1] > break; > } > } > #log inserted row values > foreach field $TG_relatts { > if {! [string equal -nocase [lindex [array get NEW $field] 0] > $pk_name]} { > set modified_field [lindex [array get NEW $field] 0] > set current_value [lindex [array get NEW $field] 1] > spi_exec -array C "INSERT INTO audit_table(ts, usr, tbl, fld, > pk_name, pk_value, mod_type, old_val, new_val) > VALUES (CURRENT_TIMESTAMP, '$tguser', '$TG_table_name', > '$modified_field', '$pk_name', '$pk_value', '$TG_op', NULL, > '$current_value')" > } > } > } > UPDATE { > set pk_value "" > > #get PK value > foreach field $TG_relatts { > if {[string equal -nocase [lindex [array get NEW $field] 0] $pk_name]} > { > set pk_value [lindex [array get NEW $field] 1] > break; > } > } > #log inserted row values > foreach field $TG_relatts { > #check changed fields > if {[string equal -nocase [array get NEW $field] [array get OLD > $field]] == 0} { > set modified_field [lindex [array get OLD $field] 0] > if {[string compare $modified_field ""] == 0} { > set modified_field [lindex [array get NEW $field] 0] > } > set previous_value [lindex [array get OLD $field] 1] > set current_value [lindex [array get NEW $field] 1] > spi_exec -array C "INSERT INTO audit_table(ts, usr, tbl, fld, > pk_name, pk_value, mod_type, old_val, new_val) > VALUES (CURRENT_TIMESTAMP, '$tguser', '$TG_table_name', > '$modified_field', '$pk_name', '$pk_value', '$TG_op', '$previous_value', > '$current_value')" > } > } > } > DELETE { > set pk_value "" > > #get PK value > foreach field $TG_relatts { > if {[string equal -nocase [lindex [array get OLD $field] 0] $pk_name]} > { > set pk_value [lindex [array get OLD $field] 1] > break; > } > } > #log inserted row values > foreach field $TG_relatts { > if {! [string equal -nocase [lindex [array get OLD $field] 0] > $pk_name]} { > set modified_field [lindex [array get OLD $field] 0] > set previous_value [lindex [array get OLD $field] 1] > spi_exec -array C "INSERT INTO audit_table(ts, usr, tbl, fld, > pk_name, pk_value, mod_type, old_val, new_val) > VALUES (CURRENT_TIMESTAMP, '$tguser', '$TG_table_name', > '$modified_field', '$pk_name', '$pk_value', '$TG_op', '$previous_value', > NULL)" > } > } > } > } > return OK > $body$ > LANGUAGE 'pltcl' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER; > > > > > *From:* Wagner Santos <[email protected]> > *Sent:* Monday, April 19, 2010 2:43 PM > *To:* [email protected] > *Subject:* [pgbr-geral] user log > > Caros, > Nas minhas tabelas tem um campo com o nome de usuario para indicar quem fez > a ultima alteracao ou insercao na base. > Gostaria que quanto um uma determinada linha da tabela fosse alterada, > essas informações fossem gravadas na base. > Imagino que isso seja possível com uma trigger, mas como fazer? > Vou ter que criar uma trigger por tabela ou posso criar uma para todo o > banco? > Por ultimo, como pegar o nome do usuário logado no banco. > > Obrigado, > > ---------- > Wagner Santos > MSN/Gtalk: [email protected] > Site: http://www.geracaoelias.blog.br > meadiciona:http://meadiciona.com/wagnergsantos/ > > _______________________________________________ > pgbr-geral mailing list > [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
