我正在将一个经典的ASP站点迁移到ASP。净MVC。作为迁移的一部分,我们已经将数据库从MS Access迁移到SQL Server,并且已经在SQL端设置了基本的触发级审计日志。
我想做的是跟踪当前登录的用户的经典ASP网站的触发级审计的目的。
对于MVC结束的事情,我使用SQL的SET CONTEXT_INFO
(ref)与实体框架和"每个请求一个数据上下文"规则,这允许我将上下文信息设置为当前登录的MVC用户的ID。一切都好。
我想以相同的经典ASP网站,但不确定如何。是否有一种方法可以捕获"每个请求"来设置CONTEXT_INFO
,例如我们可以在MVC中?我对经典ASP管道的工作方式不够熟悉,无法知道这是否可以做到,或者数据库连接(在包含文件和ADODB连接中实现为连接字符串)是否将在应用程序池中持久化,这意味着我没有办法做到这一点。有人知道这是可能的吗?
以下是一些事实。
-
CONTEXT_INFO
存储在会话/批处理范围内,而不是连接。
From Using Session Context Information
会话上下文信息使应用程序能够设置二进制值最多128字节,可以在多个批次中引用,存储操作的过程、触发器或用户定义函数会话 .
-
当您从池中获取连接时,ADO(使用体面的,最好是官方数据提供程序,如SQLOLEDB, SQLNCLI)执行
sp_reset_connection
,这表明连接正在被重用。 -
从SQL Server 2005 *开始,
sp_reset_connection
重置CONTEXT_INFO
From System Stored Procedures (Transact-SQL)
总之,在一个开放的会话中使用sp_reset_connection存储过程被SQL Server用来在事务中支持远程存储过程调用。这个存储过程还会导致审计登录和审计注销事件触发
CONTEXT_INFO
是安全的。
因此,只要在请求期间坚持使用相同的连接对象引用(adoCon
),以下代码就符合one data context per request
规则。
<%
Dim adoCon ' global scope variable
Set adoCon = Server.CreateObject("ADODB.Connection")
adoCon.ConnectionString = "Provider=SQLNCLI10;Data Source=..."
adoCon.Open 'connection taken from the pool, a session "possibly recycled" started
'CONTEXT_INFO() is definitely NULL right now
adoCon.Execute "SET CONTEXT_INFO 0x01"
'all database operations through the adoCon ...
adoCon.Close 'connection closed, session released
%>