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!!