Já pensou em usar o módulo tablelog? Faz tudo que você quer (menos criar a
tabela automáticamente, algo que -- se você realmente precisa -- pode ser
fácilmente incorporado) e com gatilho em C para melhor performance.

http://pgfoundry.org/projects/tablelog/

Roberto

2011/4/1 Marcel Farias Costa <[email protected]>

> Galera,
>
> Estou tentando fazer uma trigger de LOG. Quando um usuario da um INSERT,
> UPDATE ou DELETE, a trigger verifica se a tabela Nome_tabela+_log existe no
> banco. Se nao existe, ele ira criar essa tabela.
> se existir, ele vai dar um insert com todas informações OLD.* na tabela de
> LOG. Com o comando abaixo.
> Esse comando, vai varrer toda tabela e em cada campo da tabela, vai pegar o
> seu OLD e jogar na tabela LOG:
>
> *     execute 'insert into ' || nome_tabela_log ||'('|| r.coluna ||')
> values (OLD.' || r.coluna || ');';*
> Exemplo:
> *     insert into produtos_log(cod_prod) values (OLD.cod_prod);*
>
> So que, quando ele realiza esse comando. esta dando um erro. Segue o erro
> abaixo:
>
> *ERRO:  faltando entrada para tabela "old" na cláusula FROM
> LINE 1: insert into produtos_log(cod_prod) values (OLD.cod_prod);
>                                                    ^
> QUERY:  insert into produtos_log(cod_prod) values (OLD.cod_prod);
> CONTEXT:  PL/pgSQL function "log_tabela" line 41 at comando EXECUTE
>
> ********** Error **********
>
> ERRO: faltando entrada para tabela "old" na cláusula FROM
> SQL state: 42P01
> Context: PL/pgSQL function "log_tabela" line 41 at comando EXECUTE
>
> *Agradeço a todos!
> *
> Segue a Trigger Abaixo:
> *
> CREATE OR REPLACE FUNCTION log_tabela()
>   RETURNS trigger AS
> $BODY$
>  declare
>  r record;
>  comando text;
>  nome_tabela_log text;
>  nome_tabela text;
>  --cod_prod integer;
>
> begin
>
> nome_tabela_log := TG_TABLE_NAME || '_log'; -- Atribui o nome da tabela +
> Log na variavel nome_tabela_log
> nome_tabela := TG_TABLE_NAME; -- Atriui o nome da tabela a variavel
> nome_tabela
>
> IF ((select count(relname) from pg_class where relname = nome_tabela_log) =
> 0) -- Verifica se a tabela nome_tabela_log Existe no Banco de Dados
> then  BEGIN -- Se não existe, Ele Cria a tabela e seus campos igual a
> tabela Principal, adicionando o campo OPERAÇÃO, DATA, Usuario
>     RAISE NOTICE 'Criando Tabela de Log... %',nome_tabela_log;
>     execute 'create table ' || nome_tabela_log || ' as select * from ' ||
> nome_tabela;
>     execute  'alter table ' || nome_tabela_log || ' add column operacao
> char';
>     execute  'alter table ' || nome_tabela_log || ' add column data
> timestamp';
>     execute  'alter table ' || nome_tabela_log || ' add column usuario
> varchar';
>      END;
> ELSE BEGIN -- Se Existir, ele vai adicionar os campos da tabela principal
> na Tabela LOG
> --RAISE NOTICE '%',nome_tabela_log;
> --RAISE NOTICE '%',nome_tabela;
> --cod_prod := OLD.cod_prod;
> --RAISE NOTICE '%',cod_prod;
> for r in
>  (SELECT
>     a.attname AS coluna
>   FROM pg_attribute AS a
>   JOIN
>     pg_class AS c ON c.oid=a.attrelid AND c.relname !~ '^pg_'
>   JOIN
>     pg_type AS t ON t.oid=a.atttypid
>   LEFT OUTER JOIN
>     pg_attrdef AS d ON c.oid=d.adrelid
>     AND d.adnum=a.attnum
> WHERE a.attnum>0
> AND c.relname = TG_TABLE_NAME
> ORDER BY a.attnum)
> loop
> *     execute 'insert into ' || nome_tabela_log ||'('|| r.coluna ||')
> values (OLD.' || r.coluna || ');';*
> end loop;
>  END;
>  END IF;
>
> RETURN NEW;
>
>  end;$BODY$
>   LANGUAGE plpgsql VOLATILE
>   COST 100;
> ALTER FUNCTION log_tabela() OWNER TO postgres;
>
>
> --
> Atenciosamente,
>
> *Marcel Felipe Farias da Costa*
> (71) 9977-0817 / 8749-2031
>
> [email protected]
> [image: 
> Facebook]<http://www.facebook.com/home.php?#%21/profile.php?id=100001674557938>
>  [image:
> Orkut] <http://www.orkut.com.br/Main#Profile?uid=12437653927557068245> [image:
> Twitter] <http://twitter.com/marcelffarias>
> [image: Google Talk/] marcelffarias [image: Skype/] marcel.f.costa [image:
> MSN/] [email protected]
>
>
> _______________________________________________
> 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