【问题标题】:Conditional AFTER UPDATE Trigger条件更新后触发器
【发布时间】:2019-04-19 14:50:56
【问题描述】:

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

  1. 仅当所有“TypeA”记录(通过 UI)更新为“Issued”时,-->对于每个唯一的 OrderID:

    Master1 的状态(对于相同的 OrderID)应更新为 'TypeA 发布'。

    同样,当所有TypeB在Details1中发出时, Master1.Status 应该是 'TypeB Issued' 等其他类型

    由于每个类型(在 Details1 中)的行数可能会有所不同,因此我使用 Not Issued 的计数值作为条件,因为触发器仅在计数变为 0 时才需要触发

  2. Master2.Status 仅针对 Details1 表中的所有 TypeA 状态更改(已发布)更新为 TypeA Issued。

我尝试了这个触发器,但它更新了 Master1,即使 Details1 中的 Status 值设置为 Not Issued。另外,我应该在哪里以及如何包含 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

【问题讨论】:

  • 你不应该用这些标签得到任何答案。这与 vb.net 或 n 层架构无关。我会为您更正它们,但您没有提及您使用的是哪个数据库。
  • 我已根据问题陈述重新标记它
  • @Mary,很抱歉。正在尝试将 MS SQL Server 添加为标记。

标签: sql-server tsql database-trigger


【解决方案1】:

尝试将您的条件更改为以下:

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

这是因为当有状态为“not Issues”的记录时您不应该更新

【讨论】:

  • 谢谢。因此,如果条件为真,则执行 RETURN。我应该这样解释吗?我应该如何更新 Master2?
  • 是的,你应该这样解释。你需要在同一个触发器中编写另一个条件检查来更新 master 2
  • @chlorinelemon,如果解决方案解决了您的问题,请将其标记为答案。谢谢
  • 仅供参考,Inserted 会有更新的记录
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 2020-07-15
  • 2016-11-03
  • 2021-02-26
  • 2012-02-13
相关资源
最近更新 更多