Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como copiar ou atualizar índices e restrições de tabelas de diferentes bancos de dados?


Eu acho que não há uma maneira direta de obter os nomes desejados das restrições e índices, mas sim, você pode conseguir isso com um pouco de trabalho manual como segue.

Em primeiro lugar, você pode alterar o nome da restrição usando o seguinte comando:
alter table <table_name> rename constraint <constarint_name> to <new_constarint_name>;

Da mesma forma, você pode alterar o nome do índice usando o seguinte comando:
ALTER INDEX <index_name> RENAME TO <new_index_name>;

No seu caso, você precisa de alguma maneira de vincular nomes ruins (restrições/índices) com nomes corretos. e renomeie as restrições/índices com o nome correto. Para alcançá-lo, você pode tentar as seguintes etapas. (Estou dando exemplo para restrições, você pode conseguir o mesmo para índices)
  • Etapa 1

Obtenha os nomes das restrições e seus dados do DB de produção usando a seguinte consulta e crie uma tabela no banco de dados de backup usando esses dados. (Você pode usar o SQL Loader ou External table para ele.) Dê o nome desta tabela 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;
  • Etapa 2

Crie o mesmo tipo de tabela no banco de dados de backup usando a seguinte 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;
  • Etapa 3

Execute a seguinte consulta em Backup DB que irá gerar uma série de comandos para alterar o nome de todas as restrições do DB de produção
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 );
  • Etapa 4

Copie todos os comandos e execute todos eles no DB de produção .

Felicidades!!