我在Microsoft SQL Server中创建了一个更新触发器,如果日期连续更改,我会通过电子邮件发送给我。
与此类似:
IF UPDATE(ColumnName)
BEGIN
DECLARE @columnVal AS DATETIME
SELECT
@columnVal = i.columnName
FROM
inserted i JOIN deleted d on i.RowId= d.RowId;
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'me',
@recipients = 'me@company.com',
@body = 'blah blah datechange',
@body_format = 'HTML',
@subject = 'subject';
END
一段时间以来一直很好 然后我切换到批量更新,如果日期在多行上发生变化,则只发送第一行电子邮件。我试图设置一个游标来滚动更改,但我无法让它工作,类似于下面:
DECLARE @columnVal AS DATETIME
DECLARE cur CURSOR LOCAL READ_ONLY FAST_FORWARD FOR
SELECT
i.ColumnName
FROM
inserted i JOIN deleted d on i.RowId= d.RowId;
OPEN cur
FETCH NEXT FROM cur INTO @columnVal
WHILE @@FETCH_STATUS = 0
BEGIN
IF UPDATE(ColumnName)
BEGIN
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'me',
@recipients = 'me@company.com',
@body = 'blah blah datechange',
@body_format = 'HTML',
@subject = 'subject';
END
FETCH NEXT FROM cur INTO @columnVal
END
CLOSE cur
DEALLOCATE cur
有关如何完成此任务的任何想法? Update(ColumnName)函数是否可以正确嵌套在游标内(它实际上是否会告诉我该列是否已为该行更新?)
答案 0 :(得分:2)
触发器内的光标是个非常糟糕的主意。
触发器应该非常精简 - 它不应该做很多工作!我建议只是“记下”你必须发送电子邮件的人 - 但是将实际发送的电子邮件留给另外一封电子邮件。 SQL Server代理作业不属于触发器的一部分。
触发器经常被触发并经常出乎意料地被触发 - 不要将处理负担记录到它们中!尤其不是像游标一样的性能杀手!
要查找您感兴趣的行,可以使用类似的WHERE
子句:
WHERE inserted.ColumnName <> deleted.ColumnName
在UPDATE
触发器的上下文中,这意味着ColumnName
的新值与旧值不同 - &gt;此列已更新。