Dans Oracle 10g, comment puis-je supprimer une contrainte unique sur une colonne sans connaître le nom de la contrainte (par exemple un nom généré par le système, qui ne sera pas forcément le même à travers les instances de base de données)? Déposer et recréer la table n'est pas une option. C'est possible?Suppression d'une contrainte unique sur la colonne de table sans connaître le nom de contrainte
3
A
Répondre
8
Vous pouvez récupérer le nom de la contrainte avec:
SELECT CONSTRAINT_NAME
FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'xxx'
AND CONSTRAINT_TYPE = 'U'
Vous pouvez par exemple créer une procédure stockée qui exécute SQL précédente, stocke le résultat dans une variable et utilise cette variable dans ALTER TABLE DROP CONSTRAINT
EDIT: par exemple:
BEGIN
FOR r IN (
SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'xxx'
AND CONSTRAINT_TYPE = 'U') LOOP
EXECUTE IMMEDIATE REPLACE(REPLACE(
'ALTER TABLE #TABLE# DROP CONSTRAINT #CON#'
,'#TABLE#',r.TABLE_NAME)
,'#CON#',r.CONSTRAINT_NAME);
END LOOP;
END;
Merci, cela a bien fonctionné pour mes fins. Bien que je puisse voir que dans certains cas, un soin particulier doit être pris, comme quand vous voulez garder certaines contraintes uniques et en laisser tomber d'autres, puisque vous ne pouvez pas simplement vous concentrer sur des colonnes spécifiques impliquées dans une contrainte. –