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

    本番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ですべて実行します 。

    乾杯!!




    1. SSISを使用して大きなフラットファイルをデータベーステーブルにロードするにはどうすればよいですか?

    2. MySQL-win10のアップグレード後にWampサーバーが機能しない

    3. Cakephp:tinyintフィールドを挿入している間。 0または1のみを取得

    4. PostgreSQLで2つのタイムスタンプの差を計算する方法