SQL触发器的麻烦

时间:2012-02-07 04:08:17

标签: tsql triggers

我对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触发更新?

1 个答案:

答案 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

这似乎符合您的期望。

相关问题