【问题标题】:How do I rewrite this trigger to use a cursor or set based approach?如何重写此触发器以使用基于游标或集合的方法?
【发布时间】:2014-06-10 17:09:26
【问题描述】:

下面的触发器应该在为产品更新 Product OrderNo 时从ProductOrders 表中删除行。这在前端工作正常,但如果有人在后端进行大规模更新(更新多个订单号),我需要一种方法来为所有产品订单号更新运行此触发器。

CREATE TRIGGER [trgAfterOrderNoUpdate] ON [Products]
    FOR UPDATE
AS 

DECLARE @id uniqueidentifier

SELECT @id = i.ID
FROM inserted i

if UPDATE(OrderNo)
DELETE FROM ProductOrders
WHERE ID= @id

【问题讨论】:

  • 永远不要考虑在触发器中使用光标。
  • @HLGEM - 为什么在触发器中使用光标是一件坏事?我是触发器的新手,所以请原谅这个愚蠢的问题,虽然没有这样的事情:)
  • 因为游标很慢,您可以在处理百万条记录更新时锁定所有其他用户,这需要几秒钟,而现在需要 18 小时。

标签: sql-server tsql triggers cursor


【解决方案1】:

试试这个:

DELETE PO
FROM ProductOrders PO
INNER JOIN INSERTED I
    ON PO.ID = I.ID
INNER JOIN DELETED D
    ON PO.ID = D.ID
WHERE I.OrderNo <> D.OrderNo
OR (I.OrderNo IS NULL AND D.OrderNo IS NOT NULL)
OR (I.OrderNo IS NOT NULL AND D.OrderNo IS NULL)

【讨论】:

  • 我试过这个,但触发器没有删除任何东西。
  • 好的,我得到了这个工作。我混淆了一些ID。谢谢。
【解决方案2】:

听起来你真的想在ON DELETE CASCADE 中使用外键

Technet: Cascading Referential Integrity Constraints

Technet: Triggers Compared to Constraints

如果你真的必须使用触发器,你需要这样的东西:

DELETE po
FROM ProductOrders po
INNER JOIN (
  SELECT id, OrderNo FROM deleted
  EXCEPT
  SELECT id, OrderNo FROM inserted
) i ON i.id = po.id

【讨论】:

    【解决方案3】:

    使用触发器时请记住,插入或删除的项目是表而不是单行。您将需要加入插入的表以删除正确的行

    CREATE TRIGGER [trgAfterOrderNoUpdate] ON [Products]
        FOR UPDATE
    AS 
    
    
    DELETE FROM ProductOrders
    WHERE ID in (select ID 
                 from    inserted i
                      inner join Products p on i.Id = p.ID
                 where i.OrderNo != p.OrderNo)
    

    【讨论】:

    • 我的 id 是从我的帖子中插入的,对吗?
    • 是的,您是从插入的 id 中获取的,问题是要获取的 ID 不止一个。
    • 啊我明白了,所以基本上我和你的区别是我的只会做 1 行,而你的会根据一组 id 删除?
    • 你的和@Lamak 的有很大区别吗?似乎主要区别在于您使用的是子查询,而他使用的是联接。
    • 是的,@xaisoft,这正是区别所在,这就是为什么它可以在代码中工作(只有一种产品),但在有人试图删除多个产品时却不行。
    猜你喜欢
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多