【问题标题】:How to write a Trigger based on row update如何编写基于行更新的触发器
【发布时间】:2015-05-17 05:09:14
【问题描述】:

我是第一次使用触发器,现在我遇到了一些问题,

我有 3 个表,InvoiceHead、InvoiceDetails、InventoryMaster。

当我更新 InvoiceHead 的“状态”字段(从 0 到 1)时,需要根据更新的行更改 InvoiceDetails 和 InventoryMaster 的“状态”字段。

关系: InvoiceHead_id=InvoiceDetails_id (FK) 和 InventoryMaster_Processid=InvoiceHead_id (FK)

如何在 InvoiceHead 中编写触发器?

请帮忙解决这个问题..

【问题讨论】:

    标签: sql sql-server-2008 sql-server-2008-r2


    【解决方案1】:

    试试这个

    create trigger your_trigger
    on InvoiceHead
    after update
    as
    //declare @status int;
    //select @status=i.status from inserted i;  
    //IF @status == 1 
    //BEGIN
    
    update d
    set d.status = b.status
    from InvoiceDetails as d
    join inserted as b 
    on a.InvoiceDetails_id = b.InvoiceHead_id
    where b.status == 1; 
    
    update m
    set m.status = b.status
    from InventoryMaster  as m
    join inserted as b 
    on m.InventoryMaster_Processid = b.InvoiceHead_id
    where b.status == 1;
    
    
    end
    go  
    

    但请记住,SQL 触发器对整个更新起作用,不像 oracle 中的逐行。因此,如果此触发器一次触发不止一行,我的代码将无法满足您的要求..您需要对其进行微调..

    【讨论】:

    • 谢谢你的朋友,这很好,如果你不忙,你能不能帮我解释一下,你提到的 SQL 与 oracle 相比的整个 rowwise 更新问题?我认为我的触发器现在可以在基于行的更新中完美运行,它在 sqlserver 2008 中
    • 您的触发器有 MAJOR 缺陷,因为您似乎认为它会每行调用一次 - 那是不是 b> 情况。触发器每个语句触发一次,因此如果您的 UPDATE 语句影响 25 行,您将触发触发器一次,然后Inserted 和@987654324 @ 每个将包含 25 行。您的代码将在这 25 行中选择哪一行? select @status=i.status from inserted i; - 它是不确定的,你会得到一个任意行,而你会忽略所有其他行。您需要重写触发器以考虑到这一点!
    • @marc_s 是的,你说的是正确的..这就是我在上一条语句中提到的..如果发生 25 次更新,则在整个更新语句的 sql 触发器工作中,此触发器将立即触发 25 次而不是逐行像在甲骨文中一样排成一排。这就是我让他照顾的事情
    • 但是您发布的代码没有处理这个问题!这就是我要说的 - 你说你必须小心这个 - 但是你自己的代码违反了这个建议.....
    • @AmjadhNm 在 oracle 中,如果为更新或插入编写触发器,它将逐行触发。但在 sql 中并非如此。触发器将立即执行整个更新,请参阅 marc_s 评论..如果此答案帮助您投票..
    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多