Ir para conteúdo
Fórum Script Brasil
  • 0

Trigger LOG


Marcel Costa

Pergunta

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...