我想创建一个触发器,该触发器可以在FREE03上插入后将新数据集插入到FREE08表中(请参见示例代码)。这部分有效。但是我也想仅在更新FREE03的特定列(FK2)时才将新数据集插入FREE08。认为这可以与触发器中的“ IF UPDATE(FK2)语句一起使用”。 发生什么情况是,每次我在FREE03中进行任何更新时,我都会在FREE08中获得一个新的数据集。 我该怎么办?
感谢您的支持
USE [DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[Einsatzhistorie Wechsler]
ON [dbo].[FREE03]
AFTER INSERT,UPDATE
AS
SET NOCOUNT ON;
IF UPDATE(FK2)
BEGIN
INSERT INTO FREE08
(
FK1,FK2,TEXT3,DATE1,TEXT2,DATE4
)
Select FK2,FK1,ID,DATE1,TEXT1,DATE11 From inserted
end
答案 0 :(得分:0)
我从未发现UPDATE
函数的真正用途,因为它告诉您某列是否受UPDATE
的影响(即出现在{{1 }}子句),而不是数据是否实际更改。另外,当然,触发器会每条语句触发一次,而不是每行触发一次,因此您的触发器可能正在处理混合的行,其中某些更改了其SET
,而有些则没有
通常最好使用FK2
并比较先前/当前的值:
deleted
在这里,我假设a)CREATE TRIGGER [dbo].[Einsatzhistorie Wechsler]
ON [dbo].[FREE03]
AFTER INSERT,UPDATE
AS
SET NOCOUNT ON;
INSERT INTO FREE08
(
FK1,FK2,TEXT3,DATE1,TEXT2,DATE4
)
Select i.FK2,i.FK1,i.ID,i.DATE1,i.TEXT1,i.DATE11
From inserted i
left join deleted d
on
i.ID = d.ID and
i.FK2 = d.FK2
where d.ID is null
代表表的不可变主键,b)ID
不可为空。