You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:52:38