Oracle - create_error_log - 带 blob

发布于 2025-01-14 21:34:44 字数 1388 浏览 1 评论 0原文

这是一个小问题,我们有表:

CREATE TABLE "SCHEMA_OLD"."DOCUMENT_DATA" (
 "ID" NUMBER(19,0) NOT NULL ENABLE,
 "DATE_ALTERED" TIMESTAMP (6),
 "USER_ALTERED" VARCHAR2(50 CHAR),
 "DATE_CREATED" TIMESTAMP (6),
 "USER_CREATED" VARCHAR2(50 CHAR),
 "VERSION_ID" NUMBER(19,0) NOT NULL ENABLE,
 "DATA" BLOB,
 "IS_MIGR" NUMBER(1,0),
 "MIGRT_KEY" VARCHAR2(60 CHAR)
 CONSTRAINT "data_pk" PRIMARY KEY ("ID")
)

我们还实现了 oracle 错误日志记录,跳过 BLOB 列

exec dbms_errlog.create_error_log(dml_table_name => 'schema_old.document_data', skip_unsupported => true);

在另一个模式上,我们有相同的表 schema_new.document_data 在复制数据时,插入时出现重复主键错误“ORA-00001:违反唯一约束”

begin

  insert /*+ append parallel(8) */ into schema_old.document_data 
  (ID, DATE_ALTERED, USER_ALTERED, DATE_CREATED, USER_CREATED, VERSION_ID, DATA, IS_MIGR, MIGRT_KEY)
  select /*+ parallel(8) */ ID, DATE_ALTERED, USER_ALTERED, DATE_CREATED, USER_CREATED, 
                            VERSION_ID, DATA, IS_MIGR, MIGRT_KEY
  from schema_new.document_data
  log errors into schema_old.err$_document_data reject limit unlimited;

exception
  when others then
  schema_old.log#write('Script_document_data ERROR:' || sqlerrm);
  raise;
end;

但是运行插入后表 schema_old.err$_document_data 为空

我们通过从两个表中删除“Blob”列来确保这种类型的日志记录有效,运行插入后我们在表中出现错误,但如何使其与“blob”一起工作“ 专栏存在吗?

Here is small problem, we have table:

CREATE TABLE "SCHEMA_OLD"."DOCUMENT_DATA" (
 "ID" NUMBER(19,0) NOT NULL ENABLE,
 "DATE_ALTERED" TIMESTAMP (6),
 "USER_ALTERED" VARCHAR2(50 CHAR),
 "DATE_CREATED" TIMESTAMP (6),
 "USER_CREATED" VARCHAR2(50 CHAR),
 "VERSION_ID" NUMBER(19,0) NOT NULL ENABLE,
 "DATA" BLOB,
 "IS_MIGR" NUMBER(1,0),
 "MIGRT_KEY" VARCHAR2(60 CHAR)
 CONSTRAINT "data_pk" PRIMARY KEY ("ID")
)

We also implemented oracle err logging, with skipping BLOB column

exec dbms_errlog.create_error_log(dml_table_name => 'schema_old.document_data', skip_unsupported => true);

On the other schema we have identical table schema_new.document_data
during copy data, we get error of duplicate primary key "ORA-00001: unique constraint violated" while inserting.

begin

  insert /*+ append parallel(8) */ into schema_old.document_data 
  (ID, DATE_ALTERED, USER_ALTERED, DATE_CREATED, USER_CREATED, VERSION_ID, DATA, IS_MIGR, MIGRT_KEY)
  select /*+ parallel(8) */ ID, DATE_ALTERED, USER_ALTERED, DATE_CREATED, USER_CREATED, 
                            VERSION_ID, DATA, IS_MIGR, MIGRT_KEY
  from schema_new.document_data
  log errors into schema_old.err$_document_data reject limit unlimited;

exception
  when others then
  schema_old.log#write('Script_document_data ERROR:' || sqlerrm);
  raise;
end;

But table schema_old.err$_document_data is empty after running insert

We made sure that this type of logging works, by removing "Blob" column from both tables, after running insert we get error in table, but how to make it work with "blob" column existing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

扛起拖把扫天下 2025-01-21 21:34:44

您正在执行直接路径插入,这是针对唯一约束违规的 DML 错误日志记录的限制

https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/INSERT.html#GUID-903F8043-0254-4EE9-ACC1-CB8AC0AF3423

对 DML 错误日志记录的限制

以下情况会导致语句失败并回滚
不调用错误记录功能:

违反了延迟约束。

任何直接路径 INSERT 或 MERGE 操作都会引发唯一的
约束或索引违规。

任何引发唯一约束的更新操作 UPDATE 或 MERGE
或索引违规。

You are doing a direct path insert, this is a documented restriction for DML error logging for unique constraint violations

https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/INSERT.html#GUID-903F8043-0254-4EE9-ACC1-CB8AC0AF3423

Restrictions on DML Error Logging

The following conditions cause the statement to fail and roll back
without invoking the error logging capability:

Violated deferred constraints.

Any direct-path INSERT or MERGE operation that raises a unique
constraint or index violation.

Any update operation UPDATE or MERGE that raises a unique constraint
or index violation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文