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