ALLOWNOOPUPDATES | NOALLOWNOOPUPDATES
有效对象
复制
说明
使用 ALLOWNOOPUPDATES 和 NOALLOWNOOPUPDATES 控制 Replicat 如何响应 no-op 操作。无操作是对目标表没有影响的操作。下面是有关如何发生这种情况的一些示例。
-
源表具有目标表中不存在的列,或者该表具有从复制中排除的列(使用
COLSEXCEPT子句)。在任一情况下,如果更新该源列,复制 SQL 语句内的SET子句中将没有要使用的目标列名。 -
进行了更新,将列设置为与当前列相同的值。数据库不会记录新值,因为它没有更改。但是,Oracle GoldenGate 会将操作捕获为更改记录,因为已记录主键,但是复制 SQL 语句中没有
SET子句的列值。
使用 NOALLOWNOOPUPDATES 时,仅当源表和目标表未定义密钥或复制表未使用 KEYCOLS 时,复制才会异常终止。在这种情况下,如果目标表未定义唯一键并对任何源列执行更新操作,则会出现类似于以下内容的错误:
Encountered an update for target table TELLER, which has no unique key defined. KEYCOLS can be used to define a key. Use ALLOWNOOPUPDATES to process the update without applying it to the target database. Use APPLYNOOPUPDATES to force the update to be applied using all columns in both the SET and WHERE clause.
可以使用参数 APPLYNOOPUPDATES 强制应用 UPDATE。APPLYNOOPUPDATES 覆盖 ALLOWNOOPUPDATES。如果同时指定了二者,Replicat 将应用源表和目标表存在关键列的更新。
如果使用 HANDLECOLLISIONS 或 INSERTMISSINGUPDATES 参数时指定了 ALLOWNOOPUPDATES,并且 Oracle GoldenGate 具有所有目标键值,则 Oracle GoldenGate 将通过在 SET 子句中使用表的所有列和 WHERE 子句(调用 APPLYNOOPUPDATES 行为)应用 UPDATE。这是必要的,以便 Oracle GoldenGate 可以确定行是否存在。如果缺失,Oracle GoldenGate 会将 UPDATE 转换为 INSERT。
默认值
NOALLOWNOOPUPDATES
语法
ALLOWNOOPUPDATES | NOALLOWNOOPUPDATES