2017-05-01 10 views
0

以下のトリガがありますが、1つのカラム値が変更されたときにのみ実行する必要がありますか?1つのカラムだけが変更された場合のトリガの実行方法

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

を変更しても常に実行されている問題は、おそらくあなたのコードで更新を行っている方法です。変更されたフィールドだけでなく、すべてのフィールドを更新している可能性があります。

この場合、挿入された疑似テーブルと削除された疑似テーブルの値に差異があるかどうかを確認する必要があります。または、更新が必要なものだけが更新されるようにコードを修正してください。

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がNULL可能である場合からprimerNombreの値を比較すると、whereは同様null比較を処理する必要があります。

関連する問題