暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 引用分区-子分区 _ 名称问题。

askTom 2017-05-05
698

问题描述

嗨,

这是场景:
考虑Parent_table,它是基于dept_no列表分区的-partition_name指定为 “P_Dept_no”。
Parent_table -> Child_table_1 (基于Parent_Table的引用 _ 分区) -> Child_table_2 (基于Child_Table_1的引用 _ 分区) -> Child_Table_3 (基于Child_Table_2的引用 _ 分区)

问题发生在Child_table_3。对于一些分区,Child_table_3中的partition_name被创建为 “SYS_P” 分区。
由于我们正在做一些基于partition_names的操作,我们试图纠正这一点:

尝试删除并重新创建Child_table_3 :-
1.将同一组子分区重新创建为 'sys_p' 或
2.使用正确的partition_name (对应于 'p_dept_no ') 重新创建较早的 “sys_p'” 的子分区,而将较早正确命名的另一组子分区重新创建为 “SYS_P”。
知道为什么会这样吗?

试图重命名Child_table_3的分区:
这里担心的是,我们使用Parent_table的partition_position来标识正确的partition_name。这可以保证在父表和子表之间保持不变吗?
另外,当我们重命名Child_table_3的分区时,'partition_name'在 “* _ ind_partitions” 中,“* _ ind_statistics” 等仍保持为 “SYS_P”。这是预期的结果吗?如果我们也不更新元数据表,它会影响对表执行的任何操作吗?

或者这种情况有什么解决方案?

更新: 我们遇到了这样的情况: 如果父表分区被拆分,那么子表中的相应分区将被创建为 “SYS_P”,但是我们没有随时显式拆分父分区。这可以作为内部oracle操作发生吗?另外,如果是这种情况,那么drop and create strategy是否会使用适当的名称创建?

Update:发现此问题为Bug 15996848在12C中固定的Oracle中。所以请忽略前面的问题。

To fix this issue, we will alter table and index to rename partition. 这里担心的是,我们使用Parent_table的partition_position来标识正确的partition_name。这可以保证在父表和子表之间保持不变吗?
此外,该领域parent_table_partition在ALL_TAB_PARTITIONS中,所有引用的子分区均为空。我以为这将用相应的父表分区填充。不是这样吗?

专家解答

“可以保证在父表和子表之间保持不变吗?”

是的,因为您不能删除子分区,所以分区数将始终保持同步。

SQL> @drop child

Y1                      Y2
----------------------- -------------------------
TABLE                   cascade constraints purge

1 row selected.


Table dropped.

SQL> @drop parent

Y1                      Y2
----------------------- -------------------------
TABLE                   cascade constraints purge

1 row selected.


Table dropped.

SQL>
SQL> create table parent (
  2    id           number not null,
  3    constraint pk  primary key (id)
  4  )
  5  partition by range (id)
  6  (
  7     partition p1 values less than (10),
  8     partition p2 values less than (20),
  9     partition p3 values less than (30),
 10     partition p4 values less than (40)
 11  );

Table created.

SQL>
SQL> insert into parent select rownum from dual connect by level < 40;

39 rows created.

SQL> commit;

Commit complete.

SQL>
SQL> create table child (
  2    id             number not null,
  3    parent_id  number not null,
  4    constraint fk foreign key (parent_id)
  5                                 references parent (id)
  6  )
  7  partition by reference (fk);

Table created.

SQL>
SQL> insert into child select rownum, rownum
  2  from dual
  3  connect by level <40;

39 rows created.

SQL>
SQL> commit;

Commit complete.

SQL>
SQL> alter table child drop partition p3;
alter table child drop partition p3
                                 *
ERROR at line 1:
ORA-14255: table is not partitioned by range, list, composite range, or composite list method


SQL>
SQL> alter table parent drop partition p3;

Table altered.

SQL>
复制



“parent_table_partition” 用于嵌套表,而不是用于引用表。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论