Как скопировать или обновить индексы и ограничения таблиц из другой базы данных? - PullRequest
1 голос
/ 03 октября 2019

У нас есть рабочая база данных Oracle 11g, которую таблица отбросила разработчик, который пытается интегрировать во внутреннее веб-приложение. Он сказал, что забыл, что он подключен к производственной базе данных, и выполнил команду php artisan migrate:fresh, которую я искал, и она удаляет все таблицы и создает ее заново.

Затем он попытался восстановить все таблицы с помощью команды flashback,Все было восстановлено, но индексы, ключи и ограничения переименованы.

Можно ли скопировать / обновить структуру таблицы (индекс, ключи, ограничения) нашей резервной базы данных в уязвимую базу данных?

1 Ответ

1 голос
/ 03 октября 2019

Я думаю, что не существует прямого способа получить желаемые имена ограничений и индексов, но да, вы можете достичь этого с небольшим количеством ручной работы следующим образом.

Прежде всего, вы можете изменитьимя ограничения с помощью следующей команды:

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

Таким же образом вы можете изменить имя индекса, используя следующую команду:

ALTER INDEX <index_name> RENAME TO <new_index_name>;

В вашем случае вам нужен какой-то способ связиплохие (ограничения / индексы) имена с правильными именами. а затем переименуйте ограничения / индексы с правильным именем. Чтобы добиться этого, вы можете попробовать следующие шаги. (Я привожу пример для ограничений, вы можете добиться того же для индексов)

  • Шаг 1

Получить имена ограничений и их данные из рабочая БД с использованием следующего запроса и создание одной таблицы в резервной БД с использованием этих данных. (Вы можете использовать SQL Loader или External table для него.) Дайте имя этой таблице как 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;
  • Шаг 2

Создайте таблицу такого же типа в резервной БД , используя следующий запрос:

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;
  • Шаг 3

Выполните следующий запрос в Резервная копия БД , которая сгенерирует серию команд для изменения имени всех ограничений производственной БД

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 );
  • Шаг 4

Скопируйте все команды и выполните их все в производственной базе данных .

Приветствия !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...