Dúvida com trigger sql

Delphi

21/04/2009

Boa noite!

Eu estou começando a trabalhar com sql e tenho uma dúvida sobre trigger. A versão que estou utilizando é a 2008. Tenho uma aplicação delphi que acessa a este banco. O problema que estou enfrentando é que quando um registro de uma tabela é deletado, não está chamando a procedure que eu criei para atualizar o total de um campo que existe na tabela. É evidente que há um equívoco da minha parte por não estar funcionando corretamente, devido principalmente à minha pouca experiência neste banco, já que utilizo o firebird há mais tempo.

Vejam abaixo como criei a trigger:

CREATE TRIGGER [dbo].[TRG_CALCULA_CDAI] ON [dbo].[ATEN_CLIN]
WITH EXECUTE AS CALLER
FOR INSERT, UPDATE, DELETE
AS
declare
@ATEN_COD INT,
@CF_ITEM_COD int,
@AT_CLIN_TEX_4 varchar(300)
begin

if (exists(select * from INSERTED)) and not (exists(select * from DELETED))
begin
set @ATEN_COD = (select ATEN_COD from INSERTED)
set @CF_ITEM_COD = (select CF_ITEM_COD from INSERTED)
set @AT_CLIN_TEX_4 = (select AT_CLIN_TEX_4 from INSERTED)
/* Executa a SP */
execute SP_CALCULA_CDAI @ATEN_COD, @CF_ITEM_COD, @AT_CLIN_TEX_4
end
else if (exists(select * from INSERTED)) and (exists(select * from DELETED))
begin
set @ATEN_COD = (select ATEN_COD from DELETED)
set @CF_ITEM_COD = (select CF_ITEM_COD from DELETED)
set @AT_CLIN_TEX_4 = (select AT_CLIN_TEX_4 from DELETED)
/* Executa a SP */
execute SP_CALCULA_CDAI @ATEN_COD, @CF_ITEM_COD, @AT_CLIN_TEX_4
end
else if (not exists(select * from INSERTED)) and (exists(select * from DELETED))
begin
set @ATEN_COD = (select ATEN_COD from DELETED)
/* Atualiza o total CDAI quando um item é excluído */
execute SP_ATUALIZA_TOTAL_CDAI @ATEN_COD
end;
end
GO

Gostaria que, se possível, pudem analisá-la e me apontar onde está o erro. As procedures que eu criei estão funcionando perfeitamente. Todos os testes foram feitos no banco e não na minha aplicação delphi.

Desde já agradeço a atenção de todos.

Abraços,

Rogério


Roger1976

Roger1976

Curtidas 0

Respostas

Luiz.mota

Luiz.mota

21/04/2009

Provavelmente o problema esta ocorrendo porque vc esta tentando atribuir as variaveis um [b:a8d68de36e]select[/b:a8d68de36e] sem tratar a possibilidade de que esta operação pode retornar mais de um registro. Realize um teste, adicionando ao código a instrução [b:a8d68de36e]TOP 1[/b:a8d68de36e] ou [b:a8d68de36e]distinct[/b:a8d68de36e] para ver o que eu estou falando.

set @ATEN_COD = (select [b:a8d68de36e]TOP 1[/b:a8d68de36e] ATEN_COD from DELETED)

ou

set @ATEN_COD = (select [b:a8d68de36e]distinct[/b:a8d68de36e] ATEN_COD from DELETED)

Esta opção serve apenas para realizar um teste. Caso vc possua registros diferentes nos campos [b:a8d68de36e]ATEN_COD[/b:a8d68de36e], [b:a8d68de36e]CF_ITEM_COD[/b:a8d68de36e] ou [b:a8d68de36e]AT_CLIN_TEX_4[/b:a8d68de36e], vc deve abrir um laço e atribuir um registro de cada vez a cada variável.

[]´s


GOSTEI 0
Roger1976

Roger1976

21/04/2009

Amigo Luiz, eu testei aqui e não funcionou, aliás, só funciona qdo eu insiro um registro na tabela. Na atualização, eu tenho que realizar a mesma operação duas vezes, e na exclusão não funciona. No firebird é tão mais tranquilo de se trabalhar.

Obrigado pela atenção, e se tiver outra sugestão, por favor fique a vontade.

Abraços,


GOSTEI 0
POSTAR