Comment puis-je désactiver toutes les contraintes de table dans Oracle avec une seule commande? Cela peut être pour une seule table, une liste de tables ou pour toutes les tables.
Il vaut mieux éviter d'écrire des fichiers spool temporaires. Utilisez un bloc PL / SQL. Vous pouvez l'exécuter à partir de SQL * Plus ou mettre cette chose 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 constraint_type 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;
/
L'activation des contraintes à nouveau est un peu plus compliquée - 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 constraint_type. '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;
/
AND NOT (t.iot_type IS NOT NULL AND c.constraint_type = 'P')
au premier segment de code.Pour prendre en compte les dépendances entre les contraintes:
la source
Ce n'est pas une commande unique, mais voici comment je le fais. Le script suivant a été conçu pour s'exécuter dans SQL * Plus. Remarque, j'ai volontairement écrit ceci pour ne fonctionner que dans le schéma actuel.
Pour restreindre ce que vous déposez, filtrez ajouter une clause where à l'instruction select: -
Pour s'exécuter sur plus que le schéma actuel, modifiez l'instruction select pour sélectionner parmi all_constraints plutôt que user_constraints.
Remarque - pour une raison quelconque, je ne peux pas faire en sorte que le trait de soulignement n'agisse PAS comme une italique dans le paragraphe précédent. Si quelqu'un sait comment résoudre ce problème, n'hésitez pas à modifier cette réponse.
la source
Utilisez le curseur suivant pour désactiver toutes les contraintes. Et modifiez la requête pour activer les contraintes ...
la source
Cela peut être écrit en PL / SQL assez simplement sur la base de la vue système DBA / ALL / USER_CONSTRAINTS, mais divers détails ne sont pas aussi triviaux que cela en a l'air. Vous devez faire attention à l'ordre dans lequel cela est fait et vous devez également tenir compte de la présence d'index uniques.
L'ordre est important car vous ne pouvez pas supprimer une clé unique ou primaire référencée par une clé étrangère, et il peut y avoir des clés étrangères sur des tables dans d'autres schémas qui référencent des clés primaires dans les vôtres, donc à moins que vous n'ayez le privilège ALTER ANY TABLE, vous ne peut pas abandonner ces PK et UK. De plus, vous ne pouvez pas changer un index unique en un index non unique, vous devez donc le supprimer pour supprimer la contrainte (pour cette raison, il est presque toujours préférable d'implémenter des contraintes uniques en tant que contrainte "réelle" prise en charge par un non -index unique).
la source
Il ne semble pas que vous puissiez faire cela avec une seule commande, mais voici la chose la plus proche que je puisse trouver.
la source
C'est une autre façon de désactiver les contraintes (cela vient de https://asktom.oracle.com/pls/asktom/f?p=100:11:2402577774283132::::P11_QUESTION_ID:399218963817 )
fonctionne comme un charme
la source
Dans le script "désactiver", la clause order by devrait être la suivante:
Le but de cette clause est de désactiver les contraintes dans le bon ordre.
la source
Cette instruction renvoie les commandes qui désactivent toutes les contraintes, y compris la clé primaire, les clés étrangères et d'autres contraintes.
la source
avec curseur pour boucle (user = 'TRANEE', table = 'D')
(Si vous modifiez désactiver pour activer, vous pouvez activer toutes les contraintes)
la source
Vous pouvez exécuter toutes les commandes renvoyées par la requête suivante:
sélectionnez 'ALTER TABLE' || substr (c.table_name, 1,35) || 'DISABLE CONSTRAINT' || nom_contrainte || ' ; ' from user_constraints c - où c.table_name = 'TABLE_NAME';
la source