我对SQL Server(2008 R2)中的触发器有点新意,我遇到了一个小问题。我有一个下表(为简洁起见,省略了一些字段):
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字段指定的用户发送电子邮件。
当我尝试进行记录插入时,它会向用户发送多封电子邮件。我最终收到了创建电子邮件和2封更新电子邮件。我希望插入触发插入触发器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(字段)函数不能像我希望的那样工作。有没有办法禁止更新这4个字段,从触发另一个更新触发器或其他一些可行的选项,只有触发器1和3触发插入,触发器2和3触发更新?
答案 0 :(得分:1)
如果为列创建默认值,则可以删除第一个触发器:
...
[TK_DateCreated] [datetime] DEFAULT GETDATE(),
[TK_CreatedBy] [int] DEFAULT SUSER_SID()
...
我模拟了两个触发器(UPDATE
触发器和电子邮件触发器):
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
这似乎符合您的期望。