我有两张桌子:dbo.old_roles
和dbo.new_roles
。我需要在两者之间同步。
在一个表中创建或修改角色时,它应该更新另一个表。为此,我在每个表中创建了一个触发器。
为了防止循环,我想在另一个表中触发触发器时禁用一个表中的触发器。
当我调用ALTER TRIGGER
语句时,我得到一个错误。
我能做些什么?
我有两张桌子:dbo.old_roles
和dbo.new_roles
。我需要在两者之间同步。
在一个表中创建或修改角色时,它应该更新另一个表。为此,我在每个表中创建了一个触发器。
为了防止循环,我想在另一个表中触发触发器时禁用一个表中的触发器。
当我调用ALTER TRIGGER
语句时,我得到一个错误。
我能做些什么?
你有三个选择:
使用 禁用“嵌套触发器”
sp_configure
。这是一个服务器/实例级别的选项,因此它可能会禁用您可能有触发器调用其他触发器的其他区域的功能。但至少应该提到它。您可以使用以下命令查看当前设置:您可以使用以下命令禁用此功能:
您可以在此处阅读有关此设置的更多信息:配置嵌套触发器服务器配置选项。
让每个触发器使用TRIGGER_NESTLEVEL函数检测它们的深度。如果它不是堆栈中的第一个或第二个触发器执行,则在每个触发器的开头使用它来简单地退出。类似于以下内容:
这将需要进行一些测试,以了解它如何受到另一个触发器完成的初始插入的影响(以防万一成为问题,但可能不会)。如果在被另一个触发器调用时它没有按预期工作,那么尝试设置一些参数给这个函数。有关详细信息,请参阅文档(上面链接)。
使用SET CONTEXT_INFO在基于会话的“上下文信息”中设置一个标志。上下文信息是
VARBINARY(128)
存在于会话级别的值,并在被覆盖或会话结束之前保持其值。可以通过使用CONTEXT_INFO函数或context_info
从以下任一 DMV 中选择列来检索该值:sys.dm_exec_requests和sys.dm_exec_sessions。您可以在每个触发器的开头放置以下内容:
如果您出于其他原因已经在使用上下文信息,则此选项效果不佳。但是,任何使用 SQL Server 2016 的人都可以使用SESSION_CONTEXT,这是一组新的基于会话的键值对。