我需要为包含数百万个插入的表创建一个触发器。
该触发器将向我发送一封电子邮件(已经完成),说该表正在通电。
该电子邮件应在插入开始时仅发送一次(每天一封)。
换句话说,我想这样做:
Create trigger on table T1 on FIRST INSERT; EXEC my procedure to send email
作为一个开发者,我真的不知道如何写这个......
谢谢你的帮助。
我需要为包含数百万个插入的表创建一个触发器。
该触发器将向我发送一封电子邮件(已经完成),说该表正在通电。
该电子邮件应在插入开始时仅发送一次(每天一封)。
换句话说,我想这样做:
Create trigger on table T1 on FIRST INSERT; EXEC my procedure to send email
作为一个开发者,我真的不知道如何写这个......
谢谢你的帮助。
你不能轻易地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
为什么不在触发器中使用上次发送电子邮件的时间更新表格?然后您可以在触发器中查询此表并决定是否要发送另一个
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
您不能在第一次更新时直接触发触发器。
但是,您可以有一个表记录您发送电子邮件时的日志以及哪个表,并且在触发器中您可以询问当天是否有记录不发送,如果没有,则插入该表并调用您的 sp。
你的 sp 也可以做这个检查。