Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да копирате или актуализирате индекси и ограничения на таблици от различна база данни?

Мисля, че няма пряк начин за получаване на желаните имена на ограниченията и индексите, но да, можете да го постигнете с малко ръчна работа, както следва.

Първо, можете да промените името на ограничението, като използвате следната команда:

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

По същия начин можете да промените името на индекса, като използвате следната команда:

ALTER INDEX <index_name> RENAME TO <new_index_name>;

Във вашия случай имате нужда от някакъв начин да свържете лоши (ограничения/индекси) имена с правилни имена. и след това преименувайте ограниченията/индексите с правилното име. За да го постигнете, можете да опитате следните стъпки. (Давам пример за ограничения, можете да постигнете същото за индекси)

  • Стъпка 1

Вземете имената на ограниченията и техните данни от производствената база данни като използвате следната заявка и направете една таблица в Backup DB използвайки тези данни. (Можете да използвате SQL Loader или External table за него.) Дайте името на тази таблица като 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;
  • Стъпка 2

Създайте същия тип таблица в резервна база данни използвайки следната заявка:

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;
  • Стъпка 3

Изпълнете следната заявка в Backup DB което ще генерира серия от команди за промяна на името на всички ограничения на производствената 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 );
  • Стъпка 4

Копирайте всички команди и ги изпълнете всички в производствената база данни .

Наздраве!!




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получите името на родителския елемент в израз на Oracle XPath?

  2. Как да изключа уикендите в SQL?

  3. Как да вмъкнете групово данни от референтен курсор във временна таблица в PL/SQL

  4. ORA-06502:PL/SQL:числова или стойностна грешка:буферът на символен низ е твърде малък, изключение от C# код

  5. Мигриране на формуляр на Oracle, базиран на знаци