条件AFTER UPDATE触发器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了条件AFTER UPDATE触发器相关的知识,希望对你有一定的参考价值。

我正在尝试编写触发器,并希望有一个AFTER UPDATE触发器,以便:

  1. 仅当所有“TypeA”记录更新(通过UI)到“已颁发”时, - >对于每个唯一的OrderID: Master1的状态(对于相同的OrderID)应更新为'TypeA Issued'。 类似地,当在Details1中发布的所有TypeB时,Master1.Status应为'TypeB Issued',以此类推其他类型 由于每个Type(在Details1中)的行数可以变化,我使用Not Issued的计数值作为条件,因为触发器只有在计数变为0时才需要触发
  2. Master.Status将更新为TypeA仅针对详细信息1表中的所有TypeA状态更改(发布)。

我尝试了这个触发器,但即使Details1中Status的值设置为Not Issued,它也会更新Master1。此外,我应该在哪里以及如何包含Master2更新,还是应该为Master2更新专门编写另一个触发器

CREATE TRIGGER Master1_TypeAIssued_StatusUpdate
ON Details1
AFTER UPDATE
AS
BEGIN
    IF (SELECT COUNT(Details1.Status)
          FROM Details1
          INNER JOIN Master1 ON Details1.OrderID = dbo.Master1.OrderID
          WHERE Details1.Status = 'Not Issued' AND
          Details1.Type = 'TypeA') = 0
      BEGIN
          RETURN
      END
  UPDATE Master1 SET Master1.Status = 'TypeA Issued'
END

OrderID     Type        Status
W1          TypeA       Not Issued
W1          TypeA       Not Issued
W1          TypeA       Not Issued
W1          TypeB       Not Issued
W1          TypeB       Not Issued
W1          TypeC       Not Issued
W2          TypeA       Not Issued
W2          TypeA       Not Issued
W2          TypeB       Not Issued

Master1 Table
OrderID     Status
W1          Pending
W2          Pending

Master2 Table
OrderID     Status
W1          Pending
W2          Pending
答案

尝试将您的状况改为:

IF (SELECT COUNT(Details1.Status)
          FROM Details1
          INNER JOIN Master1 ON Details1.OrderID = dbo.Master1.OrderID
          WHERE Details1.Status = 'Not Issued' AND
          Details1.Type = 'TypeA' 
           AND Details1.OrderId IN (Select OrderId from Inserted)) > 0
      BEGIN
          RETURN
      END

这是因为当存在状态为“非问题”的记录时,您不应更新

以上是关于条件AFTER UPDATE触发器的主要内容,如果未能解决你的问题,请参考以下文章

MySQL(15)-触发器

SQLite 创建 AFTER UPDATE 触发器

AFTER UPDATE 触发器上的变异表错误

Orcale触发器的after/before

AFTER UPDATE 触发器使用更新表中的聚合

在AFTER UPDATE触发器上尝试更新只读列错误