Oracle
 sql >> Database >  >> RDS >> Oracle

Come copiare o aggiornare gli indici e i vincoli delle tabelle da database diversi?

Penso che non ci sia un modo diretto per ottenere i nomi desiderati dei vincoli e degli indici, ma sì, puoi ottenerlo con un po' di lavoro manuale come segue.

Prima di tutto, puoi cambiare il nome del vincolo usando il seguente comando:

alter table <table_name> rename constraint <constarint_name> to <new_constarint_name>;

Allo stesso modo, puoi cambiare il nome dell'indice usando il seguente comando:

ALTER INDEX <index_name> RENAME TO <new_index_name>;

Nel tuo caso, hai bisogno di un modo per collegare nomi errati (vincoli/indici) con nomi corretti. e quindi rinominare i vincoli/indici con il nome corretto. Per raggiungerlo, puoi provare i seguenti passaggi. (Faccio un esempio per i vincoli, puoi ottenere lo stesso per gli indici)

  • Passaggio 1

Ottieni i nomi dei vincoli e i relativi dati dal DB di produzione utilizzando la query seguente e crea una tabella nel database di backup utilizzando quei dati. (Puoi usare SQL Loader o External table per esso.) Assegna il nome di questa tabella come 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;
  • Passaggio 2

Crea lo stesso tipo di tabella nel DB di backup utilizzando la seguente query:

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;
  • Passaggio 3

Esegui la seguente query in DB di backup che genererà una serie di comandi per modificare il nome di tutti i vincoli del DB di produzione

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 );
  • Passaggio 4

Copia tutti i comandi ed eseguili tutti nel DB di produzione .

Ciao!!