Esclarecimento sobre Trigger

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Pessoal, estou com uma dúvida e queria ver se alguém pode me esclarecer.
Seguinte: Criei uma trigger com o intuito de armazenar logs referente a modificação do conteúdo de um determinado campo em uma tabela.

Para isso, criei a trigger assim:

Selecionar tudo

CREATE OR REPLACE TRIGGER nome_trigger
AFTER UPDATE OF campo_tabela
ON nome_tabela
FOR EACH ROW
BEGIN
        //implementação da trigger
END;
A implementação da trigger armazena em uma tabela o valor anterior e o novo valor desse campo. Porém, verificando essa tabela de log, vi que existem vários registros onde o valor anterior e o novo valor são iguais. Acredito que isso ocorra devido ao usuário ter alterado algum outro campo.

O que gostaria de saber é: Quando eu informo OF campo_tabela, a trigger não deveria ser chamada somente quando o valor desse campo em específico fosse alterado?

Obrigado.
ederphil
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Qua, 15 Out 2008 4:05 pm
Localização: taquara-RS

Opa!

nesse caso, a trigger só vai ser disparada se o campo expecificado for alterado.

o que pode estar acontecendo, é que o campo pode estar sendo alterado com o mesmo valor, a trigger vai disparar independente do valor do registro, ela não valida isso,

o que você pode fazer é testar se o :NEW. está diferente do :OLD. , assim só vai logar os registros que realmente foram alterados.

vlw!!
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Cara, acho que era isso mesmo. Como a tabela é alterada via aplicação, a tela deve estar atualizando todos os campos quando o usuário salva e não apenas o valor alterado. (Não tenho acesso ao fonte, por isso presumo isso).

Porém, ao realizar o teste não estou tendo sucesso.

Segue a trigger:

Selecionar tudo

CREATE OR REPLACE TRIGGER nome_trigger
AFTER UPDATE OF campo_tabela
ON nome_tabela
FOR EACH ROW
BEGIN
    INSERT INTO teste_log VALUES(:OLD.campo_tabela, :NEW.campo_tabela); --Teste para verificar os valores.
    IF (To_Number(:OLD.campo_tabela) != To_Number(:NEW.campo_tabela)) THEN
    BEGIN
            //esse If nunca é atingido.... não consegui identificar o porque.
    END;
    END IF;
END;

Nessa trigger, fiz uma talbea de teste para verificar os valores retornados por :new e :old. E são realmente diferentes. Porém, na linha abaixo referente ao log, o bloco IF nunca é atingido, não executando assim o log.

Estou esquecendo de algo?

Obrigado pela ajuda.
ederphil
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Qua, 15 Out 2008 4:05 pm
Localização: taquara-RS

Cara, é isso mesmo, posta o código real que você está executando, porque a princípio está correto,

acrescenta um nvl no teste,

Selecionar tudo

CREATE OR REPLACE TRIGGER nome_trigger
AFTER UPDATE OF campo_tabela ON nome_tabela
FOR EACH ROW
BEGIN

  INSERT INTO teste_log VALUES(:OLD.campo_tabela, :NEW.campo_tabela); --Teste para verificar os valores.
  
  IF NVL(:OLD.campo_tabela,'#') != NVL(:NEW.campo_tabela,'#') THEN
    
--    PL LOG;
    
  END IF;
  
END;
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Cara, consegui. Usando o Nvl bufou blza.
Acredito que quando o campo estava como null ou era atualizado para null, ele não fazia corretamente a comparação. De modo estranho também, porque logicamente falando, NULL é diferente de qualquer valor que seja informado.
Mas enfim, resolvi o problema, obrigado.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Bing [Bot], Google [Bot] e 15 visitantes