如何只有一列更改时如何执行触发器

时间:2017-05-01 17:01:18

标签: sql sql-server

我有以下触发器,我需要它只在一个列值发生变化时执行,这可能吗?

  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

问题是即使另一列发生变化,代码也会一直执行

2 个答案:

答案 0 :(得分:1)

问题可能在于您在代码中进行更新。它可能正在更新每个字段,而不仅仅是更改的字段。

在这种情况下,您需要检查插入和删除的伪表中的值之间是否存在差异。或修复您的代码,以便它只更新需要更新的内容。

答案 1 :(得分:1)

比较primerNombreinserted表中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比较。