Il est préférable d'éviter d'écrire des fichiers spoule temporaires. Utilisez un bloc PL/SQL. Vous pouvez l'exécuter à partir de SQL*Plus ou le placer dans un package ou une procédure. La jointure à USER_TABLES est là pour éviter les contraintes de vue.
Il est peu probable que vous souhaitiez vraiment désactiver toutes les contraintes (y compris NOT NULL, les clés primaires, etc.). Vous devriez penser à mettre le type de contrainte dans la clause WHERE.
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;
/
Réactiver les contraintes est un peu plus délicat - vous devez activer les contraintes de clé primaire avant de pouvoir les référencer dans une contrainte de clé étrangère. Cela peut être fait en utilisant un ORDER BY sur le type_contrainte. 'P' =clé primaire, 'R' =clé étrangère.
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;
/