记录中更改的列值的 MSSQL 触发器

盖勒

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

语境:

我有2个MSSQL表,门票(TicketNumber为PrimaryKey的,状态INT等)和行动(ID作为PrimaryKey的,IdTicket为ForeignKey的,状态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;
佐哈尔·佩莱德

下面是我将如何写这个:

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表中的数据将已经反映触发触发器的语句的结果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章