Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Deaktivieren Sie alle Tabelleneinschränkungen in Oracle

Es ist besser, das Schreiben von temporären Spool-Dateien zu vermeiden. Verwenden Sie einen PL/SQL-Block. Sie können dies von SQL*Plus aus ausführen oder dieses Ding in ein Paket oder eine Prozedur einfügen. Der Join zu USER_TABLES dient dazu, Ansichtseinschränkungen zu vermeiden.

Es ist unwahrscheinlich, dass Sie wirklich alle Einschränkungen (einschließlich NOT NULL, Primärschlüssel usw.) deaktivieren möchten. Sie sollten darüber nachdenken, constraint_type in die WHERE-Klausel aufzunehmen.

BEGIN
  FOR c IN
  (SELECT c.owner, c.table_name, c.constraint_name
   FROM user_constraints c, user_tables t
   WHERE c.table_name = t.table_name
   AND c.status = 'ENABLED'
   AND NOT (t.iot_type IS NOT NULL AND c.constraint_type = 'P')
   ORDER BY c.constraint_type DESC)
  LOOP
    dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" disable constraint ' || c.constraint_name);
  END LOOP;
END;
/

Das erneute Aktivieren der Einschränkungen ist etwas kniffliger - Sie müssen Primärschlüssel-Einschränkungen aktivieren, bevor Sie sie in einer Fremdschlüssel-Einschränkung referenzieren können. Dies kann mit einem ORDER BY auf Constraint_Type erfolgen. 'P' =Primärschlüssel, 'R' =Fremdschlüssel.

BEGIN
  FOR c IN
  (SELECT c.owner, c.table_name, c.constraint_name
   FROM user_constraints c, user_tables t
   WHERE c.table_name = t.table_name
   AND c.status = 'DISABLED'
   ORDER BY c.constraint_type)
  LOOP
    dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" enable constraint ' || c.constraint_name);
  END LOOP;
END;
/