sql >> Databáze >  >> RDS >> Oracle

Jak zkopírovat nebo aktualizovat indexy a omezení tabulek z jiné databáze?

Myslím, že neexistuje žádný přímý způsob, jak získat požadovaná jména omezení a indexů, ale ano, můžete toho dosáhnout s trochou ruční práce, jak je uvedeno níže.

Nejprve můžete změnit název omezení pomocí následujícího příkazu:

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

Stejným způsobem můžete změnit název indexu pomocí následujícího příkazu:

ALTER INDEX <index_name> RENAME TO <new_index_name>;

Ve vašem případě potřebujete nějaký způsob, jak propojit špatná (omezení/indexy) názvy se správnými názvy. a poté přejmenujte omezení/indexy správným názvem. Chcete-li toho dosáhnout, můžete zkusit následující kroky. (Dávám příklad pro omezení, můžete dosáhnout stejného pro indexy)

  • Krok 1

Získejte názvy omezení a jejich data z produkční databáze pomocí následujícího dotazu a vytvořte jednu tabulku v Backup DB pomocí těch dat. (Můžete použít SQL Loader nebo External table pro to.) Zadejte název této tabulky jako 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;
  • Krok 2

Vytvořte stejný typ tabulky v záložní databázi pomocí následujícího dotazu:

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

Proveďte následující dotaz v Backup DB který vygeneruje řadu příkazů pro změnu názvu všech omezení produkční 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 );
  • Krok 4

Zkopírujte všechny příkazy a všechny je spusťte v produkční databázi .

Na zdraví!!




  1. Jak vypsat pouze konkrétní tabulky z MySQL?

  2. Jak mohu použít VBA ke sloučení tabulky v Excelu, kde jsou data rozdělena mezi řádky?

  3. Jak zaregistrovat Pluggable Database (PDB) s nově vytvořeným LISTENER

  4. PHP MYSQL - Vložit do bez použití názvů sloupců, ale s polem automatického přírůstku