私はOracle11gに取り組んでおり、dbms_redefinitionを使用してテーブルを再定義しようとしています。正常に動作しますが、暫定テーブルを削除しようとするとORA-02449: unique/primary keys in table referenced by foreign keys
エラーがスローされます。
ここSOで参照を探すためのクエリを見つけました。
select table_name, constraint_name, status, owner
from all_constraints
where r_owner = 'MYSCHEMA'
and constraint_type = 'R'
and r_constraint_name in
(
select constraint_name from all_constraints
where constraint_type in ('P', 'U')
and table_name = 'INTERIM_TABLE'
and owner = 'MYSCHEMA'
)
order by table_name, constraint_name
これは
table_name |constraint_name |status |owner
---------------------------------------------------------
anotherTable|TMP$$_anotherTable_JOB_ID0|DISABLED|MYSCHEMA
この制約は再定義プロセス中に作成されたと思いますが、それは問題ありませんが、同じプロセスで削除する必要があることも予想していました。これは間違っていますか?つまり、この制約が削除されなかったという通常の動作の一部ですか?
制約を削除するだけで安全です
alter table anotherTable
drop constraint TMP$$_anotherTable_JOB_ID0
データを失うことなく?
前もって感謝します。
-編集-これについて考えた後、暫定テーブルを削除するために制約を削除することにしました。
ドロップしたいテーブルを指す他のテーブルの制約をほぼ自動的にドロップするようにクエリを変更しました。
DECLARE
my_table varchar2(100);
my_constraint varchar2(100);
BEGIN
select table_name , constraint_name into my_table,my_constraint
from all_constraints
where r_owner = 'MYSCHEMA'
and constraint_type = 'R'
and r_constraint_name in
(
select constraint_name from all_constraints
where constraint_type in ('P', 'U')
and table_name = 'INTERIM_TABLE'
and owner = 'MYSCHEMA'
)
order by table_name, constraint_name;
execute immediate 'ALTER TABLE '||my_table||' DROP CONSTRAINT '|| my_constraint;
END;
/
DROP TABLE MYSCHEMA.INTERIM_TABLE;
これは私にとってはうまくいきましたが、私の場合、クエリが1つの行(1つの依存テーブルのみ)をスローすることに注意する必要があります。したがって、誰かを知っている場合は、ループまたは別のメソッドによって多くの制約を削除するように変更する必要があります。
誰かがその制約がプロセス自体によって削除されなかった理由を理解して説明できれば(またはこれが正常な動作である場合)、それは良いことです。