制約とインデックスの目的の名前を直接取得する方法はないと思いますが、次のように少し手作業で取得できます。
まず、次のコマンドを使用して制約名を変更できます。
alter table <table_name> rename constraint <constarint_name> to <new_constarint_name>;
同様に、次のコマンドを使用してインデックス名を変更できます。
ALTER INDEX <index_name> RENAME TO <new_index_name>;
あなたの場合、悪い(制約/インデックス)名を正しい名前にリンクする何らかの方法が必要です。次に、制約/インデックスの名前を正しい名前に変更します。これを実現するには、次の手順を試してください。 (制約の例を示していますが、インデックスでも同じことができます)
- ステップ1
本番DBから制約名とそのデータを取得します 次のクエリを使用して、バックアップDBに1つのテーブルを作成します。 そのデータを使用します。 (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
バックアップDBに同じタイプのテーブルを作成します 次のクエリを使用します:
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
バックアップ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
すべてのコマンドをコピーして、本番DBですべて実行します 。
乾杯!!