我认为没有直接的方法来获得所需的约束和索引名称,但是你可以通过一些手动工作来实现它,如下所示。
首先,您可以使用以下命令更改约束名称:
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;
在Backup 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 );
复制所有命令并在生产数据库中执行所有命令。
干杯!!