Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment copier ou mettre à jour les index de table et les contraintes de différentes bases de données ?

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 !