SQL Server 中 CONTEXT_INFO 的作用范围是什么?

26
我正在使用CONTEXT_INFO将用户名传递给删除触发器,以便记录到审计/历史表中。我试图了解CONTEXT_INFO的范围,以及是否会创建潜在的竞态条件。
我的每个数据库表都有一个存储过程来处理删除。删除存储过程将userId作为参数,并将CONTEXT_INFO设置为userId。然后,我的删除触发器获取CONTEXT_INFO并使用它来更新指示谁删除了行的审计表。
问题是,如果两个不同用户的删除存储过程同时执行,其中一个存储过程中设置的CONTEXT_INFO是否会被另一个存储过程触发的触发器消耗?
我看过这篇文章http://msdn.microsoft.com/en-us/library/ms189252.aspx,但我不清楚SQL Server中会话和批处理的范围,这对于这篇文章的帮助至关重要!
我想发布代码,但目前时间紧迫。如果这不够清晰,我稍后会进行编辑。
非常感谢您的帮助。
2个回答

34

Context info没有作用域(在语言变量作用域的意义上),并且绑定到会话生命周期。一旦设置,context info保持设置的值直到连接关闭(会话终止)或设置新值为止。由于在会话上执行始终是顺序的,不存在并发问题。

如果您在过程中设置context info,则随后在该会话上执行的任何触发器都将看到新设置的context info值。将用户id值设置为context info,并在触发器中使用它是context info使用的典型示例,并且在并发方面非常安全,因为基本上没有并发问题需要考虑。如果您计划在存储过程中设置context info,然后在由该过程中的删除触发的触发器中依赖它,则您的批处理尚未完成,因此根据您链接的文章,您可以从sys.dm_exec_requests DMV或CONTEXT_INFO()函数中检索conetxt info。它将还没有推入sys.dm_exec_sessions中,这只能在退出存储过程并完成发送到服务器的任何其他T-SQL批处理调用(即“请求”)之后才能发生。


6
我曾在一家客户现场使用过这个确切的审核方法,他们已经使用了近6个月,并没有出现问题。
上下文信息是针对当前连接和任何在当前批处理完成后启动的批处理进行范围限制的。您环境中的两个用户要么不在同一个连接上,要么如果存在连接共享,则如果它们重叠,则它们仍将拥有自己的值。如果一个用户在另一个用户之后,则第二个用户会覆盖第一个用户,但无论如何,第一个用户的操作已经完成了。至少这是我了解它如何工作的方式。您可以查找有关MARS(多活动结果集)的更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接