【发布时间】:2015-02-04 04:28:09
【问题描述】:
我正在使用 SQL Server 和数据库触发器来对系统的所有更改进行数据级审计。此审核包括发起更改的用户 ID / 名称。理想情况下,我想在我的 AppHost.Configure 方法中做这样的事情:
SqlServerDialect.Provider.UseUnicode = true;
var dbFactory = new OrmLiteConnectionFactory(ConnectionString, SqlServerDialect.Provider)
{
ConnectionFilter = (db =>
{
IAuthSession session = this.Request.GetSession();
if (session != null && !session.UserName.IsNullOrEmpty())
{
System.Data.IDbCommand cmd = db.CreateCommand();
cmd.CommandText = "declare @ci varbinary(128); select @ci = CAST(@Username as varbinary(128)); set context_info @ci";
System.Data.IDbDataParameter param = cmd.CreateParameter();
param.ParameterName = "Username";
param.DbType = System.Data.DbType.String;
//param.Value = session.UserName;
param.Value = session.UserAuthId;
cmd.Parameters.Add(param);
cmd.ExecuteNonQuery();
}
return new ProfiledDbConnection(db, Profiler.Current);
}),
AutoDisposeConnection = true
};
container.Register<IDbConnectionFactory>(dbFactory);
当然,这不起作用,因为this.Request 不存在。有什么方法可以从 OrmLite 连接上的 ConnectionFilter 或 ExecFilter 访问当前会话?
我开始的另一种方法是覆盖Service 的Db 属性,它不再起作用,因为我已经将一些活动抽象到它们自己的接口实现中以允许在测试期间进行模拟。这些中的每一个都传递了一个函数,该函数期望返回一个 DB 连接。示例:
// Transaction processor
container.Register<ITransactionProcessor>(new MockTransactionProcessor(() => dbFactory.OpenDbConnection()));
那么,我如何确保执行的任何 DML 都具有我的数据库审计触发器所需的(公认的特定于数据库的)上下文信息?
【问题讨论】:
标签: servicestack ormlite-servicestack