2017-05-01 37 views
0

我有以下觸發器,而且我需要只在一列值發生更改時才執行它,這可能嗎?如何在只有一列更改時執行觸發器

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 

問題是代碼總是執行,即使另一列變化

回答

1

這個問題可能是你在你的代碼做更新的方式。它可能會更新每個字段,而不僅僅是更改的字段。

在這種情況下,你需要檢查,看看是否有在inserted和deleted表僞值之間的差異。或者修復你的代碼,以便它只更新需要更新的內容。

1

inserteddeleted

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爲空比較primerNombre值時,where需要處理null比較爲好。

相關問題