Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从表中删除多行时如何处理删除后触发器_Sql Server_Triggers - Fatal编程技术网

Sql server 从表中删除多行时如何处理删除后触发器

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;

我有两个表,表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;    

    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字段。