C B*_*uer 5 email triggers bulkinsert sql-server-2008
我一直试图避免在这种特殊情况下使用光标只是因为我不喜欢权衡,而我正在使用的过程恰好使得触发器看起来像是正确的行动方案.
存储过程根据复杂的子句混合插入记录,使用插入触发器向目标用户发送电子邮件,告诉他们访问站点.这很简单,工作正常.
但是,另一个过程是每晚运行并重新分发所有未查看的记录.我这样做的方式是根据分配时的日期字段上的选择进行另一次插入.以机智:
INSERT INTO Table (ID, User, AssignDate, LastActionDate)
SELECT
ID
,User
,GETDATE() [AssignDate]
,GETDATE() [LastModifiedDate]
FROM Table2
/*snip*/
Run Code Online (Sandbox Code Playgroud)
触发器适用于单个插入,但上面的select语句仅适用于最后插入的行.有办法绕过这种行为吗?它毁了整个事情!
编辑(触发代码):
ALTER TRIGGER dbo.Notify
ON dbo.Table
AFTER INSERT
AS
BEGIN
DECLARE @EmailSender varchar(50)='Sender Profile'
DECLARE @Identity int
DECLARE @User varchar(20)
DECLARE @Subject varchar(50)
SET @Identity=@@Identity
SELECT @User=User, @Subject='(' + CONVERT(varchar,@Identity) + ')!'
FROM Table
WHERE
idNum=@Identity
exec msdb.dbo.sp_send_dbmail
@profile_name=@EmailSender,
@recipients=@User
@subject=@Subject,
@body='//etc'
END
Run Code Online (Sandbox Code Playgroud)
Jos*_*tos 11
对于批量插入,将调用insert触发器一次,但在触发器上,您可以使用特殊inserted表来获取所有插入的行.
所以,假设你有一个像这样的插入触发器,它记录插入的所有行 table
create trigger trgInsertTable
on dbo.table
for insert
as
insert tableLog(name)
select name from inserted
Run Code Online (Sandbox Code Playgroud)
使用此触发器,当您打开批量插入时table,将tableLog填充与插入的行数相同的行table
对于特定的触发器,由于需要为每一行调用存储过程,因此需要使用游标:
ALTER TRIGGER dbo.Notify
ON dbo.Table
AFTER INSERT
AS
BEGIN
DECLARE @EmailSender varchar(50)='Sender Profile'
DECLARE @User varchar(20)
DECLARE @Subject varchar(50)
DECLARE cursor CURSOR FOR
SELECT User, '(' + CONVERT(varchar, Id) + ')!'
FROM inserted
OPEN cursor
FETCH NEXT FROM cursor INTO @User, @Subject
WHILE @@FETCH_STATUS = 0
BEGIN
exec msdb.dbo.sp_send_dbmail
@profile_name=@EmailSender,
@recipients=@User
@subject=@Subject,
@body='//etc'
FETCH NEXT FROM cursor INTO @User, @Subject
END
CLOSE cursor
DEALLOCATE cursor
END
Run Code Online (Sandbox Code Playgroud)
我没有测试,但应该工作