1

我需要为包含数百万个插入的表创建一个触发器。

该触发器将向我发送一封电子邮件(已经完成),说该表正在通电。

该电子邮件应在插入开始时仅发送一次(每天一封)。

换句话说,我想这样做:

Create trigger on table T1 on FIRST INSERT; EXEC my procedure to send email

作为一个开发者,我真的不知道如何写这个......

谢谢你的帮助。

4

3 回答 3

1

你不能轻易地ON FIRST INSERT触发。

你可以做的是:

  • 创建一个ON INSERT向您发送电子邮件的正常触发器
  • 在该触发器结束时,禁用该触发器:

    ALTER TABLE dbo.YourTable DISABLE TRIGGER YourTriggerNameHere
    

这将防止触发器一遍又一遍地触发并向您发送大量电子邮件。

然后,您还需要一个 SQL 代理作业,该作业将在晚上再次启用该触发器 - 以便它可以在第二天的第一次插入时再次触发。

更新:好的,所以在你的情况下,它将是:

CREATE TRIGGER sendMail 
ON MyTable AFTER INSERT 
AS 
    EXEC master.dbo.MyProcedure 

    ALTER TABLE dbo.MyTable DISABLE TRIGGER sendMail

在晚上的 SQL 代理工作中,您需要:

ALTER TABLE dbo.MyTable ENABLE TRIGGER sendMail
于 2013-02-15T16:05:26.763 回答
1

为什么不在触发器中使用上次发送电子邮件的时间更新表格?然后您可以在触发器中查询此表并决定是否要发送另一个

create trigger tr
on tab after insert
as
begin
    declare @today datetime;
    set @today = cast(convert(varchar(32), getdate(), 112) as datetime);

    if not exists(select * from logtab where logdate = @today)
    begin
        -- Send the email
        exec sendMail

        -- Update Log Table
        update logtab
            set logdate = @today
    end
end
GO
于 2013-02-15T17:24:48.817 回答
0

您不能在第一次更新时直接触发触发器。

但是,您可以有一个表记录您发送电子邮件时的日志以及哪个表,并且在触发器中您可以询问当天是否有记录不发送,如果没有,则插入该表并调用您的 sp。

你的 sp 也可以做这个检查。

于 2013-02-15T15:59:28.353 回答