开发者社区> 问答> 正文

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

我是T-SQL触发器领域的新手,并且希望对此有所帮助。

内容:

我有2个MSSQL表,票证(TicketNumber作为PrimaryKey,Status int等)和操作(Id作为PrimaryKey,IdTicket作为ForeignKey,Status int等)。

一张票可以有多个动作。

当用户将解决方案的状态更新为“关闭”(New.Status = 0 <> Old.Status)时, 必须触发该触发器,并使用相同的IDTicket检查所有解决方案的状态。 如果所有操作均已关闭, 然后触发器将关闭票证。 您知道我应该如何实现吗?

我已经开始编写触发器了,但是对于如何以及何时对触发器说来触发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;

展开
收起
祖安文状元 2020-01-05 18:02:42 415 0
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表包含了所有来自受影响的记录delete或update触发触发器,那里没有留下记录,如果该语句actions表,其中status不是0-由于这是一个触发器,因此actions表中的数据已经反映了触发该触发器的语句的结果。

    2020-01-05 18:02:55
    赞同 展开评论 打赏
问答分类:
Go
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载