sql >> Databasteknik >  >> RDS >> Oracle

Hur kopierar eller uppdaterar man tabellindex och begränsningar från olika databaser?

Jag tror att det inte finns något direkt sätt att få de önskade namnen på begränsningarna och indexen, men ja, du kan uppnå det med lite manuellt arbete enligt följande.

Först och främst kan du ändra begränsningsnamnet med följande kommando:

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

På samma sätt kan du ändra indexnamnet med följande kommando:

ALTER INDEX <index_name> RENAME TO <new_index_name>;

I ditt fall behöver du något sätt att länka dåliga (begränsningar/index) namn med korrekta namn. och döp sedan om begränsningarna/indexen med rätt namn. För att uppnå det kan du prova följande steg. (Jag ger exempel för Constraints, du kan uppnå samma sak för index)

  • Steg 1

Hämta begränsningsnamnen och deras data från produktions-DB använda följande fråga och skapa en tabell i Backup DB använda dessa uppgifter. (Du kan använda SQL Loader eller External table för det.) Ge namnet på denna tabell som 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;
  • Steg 2

Skapa samma typ av tabell i backup DB använder följande fråga:

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

Kör följande fråga i Backup DB som kommer att generera en serie kommandon för att ändra namnet på alla begränsningar för produktions-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 );
  • Steg 4

Kopiera alla kommandon och kör alla i produktions-DB .

Skål!!




  1. Anslut MySQL till MATLAB?

  2. Hur man visar sekvensnummer i MySQL-frågeresultat

  3. Ladda en MySQL innodb-databas i minnet

  4. optimera Query i PostgreSQL