我有一个触发器,如果值被更新/插入,它会更改表中的列值。
如果我对表执行直接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
答案 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