登录触发器执行规则

本主题将讨论有关指定登录触发器的激发顺序和管理登录触发器内部事务的原则。

指定第一个和最后一个触发器

可以对 LOGON 事件定义多个触发器。通过使用 sp_settriggerorder 系统存储过程,可以将这些触发器中的任何一个指定为针对某事件激发的第一个或最后一个触发器。SQL Server 不保证其余触发器的执行顺序。有关详细信息,请参阅设计和实现结构化存储(数据库引擎)

管理事务

SQL Server 激发登录触发器之前,SQL Server 会创建独立于任何用户事务的隐式事务。因此,第一个登录触发器开始激发时,事务计数为 1。所有登录触发器完成执行后,将提交事务。与其他类型的触发器一样,如果登录触发器完成执行后事务计数为 0,SQL Server 将返回错误。ROLLBACK TRANSACTION 语句将事务计数重置为 0,即使该语句在嵌套事务中执行也会如此。COMMIT TRANSACTION 可能会将事务计数减少到 0。因此,建议不要在登录触发器中执行 COMMIT TRANSACTION 语句。

如果要在登录触发器中使用 ROLLBACK TRANSACTION 语句,请注意以下事项:

  • 将回滚对 ROLLBACK TRANSACTION 点所做的任何数据修改。这些修改包括当前触发器所做的修改以及对同一事件执行的先前触发器所做的修改。此特定事件的任何其余触发器将不会执行。

  • 当前触发器继续执行显示在 ROLLBACK 语句之后的所有剩余语句。如果这些语句中的任意语句修改数据,则不回滚这些修改。

如果在针对 LOGON 事件执行触发器的过程中满足下列任何一个条件,将不会建立用户会话:

  • 原始隐式事务回滚或失败。

  • 触发器正文中出现严重级别大于 20 的错误。