Creo que no hay una forma directa de obtener los nombres deseados de las restricciones y los índices, pero sí, puede lograrlo con un poco de trabajo manual como se muestra a continuación.
En primer lugar, puede cambiar el nombre de la restricción usando el siguiente comando:
alter table <table_name> rename constraint <constarint_name> to <new_constarint_name>;
De la misma manera, puede cambiar el nombre del índice usando el siguiente comando:
ALTER INDEX <index_name> RENAME TO <new_index_name>;
En su caso, necesita alguna forma de vincular nombres incorrectos (restricciones/índices) con nombres correctos. y luego cambie el nombre de las restricciones/Índices con el nombre correcto. Para lograrlo, puedes probar los siguientes pasos. (Doy un ejemplo para Restricciones, puede lograr lo mismo para índices)
- Paso 1
Obtenga los nombres de las restricciones y sus datos de la base de datos de producción usando la siguiente consulta y haga una tabla en Backup DB utilizando esos datos. (Puede usar SQL Loader
o External table
para ello.) Dé el nombre de esta tabla como 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;
- Paso 2
Cree el mismo tipo de tabla en base de datos de respaldo usando la siguiente consulta:
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;
- Paso 3
Ejecute la siguiente consulta en Backup DB que generará una serie de comandos para cambiar el nombre de todas las restricciones de producción DB
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 );
- Paso 4
Copie todos los comandos y ejecútelos todos en DB de producción .
¡¡Salud!!