INSERTED表不检索截断后插入的值

时间:2018-04-03 00:39:06

标签: sql sql-server

我有一个触发器,如果​​值被更新/插入,它会更改表中的列值。

如果我对表执行直接UPDATE语句,则Trigger有效。 如果我运行存储过程来截断表并重新填充表(数据仓库表/ ETL),则触发器不起作用。

我不确定为什么在运行存储过程后触发器不起作用。有任何想法吗?提前谢谢你。

HERE是触发器:

CREATE TRIGGER TriggerName
    ON PlanesTable
    AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @vPlaneID INT;

    SELECT @vPlaneID = INSERTED.PlaneID
    FROM INSERTED;

    UPDATE dwPlanesDim
    SET ServiceStatus = CASE WHEN DATEDIFF(DAY, LastService,GETDATE())  <= 30 THEN 'Current' 
        ELSE 'Review Service'
        END
    WHERE @vPlaneID = PlaneID
    SET NOCOUNT OFF;
END;
GO

2 个答案:

答案 0 :(得分:2)

TRUNCATE不是更新。事实上,从技术上讲,它甚至都不是DML。 TRUNCATE的工作速度非常快,因为它没有记录任何单独的行。它只是释放表使用的磁盘空间。因此,截断后这些inserted/deleted表不可用。

此外,如果您截断表格然后填充表格,那将是插入,而不是更新。由于此触发器仅设置为在UPDATE之后触发,因此在这种情况下不会触发。

答案 1 :(得分:1)

未触发任何触发器是使用TRUNCATE的预期结果。

提取:TRUNCATE TABLE无法激活触发器,因为该操作不记录单个行删除。 https://docs.microsoft.com/en-us/sql/t-sql/statements/truncate-table-transact-sql