【问题标题】:MSSQL Triggers for a column value changed in a record记录中更改的列值的 MSSQL 触发器
【发布时间】:2019-12-11 05:56:12
【问题描述】:

我是 T-SQL 触发器领域的新手,我想帮助解决这个问题。

上下文:

我有 2 个 MSSQL 表,Tickets(TicketNumber 作为 PrimaryKey,Status int 等)和 Actions(Id 作为 PrimaryKey,IdTicket 作为 ForeignKey,Status int等...)。

一张票可以有多个动作。

  1. 当用户将解决方案的状态更新为“关闭”(New.Status=0 Old.Status)时,
  2. 必须触发触发器并检查具有相同 IdTicket 的所有解决方案的状态。
  3. 如果所有操作都已关闭,
  4. 然后触发器关闭工单。

你知道我应该如何实现吗?

我已经开始编写我的触发器,但是对于如何以及何时告诉触发器触发 UPDATE Tickets 查询有些困惑。

USE [DataBaseName] 
GO 
CREATE TRIGGER [dbo].[TriggerClosureAction] 
ON [dbo].[Actions] 
AFTER UPDATE,DELETE 
IF (UPDATE(Status)) 
  BEGIN 
    IF (INSERTED.Status<>DELETED.Status AND INSERTED.Status=0) --Here do the If 
    Exists(SELECT Status FROM [dbo].[Actions] WHERE IdTicket=IdTicket 
  END; 
END;

【问题讨论】:

  • 在 TSQL 中检查您是否处于更新状态的方法是使用创建的两个虚拟表(仅在触发器中可用)“插入”和“删除”。检查更新是否导致触发器触发的方法是检查两个表是否都有行 - 这表明您正在更新。这是检查更新的更好、更清晰的方法。
  • @Gaelle Status 是否只有 01
  • 嗨@benjaminmoskovits!是的,我看到我可以使用插入和删除,但只是为了检查更新,我看到我可以使用返回布尔值的 Update(column_name)。我在这一切的形式上更加挣扎。我是否应该使用两个 Select count(*) 查询来获取链接到同一个 Ticket 的整个 Actions 和关闭的 Actions 之间的差异(这个想法是如果我在这两个 Select Count 之间有 0,那么我更新所说的 Ticket)?如果是,我是否必须将其包装在 IF EXISTS 中?表现如何?我对此真的很陌生
  • @Sami 是的,状态只有 0 或 1。0 表示“关闭”,1 表示“打开”
  • 你试过UPDATE Tickets SET Tickets.Status = ( SELECT CASE WHEN SUM(A.Status) &gt; 0 THEN 1 ELSE 0 END V FROM Actions A WHERE A.TicketId = Tickets.TicketId );吗? Fiddle 顺便说一句,我会使用 BIT 数据类型而不是 INT 作为状态列

标签: sql-server tsql triggers sql-update


【解决方案1】:

我会这样写:

CREATE TRIGGER [dbo].[TriggerClosureAction] 
ON [dbo].[Actions] 
AFTER UPDATE,DELETE 
AS

    UPDATE t
    SET [Status] = 0
    FROM dbo.Tickets As t
    -- update only records effected from the current operation
    INNER JOIN DELETED As d
        ON t.TicketNumber = d.IdTicket 

    -- No records left for that ticket number with status 1 in the actions table
    WHERE NOT EXISTS
    (
        SELECT 1
        FROM Actions As A
        WHERE A.IdTicket = t.TicketNumber
        AND A.[Status] <> 0
    )

使用deleted 表的连接更新票证表,以确保仅更新相关记录 - 因为deleted 表包含由触发触发器的deleteupdate 语句影响的所有记录,如果actions 表中没有记录,而status 不是0 - 因为这是一个后触发器,actions 表中的数据已经反映了触发触发。

【讨论】:

  • 感谢@Zohar Peled,一周前我找到了这个解决方案(和你的很像),但是 PowerApps API 无法更新有触发器的表(是的,我没有t 精确,但我正在使用 PowerApps 和本地 SQL Server)。所以我忘了在这里发帖。但是,谢谢,我认为您的解决方案可能对遇到此问题的任何人都有很大帮助。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 2021-03-27
  • 1970-01-01
相关资源
最近更新 更多