Je pense qu'il n'y a pas de moyen direct d'obtenir les noms souhaités des contraintes et des index, mais oui, vous pouvez y parvenir avec un peu de travail manuel comme suit.
Tout d'abord, vous pouvez modifier le nom de la contrainte à l'aide de la commande suivante :
alter table <table_name> rename constraint <constarint_name> to <new_constarint_name>;
De la même manière, vous pouvez modifier le nom de l'Index à l'aide de la commande suivante :
ALTER INDEX <index_name> RENAME TO <new_index_name>;
Dans votre cas, vous avez besoin d'un moyen de lier les noms incorrects (contraintes/index) aux noms corrects. puis renommez les contraintes/Index avec le nom correct. Pour y parvenir, vous pouvez essayer les étapes suivantes. (Je donne un exemple pour les contraintes, vous pouvez obtenir la même chose pour les index)
- Étape 1
Obtenez les noms des contraintes et leurs données à partir de la base de données de production en utilisant la requête suivante et créer une table dans la base de données de sauvegarde utilisant ces données. (Vous pouvez utiliser SQL Loader
ou External table
pour cela.) Donnez le nom de cette table sous la forme PROD_DB_CONS
SELECT
C.TABLE_NAME,
C.CONSTRAINT_NAME,
C.CONSTRAINT_TYPE,
LISTAGG(CC.COLUMN_NAME, ',') WITHIN GROUP(
ORDER BY
COLUMN_NAME
) CONS_COLUMNS
FROM
USER_CONSTRAINTS C
JOIN USER_CONS_COLUMNS CC ON ( C.CONSTRAINT_NAME = CC.CONSTRAINT_NAME )
GROUP BY
C.TABLE_NAME,
C.CONSTRAINT_NAME,
C.CONSTRAINT_TYPE;
- Étape 2
Créez le même type de table dans la base de données de sauvegarde en utilisant la requête suivante :
CREATE TABLE BACKUP_DB_CONS AS
SELECT
C.TABLE_NAME,
C.CONSTRAINT_NAME,
C.CONSTRAINT_TYPE,
LISTAGG(CC.COLUMN_NAME, ',') WITHIN GROUP(
ORDER BY
COLUMN_NAME
) CONS_COLUMNS
FROM
USER_CONSTRAINTS C
JOIN USER_CONS_COLUMNS CC ON ( C.CONSTRAINT_NAME = CC.CONSTRAINT_NAME )
GROUP BY
C.TABLE_NAME,
C.CONSTRAINT_NAME,
C.CONSTRAINT_TYPE;
- Étape 3
Exécutez la requête suivante dans Backup DB qui va générer une série de commandes pour changer le nom de toutes les contraintes de la BD de production
SELECT
'ALTER TABLE '
|| B.TABLE_NAME
|| ' RENAME CONSTRAINT '
|| P.CONSTRAINT_NAME
|| ' TO '
|| B.CONSTRAINT_NAME
|| ';'
FROM
BACKUP_DB_CONS B
JOIN PROD_DB_CONS P ON ( B.TABLE_NAME = P.TABLE_NAME
AND B.CONS_COLUMNS = P.CONS_COLUMNS );
- Étape 4
Copiez toutes les commandes et exécutez-les toutes dans la base de données de production .
Bravo !