我有以下触发器,我需要它只在一个列值发生变化时执行,这可能吗?
ALTER TRIGGER [dbo].[TR_HISTORICO]
ON [dbo].[Tbl_Contactos]
AFTER UPDATE
AS
BEGIN
IF UPDATE (primerNombre) -- sólo si actualiza PRIMER NOMBRE
BEGIN
INSERT INTO [dbo].[Tbl_Historico] ([fecha],[idUsuario],[valorNuevo], [idContacto],[tipoHistorico] )
SELECT getdate(), 1, [dbo].[Encrypt]([dbo].[Decrypt](primerNombre)), [idContacto], 1
FROM INSERTED
END
END
问题是即使另一列发生变化,代码也会一直执行
答案 0 :(得分:1)
问题可能在于您在代码中进行更新。它可能正在更新每个字段,而不仅仅是更改的字段。
在这种情况下,您需要检查插入和删除的伪表中的值之间是否存在差异。或修复您的代码,以便它只更新需要更新的内容。
答案 1 :(得分:1)
比较primerNombre
和inserted
表中deleted
的值
ALTER TRIGGER [dbo].[TR_HISTORICO] ON [dbo].[Tbl_Contactos]
AFTER UPDATE AS
BEGIN
INSERT INTO [dbo].[Tbl_Historico] ([fecha],[idUsuario],[valorNuevo], [idContacto],[tipoHistorico] )
SELECT getdate(), 1, [dbo].[Encrypt]([dbo].[Decrypt](i.primerNombre)), i.[idContacto], 1
FROM INSERTED i
inner join deleted d
on i.idContacto = d.idContacto
where i.primerNombre <> d.primerNombre
END
如果primerNombre
可以为空,则where
也需要处理null
比较。