【发布时间】:2019-12-11 05:56:12
【问题描述】:
我是 T-SQL 触发器领域的新手,我想帮助解决这个问题。
上下文:
我有 2 个 MSSQL 表,Tickets(TicketNumber 作为 PrimaryKey,Status int 等)和 Actions(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;
【问题讨论】:
-
在 TSQL 中检查您是否处于更新状态的方法是使用创建的两个虚拟表(仅在触发器中可用)“插入”和“删除”。检查更新是否导致触发器触发的方法是检查两个表是否都有行 - 这表明您正在更新。这是检查更新的更好、更清晰的方法。
-
@Gaelle
Status是否只有0或1? -
嗨@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) > 0 THEN 1 ELSE 0 END V FROM Actions A WHERE A.TicketId = Tickets.TicketId );吗? Fiddle 顺便说一句,我会使用BIT数据类型而不是INT作为状态列
标签: sql-server tsql triggers sql-update