如何避免DDL的悖论触发通知丢弃的触发器

时间:2016-10-31 14:25:45

标签: sql-server tsql triggers sql-server-2014

这更像是一个哲学问题,而不是一个程序问题。我的任务是为MS SQL 2014服务器实现各种各样的安全增强功能。我有一个简单的触发器如下....

CREATE TRIGGER send_db_email_notification 
ON ALL SERVER 
AFTER   CREATE_DATABASE, 
        ALTER_DATABASE, 
        DROP_DATABASE, 
        CREATE_FUNCTION, 
        ALTER_FUNCTION,
        CREATE_TRIGGER,
        ALTER_TRIGGER,
        DROP_TRIGGER
AS 
-- do stuff to send mail
ENABLE TRIGGER send_db_email_notification ON ALL SERVER

触发器按预期工作。当其中一个事件被触发时,我会收到一封电子邮件。好吧,无论何时创建,更改或删除数据库,或创建或更改功能,它都会执行。问题是drop_trigger事件。

如果有人进入并删除了相同的触发器,则它无法执行自身以通知它已被删除,因为它已不存在。换句话说,触发器不能发出自己的删除信号。至少这是我认为正在发生的事情。

测试触发器删除测试的触发器本身是否已被删除的最佳方法是什么?我真的应该创建第二个触发器来测试触发删除,这样如果任何一个被删除,另一个仍然可以触发吗?这似乎相当尴尬和笨重,更不用说如果删除其他一些触发器,我会得到两个通知,除非我编写第二个触发器专门只查找第一个删除。

有没有更优雅的方式来处理这种情况?

0 个答案:

没有答案