c# – 在MSSQL(TSQL)中,我可以指定一个存在于连接字符串中的上下文变量,但不影响池化吗?
作者:互联网
为了进一步解释这种需求,请考虑以下情况:
在一个严重依赖TRIGGERS的遗留系统中,我们需要提供某种类型的令牌(让我们称之为“SessionID”)以插入到某些安全日志表中.此令牌在应用程序服务器的C#中创建,并将传递到所有SQL命令中.
不过,这对触发器的要求是不可改变的
因此,因为我有权修改连接字符串,所以我可以(并且已经成功证明我可以)使用“应用程序名称”标记来提供这条信息.
string connectionString = string.Format("SERVER=sql.example.com; "
+ "DATABASE=someDB; User ID=xyz; Password=123; Application Name={0}", sID);
既然这样有效,那有什么问题呢?
问题很简单……上面的工作,但由于我们有成千上万的用户…我们的连接池被销毁(因为连接池是基于连接字符串…基本上,我需要连接池到基于除Application Name属性之外的所有内容).
所以,你知道我怎么做:
>在连接字符串中设置一个不包含在池中的属性.
>为此连接设置一个上下文属性,其他方式对性能并不是非常重要.
作为旁注…我可以立即打开连接并创建一个具有单个值的临时表:
SELECT 12345 AS SessionID INTO #context
但这似乎令人难以置信的矫枉过正!
解决方法:
您需要执行此操作而不是依赖于连接字符串,而不是依赖于临时表SET CONTEXT_INFO / CONTEXT_INFO()can be used来将某些任意数据与当前会话/连接相关联(并且在触发器中可用).
如果服务器可以从用户/时间等的某种组合创建变量,则可以在logon trigger中自动分配CONTEXT_INFO,在这种情况下,您根本不需要更改连接机制.
标签:c,sql-server-2008,connection-string 来源: https://codeday.me/bug/20190721/1496074.html