oracle - 为什么更改通知不支持以下查询?
问题描述
我正在尝试编写一些 .NET 代码,通过OracleDependency
在 Oracle 上注册一个用户子集来监听 Oracle DB 中的更改UNIFIED_AUDIT_TABLE
。我已经定义了一个审核策略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 bThrowArrayBindRelatedErrors, OracleException& exceptionForArrayBindDML, Boolean& hasMoreRowsInDB, 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, OracleException& exceptionForArrayBindDML, 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
政策更改的通知?
解决方案
不幸的是,您不能将 QCN 与视图一起使用。
请参阅:https ://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_cqn.htm#ADFNS576
推荐阅读
- python - 循环遍历numpy矩阵元素
- typescript - 检查数组中是否存在路径的最佳方法是什么?
- sql - 如何在 Oracle SQL 中收集文本字符串左侧的数据
- javascript - 如何从 textarea 长度中删除输入长度并限制两个最大限制?
- spring-boot - 为什么我的 Spring Boot 应用程序没有在 mustache 模板中呈现 messages.properties
- java - 为什么我使用 ObjectInputStream.readObject() 得到 ClassNotFoundException?
- python - 如何导入python脚本并将参数传递给主函数
- c# - 如何在我的应用程序后台初始化 UrhoSharp?
- css - WordPress 主题上的水平滚动仅在 Firefox 上
- visual-studio - SSIS 项目:[文件] 无法打开或加载,因为它已在另一个项目或解决方案中打开或加载