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
