Ajuda com Trigger
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.
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
Curtidas 0
Respostas
Emerson Nascimento
23/03/2006
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.
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.
GOSTEI 0
Rengaf
23/03/2006
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??
GOSTEI 0
Rengaf
23/03/2006
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??
GOSTEI 0
Rengaf
23/03/2006
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??
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??
GOSTEI 0
Emerson Nascimento
23/03/2006
tente assim:
[b:aa6cfb3eb7]note que você havia esquecido o WHERE no caso da instrucao update.[/b:aa6cfb3eb7]
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
GOSTEI 0
Rengaf
23/03/2006
Muito obrigado pela ajuda Emerson.
Depois que usei o metodo ´coalesce´ funcionou perfeitamente :lol:
Depois que usei o metodo ´coalesce´ funcionou perfeitamente :lol:
GOSTEI 0