Oracle11g 如何从实体框架设置dbms_session.set_标识符

Oracle11g 如何从实体框架设置dbms_session.set_标识符,oracle11g,entity,Oracle11g,Entity,我试图在一个由Oracle数据库支持的web应用程序中实现审计跟踪,当用户通过SQL客户端(如TOAD)或我通过手动使用Oracle.DataAccess.client更改数据时,我们的审计跟踪触发器可以完美地工作 // rest omitted for brevity // var command = new OracleCommand(); command.Connection = conn; var useridsql

我试图在一个由Oracle数据库支持的web应用程序中实现审计跟踪,当用户通过SQL客户端(如TOAD)或我通过手动使用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示例不同的方法,但是在错误的数据库会话上,dbms_会话对触发器不可见

我确实尝试过关闭连接池,但也没有多大帮助

我尝试了我所知道的所有可能的情景,但没有成功

这里有没有人有想法可以把我推向正确的方向

提前谢谢,非常感谢你的帮助

致以亲切的问候


Max.

我也尝试了您所做的,但在跟踪中我看到clientid被重置为空字符串。这是对我有用的东西

我的数据库上下文

private SiSiEntities db = new SiSiEntities();
我认为在做下面的工作时,这将是一个不同的会议,但它是有效的

OracleConnection conn = db.Database.Connection as Oracle.DataAccess.Client.OracleConnection;
conn.Open();
conn.ClientId = User.Identity.Name.ToString().ToLower(); 
db.SaveChanges();

在春天,你可以延长时间。您可以重写getConnection()方法,在获取连接时,可以运行查询将数据库会话分配给当前应用程序会话用户。当然,只有当你使用跨国语境时,这才是有针对性的

为了提高效率,您还可以扩展Connection对象,将其与当前会话用户的信息包装在一起,以便仅在数据库会话用户与当前用户不同时更新它

一个简单的例子:

public class CustomTransactionAwareDataSourceProxy extends
        TransactionAwareDataSourceProxy {

    private static final SQL = "begin dbms_session.set_identifier(?); end;";

    public CustomTransactionAwareDataSourceProxy(
            final DataSource targetDataSource) {
        super(targetDataSource);
    }

    @Override
    public Connection getConnection() throws SQLException {
        return this.decorate(super.getConnection());
    }

    private Connection decorate(final Connection conn)
            throws SQLException {

            try (PreparedStatement statement = connection.prepareCall(SQL)) {
                statement.setString(1, this.getUsername());
                statement.execute();
            }
            return connection;
    }
}

谢谢我花了几个小时寻找一种方法来获取对oracle连接的引用