2016-07-20 4 views
0

Gibt es eine Möglichkeit, einen Trigger zu erstellen, der die Tabelle nur aktualisiert, wenn die tatsächlichen Daten geändert wurden?Aktualisierung einer Tabelle nur auslösen, wenn der Wert tatsächlich geändert wurde

Unten sehen Sie meinen Trigger, der ausgelöst wird, wenn idu_id oder manager_id aktualisiert wird. Wenn Sie jedoch erzwingen, dass die Änderung wie 1 in 1 geändert wird, wird sie dennoch ausgelöst, obwohl die aktualisierte Tabelle unverändert bleibt.

ALTER TRIGGER [dbo].[TRG_UpdatePersonal] 
    ON [dbo].[HC_EMP] 
    FOR UPDATE AS IF (UPDATE([manager_id]) OR UPDATE([idu_id])) 

    DECLARE @user_login VARCHAR(50) 
    DECLARE @Action varchar (10) 
    SELECT @user_login = dbo.udf_GetUserLogin() 

BEGIN 
IF UPDATE (idu_id) 
Insert into [dbo].[HC_HISTORY] 
(

    [EmpID] 
    ,[ACTIONDATE] 
    ,[TYPEID] 
    ,[MESSAGE] 
    ,[InitiatorID] 
    ,[OldIdu] 
    ,[NewIdu] 
) 
select 

    d.[company_id] 
    ,GETUTCDATE() 
    ,3 
    ,'Some Data' 
    ,@user_login 
    ,d.idu_id 
    ,i.idu_id 
from Deleted d join INSERTED i on d.company_id = i.company_id 

IF UPDATE (manager_id) 
Insert into [dbo].[HC_HISTORY] 
( 
    [EmpID] 
    ,[ACTIONDATE] 
    ,[TYPEID] 
    ,[MESSAGE] 
    ,[InitiatorID] 
    ,[OldManagerId] 
    ,[NewManagerId] 
) 
select 

    d.[company_id] 
    ,GETUTCDATE() 
    ,4 
    ,'Some Other Data' 
    ,@user_login 
    ,d.manager_id 
    ,i.manager_id 
from Deleted d join INSERTED i on d.company_id = i.company_id 
END 

Antwort

1

Fügen Sie einen Filter in Ihre WHERE-Klausel ein. Versuchen Sie einfach so,

ALTER TRIGGER [dbo].[TRG_UpdatePersonal] ON [dbo].[HC_EMP] 
FOR UPDATE 
AS 
IF (
     UPDATE ([manager_id]) 
      OR 
     UPDATE ([idu_id]) 
     ) 
    DECLARE @user_login VARCHAR(50) 
DECLARE @Action VARCHAR(10) 

SELECT @user_login = dbo.udf_GetUserLogin() 

BEGIN 
    INSERT INTO [dbo].[HC_HISTORY] (
     [EmpID] 
     ,[ACTIONDATE] 
     ,[TYPEID] 
     ,[MESSAGE] 
     ,[InitiatorID] 
     ,[OldIdu] 
     ,[NewIdu] 
     ) 
    SELECT d.[company_id] 
     ,GETUTCDATE() 
     ,3 
     ,'Some Data' 
     ,@user_login 
     ,d.idu_id 
     ,i.idu_id 
    FROM Deleted d 
    JOIN INSERTED i ON d.company_id = i.company_id 
    WHERE d.idu_id <> i.idu_id 

    INSERT INTO [dbo].[HC_HISTORY] (
     [EmpID] 
     ,[ACTIONDATE] 
     ,[TYPEID] 
     ,[MESSAGE] 
     ,[InitiatorID] 
     ,[OldManagerId] 
     ,[NewManagerId] 
     ) 
    SELECT d.[company_id] 
     ,GETUTCDATE() 
     ,4 
     ,'Some Other Data' 
     ,@user_login 
     ,d.manager_id 
     ,i.manager_id 
    FROM Deleted d 
    JOIN INSERTED i ON d.company_id = i.company_id 
    WHERE d.manager_id <> i.manager_id 
END 
+0

Das scheint den Trick zu tun. Vielen Dank –

Verwandte Themen