102 votes

Comment puis-je supprimer une contrainte "not null" dans Oracle lorsque je ne connais pas le nom de la contrainte ?

J'ai une base de données qui a une contrainte NOT NULL sur un champ, et je veux supprimer cette contrainte. Le facteur de complication est que cette contrainte a un nom défini par le système, et que le nom de cette contrainte diffère entre le serveur de production, le serveur d'intégration et les différentes bases de données des développeurs. Notre processus actuel consiste à enregistrer des scripts de modification et une tâche automatisée exécute les requêtes appropriées via sqlplus sur la base de données cible. Je préférerais donc une solution qui pourrait être envoyée directement dans sqlplus.

Sur ma propre base de données, le SQL pour faire tomber ceci serait :

alter table MYTABLE drop constraint SYS_C0044566

Je peux voir la contrainte lorsque j'interroge le fichier all_constraints vue :

select * from all_constraints where table_name = 'MYTABLE'

mais je ne suis pas sûr de savoir comment travailler avec les SEARCH_CONDITION 's LONG ou la meilleure façon de supprimer dynamiquement la contrainte recherchée, même si je connais son nom.

Donc, comment puis-je créer une modification script qui peut faire tomber cette contrainte en fonction de ce qu'elle est, plutôt que de son nom ?


EDIT : La réponse de @Allan est bonne, mais je crains (en raison de mon manque d'expertise d'Oracle) qu'il ne soit pas universellement vrai que toute contrainte qui pourrait avoir un nom généré par le système sera associée à un moyen de supprimer la contrainte sans avoir à connaître son nom. Est-il vrai qu'il y aura toujours un moyen d'éviter d'avoir à connaître le nom d'une contrainte générée par le système lors de la suppression logique de cette contrainte ?

3 votes

Juste pour satisfaire votre curiosité : La contrainte NOT NULL est la uniquement type de contrainte dans Oracle que vous pouvez supprimer sans avoir besoin de connaître le nom de la contrainte. Pour tous les autres types de contraintes, vous devez connaître le nom de la contrainte.

0voto

Francisco Points 1

Quelque chose comme ça m'est arrivé quand j'ai fait des copies de structures dans des tables temporaires, donc j'ai supprimé le not null.

DECLARE
   CURSOR cur_temp_not_null IS
        SELECT table_name, constraint_name  FROM all_constraints WHERE table_name LIKE 'TEMP_%' AND  owner='myUSUARIO';

   V_sql VARCHAR2(200); 

BEGIN
  FOR c_not_null IN cur_temp_not_null
   LOOP
     v_sql :='ALTER TABLE ' || c_not_null.table_name || ' DROP CONSTRAINT '|| c_not_null.constraint_name;
     EXECUTE IMMEDIATE  v_sql;     
  END LOOP;
END;

0voto

Lukasz Ciesluk Points 698

Si la contrainte sur la colonne STATUS a été créée sans nom lors de la création d'une table, Oracle lui attribue un nom aléatoire. Malheureusement, nous ne pouvons pas modifier la contrainte directement.

Étapes de la suppression d'une contrainte sans nom liée à la colonne STATUS

  1. Duplication du champ STATUS dans un nouveau champ STATUS2
  2. Définir les contraintes CHECK sur STATUS2
  3. Migrer les données de STATUS vers STATUS2
  4. Suppression de la colonne STATUS
  5. Renommez STATUS2 en STATUS

    ALTER TABLE MY_TABLE ADD STATUS2 NVARCHAR2(10) DEFAULT 'OPEN'; ALTER TABLE MY_TABLE ADD CONSTRAINT MY_TABLE_CHECK_STATUS CHECK (STATUS2 IN ('OPEN', 'CLOSED')); UPDATE MY_TABLE SET STATUS2 = STATUS; ALTER TABLE MY_TABLE DROP COLUMN STATUS; ALTER TABLE MY_TABLE RENAME COLUMN STATUS2 TO STATUS;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X