我正在尝试在由 Oracle 数据库支持的 Web 应用程序中实现审计跟踪,当用户通过 TOAD 等 SQL 客户端更改数据或当我手动使用 Oracle 时,我们确实有审计跟踪触发器可以完美地工作.DataAccess.Client 通过
// rest omitted for brevity //
var command = new OracleCommand();
command.Connection = conn;
var useridsql = new StringBuilder();
useridsql.AppendLine("BEGIN");
useridsql.AppendLine("dbms_session.set_identifier('username');");
useridsql.AppendLine("END;");
command.CommandText = useridsql.ToString();
command.ExecuteNonQuery();
// Rest of the insert / update / delete code //
当我尝试通过重写 DbContext 类中的 SaveChanges() 来执行相同操作时,不起作用。
我假设实体使用的管理连接方式与上述 ADO.NET 示例不同,因此更新发生的原因是在错误的数据库 session 上,因此 dbms_session 对触发器不可见。
我确实尝试关闭连接池,但这也没有多大帮助。
我已经尝试了我所知道的所有可能的情况,但没有成功。
这里有人有想法并且可以将我推向正确的方向吗?
提前致谢,非常感谢您的帮助。
谨致问候,
最大。
最佳答案
我也尝试了你所做的,但在跟踪中我可以看到 clientid 被重置为空字符串。这对我有用。
我的DbContext
private SiSiEntities db = new SiSiEntities();
我认为执行以下操作将是一个不同的 session ,但它有效。
OracleConnection conn = db.Database.Connection as Oracle.DataAccess.Client.OracleConnection;
conn.Open();
conn.ClientId = User.Identity.Name.ToString().ToLower();
db.SaveChanges();
关于oracle11g - 如何从 Entity Framework 设置 dbms_session.set_identifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17971662/