Я думаю, что не существует прямого способа получить желаемые имена ограничений и индексов, но да, вы можете достичь этого с небольшим количеством ручной работы следующим образом.
Прежде всего, вы можете изменитьимя ограничения с помощью следующей команды:
alter table <table_name> rename constraint <constarint_name> to <new_constarint_name>;
Таким же образом вы можете изменить имя индекса, используя следующую команду:
ALTER INDEX <index_name> RENAME TO <new_index_name>;
В вашем случае вам нужен какой-то способ связиплохие (ограничения / индексы) имена с правильными именами. а затем переименуйте ограничения / индексы с правильным именем. Чтобы добиться этого, вы можете попробовать следующие шаги. (Я привожу пример для ограничений, вы можете добиться того же для индексов)
Получить имена ограничений и их данные из рабочая БД с использованием следующего запроса и создание одной таблицы в резервной БД с использованием этих данных. (Вы можете использовать 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;
Создайте таблицу такого же типа в резервной БД , используя следующий запрос:
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;
Выполните следующий запрос в Резервная копия БД , которая сгенерирует серию команд для изменения имени всех ограничений производственной БД
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 );
Скопируйте все команды и выполните их все в производственной базе данных .
Приветствия !!