sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo copiar o actualizar índices de tablas y restricciones de diferentes bases de datos?

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