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;
/