web-dev-qa-db-ja.com

Oracleデータディクショナリの参照パーティションを使用しているテーブルを見つけるにはどうすればよいですか?

私は、Oracleデータベース用の汎用ドロップオールオブジェクトスクリプトを作成しています。 drop table TABLE_NAME cascade constraints purgeをループすることにより、他のオブジェクトタイプの中で、すべてのテーブルのuser_objects行を生成します。

問題は、参照パーティションテーブルが依存しているテーブルは、ORA-14656: cannot drop the parent of a reference-partitioned tableのように削除できないことです。

データディクショナリから参照パーティションテーブルの親であるテーブルを検出するにはどうすればよいですか?最初のループでそれらをスキップし、2番目のループでそれらを削除できますか?

5
Barn

参照するパーティション化された子テーブルを少なくとも1つ持つパーティション化されたテーブルのリストを取得するには、[dba][all][user]_part_tablesおよび[dba][all][user]_constrainsデータディクショナリビューは、付与された権限に応じて、照会できます。

create table tb_part_parent(
  col  number primary key,
  col2 number
)
partition by range (col2) (
  partition part_1 values less than (100),
  partition part_2 values less than (300),
  partition part_3 values less than (500)
)

create table tb_part_child(
  col  number not null,
  col2 number,
  constraint fk_parent_1 foreign key(col) references tb_part_parent(col)
)partition by reference (fk_parent_1)

クエリ:

select t.table_name
  from user_constraints t
 where t.constraint_name in ( select w.r_constraint_name
                                from user_constraints w
                                join user_part_tables q
                                  on (q.table_name = w.table_name and
                                      q.ref_ptn_constraint_name = w.constraint_name)
                              )

結果:

TABLE_NAME
-----------------
TB_PART_PARENT 
5