Мисля, че няма пряк начин за получаване на желаните имена на ограниченията и индексите, но да, можете да го постигнете с малко ръчна работа, както следва.
Първо, можете да промените името на ограничението, като използвате следната команда:
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
Копирайте всички команди и ги изпълнете всички в производствената база данни .
Наздраве!!