我正在使用CONTEXT_INFO将用户名传递给删除触发器,以用于审计/历史记录表.我试图理解CONTEXT_INFO的范围,如果我正在创造潜在的竞争条件.
我的每个数据库表都有一个存储过程来处理删除.delete stored proc将userId作为参数,并将CONTEXT_INFO设置为userId.我的删除触发器然后抓取CONTEXT_INFO并使用它来更新指示谁删除了行的审计表.
问题是,如果两个删除来自不同用户的sprocs同时执行,其中一个sprocs中设置的CONTEXT_INFO是否会被另一个sproc触发的触发器消耗?
我已经看过这篇文章http://msdn.microsoft.com/en-us/library/ms189252.aspx但是我不清楚SQL Server中的会话和批处理的范围,这是本文有用的关键!
我发布了代码,但此刻时间很短.如果不够清楚我会稍后编辑.
在此先感谢您的帮助.
sql-server triggers stored-procedures sql-server-2008 context-info
我正在尝试将用户CONTEXT_INFO
代码从存储过程传递到DELETE触发器以进行表审计.
一切正常,但是我注意到审计表中保存的用户代码的长度不正确.
以此脚本为例......
declare @userCode varchar(50)
set @userCode = 'TestUser'
declare @binary_userCode varbinary(128)
set @binary_userCode = cast(@userCode as varbinary(128))
set CONTEXT_INFO @binary_userCode
declare @temp_userCode varchar(50)
set @temp_userCode = (select cast(CONTEXT_INFO() as varchar(50)))
--set @temp_userCode = rtrim(ltrim(@temp_userCode))
select @userCode, len(@userCode), @temp_userCode, len(@temp_userCode)
set CONTEXT_INFO 0x
Run Code Online (Sandbox Code Playgroud)
结果:
len(@userCode)= 8
len(@temp_userCode)= 50
为什么@temp_userCode
变量的长度为50,如何将其修剪回原始长度以正确存储?
更多的信息:
运行SQL Server 2005,但该解决方案需要在2005年以后的所有版本中运行.