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:
Pergunta
Marcel Costa
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;
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.