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í!!