quinta-feira, 23 de abril de 2009

Triggers no SQL Server

veja o trigger abaixo:

create trigger

[dbo].[ControleFaturasUnificadas_Recebimentos_DeletaMovContábil_Receb]

on [dbo].[ControleFaturasUnificadas_Recebimentos]

for delete

as

declare @CodCompleto nvarchar(20)

select @CodCompleto = CódigoCompleto

from deleted

delete MovimentoContábil

where CódigoFaturaUnificada_Recebimento = @CodCompleto


Tudo certo, né?
Na verdade, tudo errado, porque se você deletar vários registros da tabela ControleFaturasUnificadas_Recebimentos ao mesmo tempo, só o último registro deletado da tabela primária provocará a exclusão do registro correspondente na tabela secundária. Ou seja, inúmeros registros que deveriam ser deletados continuarão no banco de dados.

A solução é fazer um JOIN entre a tabela primária (tabela Deleted, uma tabela virtual dos registros deletados) com a tabela secundária. Veja o mesmo exemplo remodelado:

set ANSI_NULLS ON

set QUOTED_IDENTIFIER ON

GO

ALTER trigger

[dbo].[ControleFaturasUnificadas_Recebimentos_DeletaMovContábil_Receb]

on [dbo].[ControleFaturasUnificadas_Recebimentos]

for delete

as

delete MovimentoContábil

from MovimentoContábil, Deleted

where CódigoFaturaUnificada_Recebimento = Deleted.CódigoCompleto


Agora o negócio funciona!

Nenhum comentário:

Postar um comentário