sql >> Database >  >> RDS >> Oracle

Hoe tabelindexen en beperkingen uit verschillende databases kopiëren of bijwerken?

Ik denk dat er geen directe manier is om de gewenste namen van de beperkingen en indexen te krijgen, maar ja, je kunt het bereiken met een beetje handmatig werk als volgt.

Allereerst kunt u de naam van de beperking wijzigen met het volgende commando:

alter table <table_name> rename constraint <constarint_name> to <new_constarint_name>;

Op dezelfde manier kunt u de indexnaam wijzigen met de volgende opdracht:

ALTER INDEX <index_name> RENAME TO <new_index_name>;

In jouw geval heb je een manier nodig om slechte (beperkingen/indexen) namen te koppelen aan de juiste namen. en hernoem vervolgens de beperkingen/indexen met de juiste naam. Om dit te bereiken, kunt u de volgende stappen proberen. (Ik geef een voorbeeld voor beperkingen, u kunt hetzelfde bereiken voor indexen)

  • Stap 1

Haal de namen van de beperkingen en hun gegevens op uit de productie-DB gebruik de volgende query en maak één tabel in Backup DB die gegevens gebruiken. (U kunt SQL Loader gebruiken of External table ervoor.) Geef de naam van deze tabel als 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;
  • Stap 2

Maak hetzelfde type tabel in backup DB met de volgende zoekopdracht:

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;
  • Stap 3

Voer de volgende query uit in Backup DB die een reeks opdrachten genereert om de naam van alle beperkingen van productie-DB te wijzigen

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 );
  • Stap 4

Kopieer alle commando's en voer ze allemaal uit in productie-DB .

Proost!!




  1. set-namen vs mysqli_set_charset - zijn ze, behalve dat ze van invloed zijn op mysqli_escape_string, identiek?

  2. Een query nodig om een ​​lijst met gebruikte en ongebruikte tabellen te krijgen

  3. Gegroepeerde tekenreeksaggregatie / LISTAGG voor SQL Server

  4. Oracle PL/SQL Bulk Collect met uitzonderingen opslaan Voorbeeld