Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie kopiere oder aktualisiere ich Tabellenindizes und Constraints aus verschiedenen Datenbanken?

Ich denke, es gibt keinen direkten Weg, um die gewünschten Namen der Einschränkungen und Indizes zu erhalten, aber ja, Sie können es mit ein wenig manueller Arbeit wie folgt erreichen.

Zunächst können Sie den Einschränkungsnamen mit dem folgenden Befehl ändern:

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

Auf die gleiche Weise können Sie den Indexnamen mit dem folgenden Befehl ändern:

ALTER INDEX <index_name> RENAME TO <new_index_name>;

In Ihrem Fall benötigen Sie eine Möglichkeit, fehlerhafte Namen (Einschränkungen/Indizes) mit korrekten Namen zu verknüpfen. und benennen Sie dann die Einschränkungen/Indizes mit dem richtigen Namen um. Um dies zu erreichen, können Sie die folgenden Schritte ausprobieren. (Ich gebe ein Beispiel für Constraints, Sie können dasselbe für Indizes erreichen)

  • Schritt 1

Rufen Sie die Einschränkungsnamen und ihre Daten aus der Produktionsdatenbank ab Verwenden Sie die folgende Abfrage und erstellen Sie eine Tabelle in der Sicherungsdatenbank Verwenden dieser Daten. (Sie können SQL Loader verwenden oder External table dafür.) Geben Sie den Namen dieser Tabelle als PROD_DB_CONS an

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;
  • Schritt 2

Erstellen Sie den gleichen Tabellentyp in der Backup-DB mit folgender Abfrage:

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

Führen Sie die folgende Abfrage in Backup DB aus Dadurch wird eine Reihe von Befehlen generiert, um den Namen aller Einschränkungen der Produktions-DB

zu ändern
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 );
  • Schritt 4

Kopieren Sie alle Befehle und führen Sie sie alle in der Produktions-DB aus .

Prost!!