Fórum Ajuda com Trigger #55569

23/03/2006

0

Ola pessoal.

Criei uma trigger para inserir em uma tabela do banco(rpl_script) o escript da transação executada em uma determinada tabela(neste caso tabela localidade).

CREATE TRIGGER TG_LOCALIDADE FOR LOCALIDADE
ACTIVE BEFORE INSERT OR UPDATE OR DELETE POSITION 0
AS
begin
if (inserting) then
begin
insert into rpl_script(id_script, script)values(gen_id(inc_id,1),
´INSERT INTO LOCALIDADE(COD_LOCALIDADE,DESCRICAO, UF, SIGLA, CEP)VALUES(´
||new.cod_localidade||´,´||new.descricao||´,´||new.uf||´,´||new.sigla||´,´||new.cep||´)´);

end
else
if (updating) then
begin
insert into rpl_script(id_script, script)values(gen_id(inc_id,1),
´ UPDATE LOCALIDADE SET ´||
´ COD_LOCALIDADE = ´||NEW.cod_localidade||´, DESCRICAO = ´||NEW.descricao||
´, UF = ´||NEW.UF||´, SIGLA = ´||NEW.sigla||´, CEP =´||NEW.cep);


end
else
if (deleting) then
begin
insert into rpl_script(id_script, script)values(gen_id(inc_id,1),
´ DELETE FROM LOCALIDADE ´||
´ WHERE COD_LOCALIDADE = ´||OLD.cod_localidade );
end

end


O problema que esta ocorrendo é que esta inserindo null no campo script onde deveria estar inserirndo o Script (insert, update ou delete), tem alguma coisa errada na minha trigger?

Sou iniciante nessa parte de triggers e stored procedures então qualquer dica será bem vinda.


Rengaf

Rengaf

Responder

Posts

23/03/2006

Emerson Nascimento

seu campo COD_LOCALIDADE é um campo char/varchar?

se não for char/varchar, não será possível fazer a concatenação direta. será necessário fazer um CAST no campo. onde fizer referência ao campo cod_localidade, faça:
[i:e118474ced]cast(new.cod_localidade as varchar(15))[/i:e118474ced] ou
[i:e118474ced]cast(old.cod_localidade as varchar(15))[/i:e118474ced]
conforme o caso.


Responder

Gostei + 0

23/03/2006

Rengaf

seu campo COD_LOCALIDADE é um campo char/varchar? se não for char/varchar, não será possível fazer a concatenação direta. será necessário fazer um CAST no campo. onde fizer referência ao campo cod_localidade, faça: [i:20cc2c77ef]cast(new.cod_localidade as varchar(15))[/i:20cc2c77ef] ou [i:20cc2c77ef]cast(old.cod_localidade as varchar(15))[/i:20cc2c77ef] conforme o caso.



Realmente, meu campo cod_localidade não é char ou varchar.
Utilizei o metodo cast na concatenação mas continua retornando null.

Para a deleção ele concatena normal, sera que não existe algum limite de caracteres para para o insert ou algo parecido??


Responder

Gostei + 0

23/03/2006

Rengaf

seu campo COD_LOCALIDADE é um campo char/varchar? se não for char/varchar, não será possível fazer a concatenação direta. será necessário fazer um CAST no campo. onde fizer referência ao campo cod_localidade, faça: [i:51612e5ee7]cast(new.cod_localidade as varchar(15))[/i:51612e5ee7] ou [i:51612e5ee7]cast(old.cod_localidade as varchar(15))[/i:51612e5ee7] conforme o caso.



Realmente, meu campo cod_localidade não é char ou varchar.
Utilizei o metodo cast na concatenação mas continua retornando null.

Para a deleção ele concatena normal, sera que não existe algum limite de caracteres para o insert ou algo parecido??


Responder

Gostei + 0

23/03/2006

Rengaf

Pessoal, o seguinte...


No andar dos meus testes percebi uma coisa. A minha trigger só concatena os campos quando nenhum deles é null, alguem saberia me explicar o por que e como faço para resolver este problema??


Responder

Gostei + 0

23/03/2006

Emerson Nascimento

tente assim:
CREATE TRIGGER TG_LOCALIDADE FOR LOCALIDADE 
ACTIVE BEFORE INSERT OR UPDATE OR DELETE POSITION 0 
AS 
begin
  if (inserting) then
    insert into rpl_script(script)
    values(´INSERT INTO LOCALIDADE(COD_LOCALIDADE, DESCRICAO, UF, SIGLA, CEP) ´ ||
           ´VALUES(´ || cast(coalesce(new.cod_localidade,0) as varchar(15))
                     || ´,´ || coalesce(new.descricao,´´)
                     || ´,´ || coalesce(new.uf,´´)
                     || ´,´ || coalesce(new.sigla,´´)
                     || ´,´ || coalesce(new.cep,´´) ||´)´ );
  else 
  if (updating) then 
    insert into rpl_script(script)
    values(´UPDATE LOCALIDADE SET ´
            || ´ COD_LOCALIDADE = ´
            || cast(coalesce(new.cod_localidade,0) as varchar(15))
            || ´, DESCRICAO = ´ || coalesce(new.descricao,´´)
            || ´, UF = ´        || coalesce(new.UF,´´)
            || ´, SIGLA = ´     || coalesce(new.sigla,´´)
            || ´, CEP =´        || coalesce(new.cep,´´)
            || ´ WHERE COD_LOCALIDADE = ´
            || cast(coalesce(OLD.cod_localidade,0) as varchar(15)) );
  else 
    insert into rpl_script(script)
    values(´DELETE FROM LOCALIDADE WHERE COD_LOCALIDADE = ´
           || cast(coalesce(OLD.cod_localidade,0) as varchar(15)) ); 
end
[b:aa6cfb3eb7]note que você havia esquecido o WHERE no caso da instrucao update.[/b:aa6cfb3eb7]


Responder

Gostei + 0

24/03/2006

Rengaf

Muito obrigado pela ajuda Emerson.
Depois que usei o metodo ´coalesce´ funcionou perfeitamente :lol:


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar