我對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
觸發和電子郵件觸發):如果您爲列創建默認值
當你插入一條記錄時,基本上它會創建一個魔術表並從那裏你可以控制,你是否嘗試了通過魔術表 – 2012-02-07 04:15:46
我能夠做一些小的改變並使它正常工作。感謝提示 – Brandon 2012-02-07 16:14:52
根據我的回答,如果你真的只是在'TK_AssignedTo'被插入/更新時發送通知郵件,你可能只想說'IF UPDATE(TK_AssignedTo)'而不是處理所有那些......不更新......條件。但我可能在那裏做出了一個無效的假設。 – LiquidPony 2012-02-07 17:30:31