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

Responder a