Sql server 从表中删除多行时如何处理删除后触发器
我有两个表,表1 bcdet有交易明细,表2 accmast有所有分类科目的期末余额。当我试图删除任何事务时,更新不会生效 这是我的触发码Sql server 从表中删除多行时如何处理删除后触发器,sql-server,triggers,Sql Server,Triggers,我有两个表,表1 bcdet有交易明细,表2 accmast有所有分类科目的期末余额。当我试图删除任何事务时,更新不会生效 这是我的触发码 ALTER trigger [dbo].[tr_ledgerdelete] on [dbo].[BCDet] after delete as begin declare @dlcode int; declare @ddc nvarchar(2); declare @dAmt float; SET NOCOUNT ON;
ALTER trigger [dbo].[tr_ledgerdelete]
on [dbo].[BCDet]
after delete
as
begin
declare @dlcode int;
declare @ddc nvarchar(2);
declare @dAmt float;
SET NOCOUNT ON;
set @ddc=(select dc from deleted)
set @damt=(select amt from deleted)
if (@ddc='C')
begin
update accmast set totcr=totcr-@damt where Lcode in (select Lcode from deleted)
update accmast set clbal=totcr-totdr+opbal where Lcode in (select Lcode from deleted)
end
else
begin
update accmast set totdr=totdr-@damt where Lcode in (select Lcode from deleted)
update accmast set clbal=totcr-totdr+opbal where Lcode in (select Lcode from deleted)
end
end
插入和删除的表可以包含多行,因此不建议在触发器中使用变量 此外,如果Lcode不是被删除事务的唯一代码,则将其用作where谓词可能会导致更新触发太多行 如果不知道模式,很难说。此示例应克服第一个问题
ALTER trigger [dbo].[tr_ledgerdelete]
on [dbo].[BCDet]
after delete
as
begin
SET NOCOUNT ON;
update t
set totcr = t.totcr - d.amt
from accmast t
inner join deleted d on t.lcode = d.lcode
where d.dc='C'
update t
set totdr = t.totdr - d.amt
from accmast t
inner join deleted d on t.lcode = d.lcode
where d.dc != 'C'
update t
set clbal = t.totcr - t.totdr + t.opbal
from accmast t
inner join deleted d on t.lcode = d.lcode
end
update不起作用
detailure?在更新过程中,accmast表中的所有clbal字段都会以相同的数量更新。@damt和@ddc varible完全不变,它保留删除表中的第一个值,并根据该值更新accmast表中的每个clbal字段。