条件AFTER UPDATE触发器

问题描述 投票:0回答:1

我正在尝试编写触发器,并希望有一个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
sql-server tsql database-trigger
1个回答
0
投票

尝试将您的状况改为:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.