2014-02-24 168 views
1

我需要在表上創建更新觸發器,如果​​某些插入值存在,它也會更新表。這可能嗎?我已經嘗試過,當插入的值存在並觸發觸發器時,觸發器會進行更新並再次觸發。最終 - 僵局。有沒有辦法完成這個安全?SQL Server 2008更新觸發器

驗證碼:

CREATE TRIGGER dbo.trg_updateaddress on dbo.Customers 
    AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @original_source varchar(50) 
    SELECT @original_source = address_source FROM deleted 

    IF EXISTS (SELECT * FROM inserted i 
       INNER JOIN deleted d 
        ON i.cust_id = d.cust_id 
       WHERE i.address_source IS NOT NULL 
       AND (i.[address] <> d.[address] 
       OR i.address2 <> d.address2 
       OR i.city <> d.city 
       OR i.[state] <> d.[state] 
       OR i.zip <> d.zip 
       OR i.country <> d.country 
       OR i.phone <> d.phone 
       OR i.cell <> d.cell 
       OR i.email <> d.email)) 
    BEGIN 
     UPDATE customers 
     SET address_changed = GETDATE() 
    END 
    ELSE 
    BEGIN 
     UPDATE customers 
     SET address_source = @original_source 
    END 
END 
+0

你能顯示你的觸發代碼? –

+0

上面貼的代碼 –

+0

你是否希望遞歸觸發觸發器,或者這是不必要的? – RBarryYoung

回答

1

一件事,你所能做的就是在你的數據庫來禁用觸發器遞歸:

USE [master] 
GO 
ALTER DATABASE [yourDbName] SET RECURSIVE_TRIGGERS OFF WITH NO_WAIT 
GO 

這將防止數據庫中的所有觸發器直接觸發自己,而仍然允許他們觸發其他觸發器。

無論如何,我通常會推薦這個設置,因爲遞歸觸發器通常不是您想要的,而且是非常專業化的行爲。

+0

這在我的環境中會很嚇人,因爲在這個數據庫中有很多觸發器,這有可能會破壞其他觸發器代碼。 –

1

可以防止觸發器與NESTED_LEVEL

本身射擊SET NOCOUNT ON後,將這個;

IF trigger_nestlevel() < 2 

這將防止觸發器觸發它自己的更新。

注:TRIGGER_NESTLEVEL從1開始的第一個更新計數,所以如果你想觸發只火一次,然後將其設置爲2,如果你想它開火兩次,然後將其設置爲3

+0

+1:這可能是OP更好的答案。 – RBarryYoung