0

私は oracle 11g に取り組んでいます。私は oracle にまったく慣れていませんが、storedproc を作成する必要があります。私のprocでは、テーブルを削除し、フォームステージングテーブルを挿入しています。多くのテーブルを削除すると、整合性制約があります。親テーブルに挿入した後もすべての子テーブルを削除すると、すべての子テーブルをロールバックする必要があります。

例えば:

delete ch1,ch2,ch3;
delete parent;
insert into parent;
rollback ch1,ch2,ch3;

整合性制約の無効化/有効化や、トランザクションをシナリオにとって価値のあるものにする方法などの解決策を教えてください。

4

1 に答える 1

0

子テーブルが静的な場合は、次のようなクエリを使用してすべてを有効または無効にするスクリプトを生成できます。

select 'alter table ' || fk.owner ||'.'|| fk.table_name
  ||' disable constraint '|| fk.constraint_name ||';'
from all_constraints fk
join all_constraints pk
on pk.owner = fk.r_owner
and pk.constraint_name = fk.r_constraint_name
where fk.constraint_type = 'R'
and fk.status = 'ENABLED'
and pk.constraint_type = 'P'
and pk.table_name = '<your parent table>;

これにより、alter table削除/挿入の前に実行できるコマンドのリストが表示され、同じことを実行して、それらすべてを再度有効にするスクリプトを作成できます。

オンザフライで実行したい場合 (ストアド プロシージャからこれを実行する可能性が高い)、カーソルで同じことを実行し、動的 ​​SQL として実行できます。

begin
  for r in (
    select 'alter table ' || fk.owner ||'.'|| fk.table_name
      ||' disable constraint '|| fk.constraint_name as stmt
    from all_constraints fk
    join all_constraints pk
    on pk.owner = fk.r_owner
    and pk.constraint_name = fk.r_constraint_name
    where fk.constraint_type = 'R'
    and fk.status = 'ENABLED'
    and pk.constraint_type = 'P'
    and pk.table_name = 'T42'
    ) loop
    execute immediate r.stmt;
  end loop;
end;
/

両方のオプションの SQL Fiddle デモ

于 2013-08-16T08:35:18.967 に答える