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 não 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;