我试图通过在Oracle OracleDependency
上注册UNIFIED_AUDIT_TABLE
来编写一些.NET代码来侦听一部分用户对Oracle DB中的更改。我已经定义了审核策略TEST_AUDIT_POLICY
来审核感兴趣的用户的更改。以下代码是我的.NET侦听器:
private const string TableName = "UNIFIED_AUDIT_TRAIL";
private const string SelectStatement = "select event_timestamp from " + TableName;
...
public Form1()
{
var connection = new OracleConnection(Constr);
connection.Open();
var command = connection.CreateCommand();
try
{
var dependency = new OracleDependency(command);
dependency.OnChange += NotifyTypesChanged;
command.Notification.IsnotifiedOnce = false;
command.BindByName = true;
command.CommandText = SelectStatement;
new OracleDataAdapter(command)
{MissingSchemaaction = MissingSchemaaction.AddWithKey}.Fill(DataSet,TableName);
_dataGrid1.SetDataBinding(DataSet,TableName);
}
catch (Exception ex)
{
}
}
运行此代码时,出现以下异常:
Oracle.ManagedDataaccess.Client.OracleException (0x80004005): ORA-29973: Unsupported query or operation during change notification registration
at OracleInternal.ServiceObjects.OracleConnectionImpl.VerifyExecution(Int32& cursorId,Boolean bThrowArrayBindRelatedErrors,SqlStatementType sqlStatementType,Int32 arrayBindCount,OracleException& exceptionForArrayBindDML,Boolean& hasMoreRowsInDB,Boolean bFirstIterationDone)
at OracleInternal.ServiceObjects.OracleCommandImpl.VerifyExecution(OracleConnectionImpl connectionImpl,Int32& cursorId,Boolean bFirstIterationDone)
at OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteReader(String commandText,OracleParameterCollection paramColl,CommandType commandType,OracleConnectionImpl connectionImpl,OracleDataReaderImpl& rdrImpl,Int32 longFetchSize,Int64 clientInitialLOBFS,OracleDependencyImpl orclDependencyImpl,Int64[] scnForExecution,Int64[]& scnFromExecution,OracleParameterCollection& bindByPositionParamColl,Boolean& bBindParamPresent,Int64& internalInitialLOBFS,OracleConnection connection,OracleLogicalTransaction& oracleLogicalTransaction,IEnumerable`1 adrianParsedStmt,Boolean isDescribeonly,Boolean isFromEF)
at Oracle.ManagedDataaccess.Client.OracleCommand.ExecuteReader(Boolean requery,Boolean fillRequest,CommandBehavior behavior)
at Oracle.ManagedDataaccess.Client.OracleDataAdapter.Fill(DataSet dataSet,Int32 startRecord,Int32 maxRecords,String srcTable,IDbCommand command,CommandBehavior behavior)
at System.Data.Common.DbdataAdapter.Fill(DataSet dataSet,String srcTable)
我无法听UNIFIED_AUDIT_TABLE
上的更改,因为UNIFIED_AUDIT_TABLE
不是表,而只是视图?如果是这样,我该如何注册以通知有关TEST_AUDIT_POLICY
政策的更改?