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

Responder a