如何让STATUS列的UPDATE触发器仅在值变为3、4、6时触发?
解决方案
你需要扩展现有的触发规则,在原有的UPDATE(STATUS)判断基础上,添加对新状态值的校验,确保仅当STATUS更新为3、4或6时才执行后续逻辑。以下是修改后的完整触发器代码:
USE [TEST] GO /****** Object: Trigger [dbo].[PROJECT_StatusUpdate] Script Date: 27-9-2023 16:47:33 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER TRIGGER [dbo].[PROJECT_StatusUpdate] ON [dbo].[PROJECT] AFTER UPDATE AS -- 修改触发条件:仅当STATUS列被更新,且新状态为3、4、6,同时新旧状态不同时触发 IF (UPDATE(STATUS) AND EXISTS( SELECT 1 FROM inserted i JOIN deleted d ON i.OBJECTID = d.OBJECTID WHERE i.STATUS IN (3, 4, 6) AND i.STATUS != d.STATUS ) ) BEGIN SET NOCOUNT ON; INSERT [IT].[dbo].[ProjectStatusLog] (ProjectNO, OldStatus, NewStatus, DateChanged) SELECT d.PROJECTNO, d.STATUS, i.STATUS, GETDATE() FROM inserted i JOIN deleted d ON d.OBJECTID = i.OBJECTID WHERE i.STATUS IN (3, 4, 6) -- 再次过滤,确保只插入符合条件的日志 AND i.STATUS != d.STATUS; END;
关键修改说明:
- 触发条件增强:在原
UPDATE(STATUS)基础上,通过EXISTS子句检查是否存在更新后状态为3、4、6且新旧状态不同的行,避免无意义的触发(比如STATUS从3更新为3的情况)。 - 插入逻辑过滤:在
INSERT的SELECT语句中添加同样的过滤条件,确保只有符合要求的状态变更才会被记录到日志表中,避免插入无效数据。 - 调整JOIN类型:将原
FULL JOIN改为JOIN(内连接),因为只有更新操作才会同时存在inserted和deleted中的行,内连接更符合触发器的场景。
内容的提问来源于stack exchange,提问作者Knuppel
相关产品推荐
相关产品推荐

