2012-02-07 154 views
0

我對SQL Server(2008 R2)中的觸發器有點新,而且我遇到了一個小問題。我有一個如下表(一些領域已爲簡潔起見省略了):SQL觸發器的問題

CREATE TABLE [dbo].[Task] (
    [TK_ID] [int] IDENTITY(1,1) NOT NULL, 
    [TK_DateModified] [datetime] NULL, 
    [TK_ModifiedBy] [int] NULL, 
    [TK_DateCreated] [datetime] NULL, 
    [TK_CreatedBy] [int] NULL, 
    [TK_AssignedTo] [int] NULL) 

我總共3個觸發器添加到表中:

觸發1是在記錄創建(插入),並將其設置創建日期和創建記錄的用戶。

觸發器2在記錄更新上,它設置修改日期和修改記錄的用戶。

觸發器3處於記錄插入/更新狀態,並設置爲向由TK_AssignedTo字段指定的用戶發送電子郵件。

當我嘗試做記錄插入時,它發送多個電子郵件給用戶。我最終得到了一封創建郵件和兩封更新郵件。我希望插入命中觸發器1並從插入器中觸發3,但我認爲觸發器1中'創建'字段的更新第二次觸發觸發器3,並且由於觸發器1導致字段更新,它觸發觸發器2 ,它會進行另一次更新並再次觸發觸發器3。我試圖將數據庫中的遞歸觸發器關閉,以防止發生這種情況,但我認爲這並沒有達到預期的效果,並且我嘗試在觸發器3中進行更改,以防止在「創建」和「修改」字段發送電子郵件時被解僱。這是目前觸發器3的代碼框架。

ALTER TRIGGER [dbo].[trig_Task_SendEmail] ON [dbo].[Task] FOR INSERT,UPDATE AS 
IF (NOT UPDATE(TK_DateCreated)) AND (NOT UPDATE(TK_CreatedBy)) AND (NOT UPDATE(TK_DateModified)) AND (NOT UPDATE(TK_ModifiedBy)) 
BEGIN 
    -- Coding to send email to user on changed tasks 
END 

在這種形式下,即使在插入時,發送電子郵件的代碼也不會運行。我認爲UPDATE(field)函數不能像我希望的那樣工作。有沒有辦法禁止更新這4個領域發射另一個更新觸發器或其他可行的選項,只有觸發器1和3觸發插入和觸發2和3觸發更新?

... 
[TK_DateCreated] [datetime] DEFAULT GETDATE(), 
[TK_CreatedBy] [int] DEFAULT SUSER_SID() 
... 

我嘲笑了兩個觸發器(在UPDATE觸發和電子郵件觸發):如果您爲列創建默認值

+0

當你插入一條記錄時,基本上它會創建一個魔術表並從那裏你可以控制,你是否嘗試了通過魔術表 – 2012-02-07 04:15:46

+0

我能夠做一些小的改變並使它正常工作。感謝提示 – Brandon 2012-02-07 16:14:52

+0

根據我的回答,如果你真的只是在'TK_AssignedTo'被插入/更新時發送通知郵件,你可能只想說'IF UPDATE(TK_AssignedTo)'而不是處理所有那些......不更新......條件。但我可能在那裏做出了一個無效的假設。 – LiquidPony 2012-02-07 17:30:31

回答

1

你的第一個觸發器可以去除

CREATE TRIGGER [dbo].[tgUpdatedRecord] 
ON [dbo].[Task] FOR UPDATE 
AS 
    BEGIN 
     UPDATE t 
     SET t.TK_DateModified = GETDATE(), 
      t.TK_ModifiedBy = SUSER_SID() 
     FROM [dbo].[Task] t 
     JOIN [inserted] i 
      ON t.[TK_ID] = i.[TK_ID] 
    END 
GO 

.. 。和...

CREATE TRIGGER [dbo].[trig_Task_SendEmail] 
ON [dbo].[Task] FOR INSERT, UPDATE 
AS 
    IF UPDATE(TK_AssignedTo) BEGIN 
     PRINT 'Is this an email?' 
    END 
GO 

這似乎是做你的期望。