【发布时间】:2012-02-06 21:32:56
【问题描述】:
我有以下 INSTEAD OF DELETE 触发器,它会在回滚任何删除尝试时发送一封电子邮件。
ALTER TRIGGER tr_OnDel_Orders
ON ORDERS
INSTEAD OF DELETE
AS
BEGIN
SET NOCOUNT ON;
declare @b varchar(5000)
Declare @OrderID BIGINT,
SELECT @OrderID = OrderID
FROM deleted d
set @b = 'Someone attempted to delete the following order:' + CHAR(10);
set @b = @b + ' OrderID: ' + cast(@OrderID as varchar(30)) + CHAR(10);
set @b = @b + ' UserID: ' + SYSTEM_USER
RAISERROR('Cannot delete order', 16, 1)
ROLLBACK TRAN
EXEC msdb.dbo.sp_send_dbmail @recipients = 'myemail@mycompany.com',
@body = @b,
@subject = 'Attempt to Delete an order'
RETURN
END
GO
当我尝试从 ORDERS 表中删除订单时,此方法有效。但是,我不明白为什么,这个触发器会定期发送带有空正文的电子邮件。据我所知,没有明显的尝试删除订单。还有什么可能导致这样的空白电子邮件?
【问题讨论】:
-
此触发器不适用于行集,你知道吗?另外,
orders有带有删除级联选项的外键吗? -
也许它会在某人执行
delete orders where 1=0时触发,而@OrderID最终会变成null。我想那也会使@b为空。 -
只有一种方法可以找到:SQL Profiler。
-
您可以设置扩展事件跟踪以在触发器触发时捕获 TSQL 调用堆栈Example code here
标签: sql-server-2008 tsql triggers