我正在运行 Oracle 12.2,并希望使用 DBMS_METADATA 将表及其依赖对象复制到新模式和新名称,如下所示:
h_read := DBMS_METADATA.OPEN('TABLE_EXPORT');
DBMS_METADATA.SET_FILTER(h_read,'SCHEMA','FRAMEWORK');
DBMS_METADATA.SET_FILTER(h_read,'NAME',l_Table_Name);
...
h_modify := DBMS_METADATA.ADD_TRANSFORM(h_write,'MODIFY');
DBMS_METADATA.SET_REMAP_PARAM(h_modify, 'REMAP_SCHEMA', 'FRAMEWORK', l_new_Schema);
DBMS_METADATA.SET_REMAP_PARAM(h_modify, 'REMAP_NAME', l_parsed_old_name, l_new_Name);
一切都很好,除了我在主键约束及其索引上得到重复。这是因为主键约束绑定到表的定义(连同所有 NOT NULL 约束)。我可以根据名称(%_PK 命名约定)排除主键约束及其索引:
DBMS_METADATA.SET_FILTER(h_read,'EXCLUDE_NAME_EXPR','='''||l_Table_Name||'_PK''', 'INDEX');
DBMS_METADATA.SET_FILTER(h_read,'EXCLUDE_NAME_EXPR','='''||l_Table_Name||'_PK''', 'CONSTRAINT');
... 但是之后:
l_parsed_items := sys.ku$_parsed_items();
DBMS_METADATA.FETCH_XML_CLOB(h_read, l_XML, l_parsed_items, l_Object_Type );
.. 没有触及表中的主键约束,所以我不能向它添加 REMAP_NAME。如果我添加:
DBMS_METADATA.SET_TRANSFORM_PARAM(h_ddl, 'CONSTRAINTS', FALSE);
...然后所有 NOT NULL 约束都消失了 - 真可惜。
有没有办法只从 DBMS_METADATA 的 XML 中的表定义中跳过主键约束?