Как переименовать таблицу в Oracle, чтобы обновить все внешние ключи, ограничения, триггеры и последовательности и сохранить все существующие данные?



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



Как я могу быть уверен, что ничего не сломал?



Обратите внимание, что я хочу сохранить все существующие данные, содержащиеся в таблице.

716   3  

3 ответов:

Это зависит от того, что вы подразумеваете под "любые внешние ключи, ограничения, триггеры и последовательности, ссылающиеся на таблицу, обновляются для использования нового имени."

Все существующие индексы, ограничения и триггеры для переименовываемой таблицы будут автоматически ссылаться на новое имя. Однако любые соглашения об именовании, используемые для этих объектов, не будут автоматически использовать обновленное имя. Например, если первичный ключ для TABLE_NAME обычно называется TABLE_NAME_PK, переименование TABLE_NAME в NEW_TABLE_NAME не будет автоматически переименуйте ограничение первичного ключа в NEW_TABLE_NAME_PK. Необходимо проверить код-пакеты, процедуры и функции, которые ссылаются на старое имя таблицы, а также любые триггеры, которые ссылаются на старое имя таблицы. Аналогично, представления против старого имени таблицы также будут ломаться. Представление ALL_DEPENDENCIES может помочь определить, какие из этих объектов нуждаются в обновлении.

Если вы

ALTER TABLE old_table_name
 RENAME TO new_table_name;

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

Теперь, хотя ограничения и триггеры будут продолжать работать правильно, они сохранят свои первоначальные имена. Если у вас есть соглашения об именовании для этих объектов, которые вы хотите сохранить после имени таблицы, вам нужно будет сделать больше. Например, если вы хотите, чтобы триггер уровня строки перед вставкой в таблицу FOO был назван TRG_BI_FOO, и вы переименуете таблицу в BAR, вам нужно будет явно изменить триггер, чтобы изменить его имени
ALTER TRIGGER trg_bi_foo
  RENAME TO trg_bi_bar;

Аналогично, вам нужно переименовать ограничения и индексы

ALTER TABLE bar
  RENAME CONSTRAINT pk_foo TO pk_bar;
ALTER TABLE oldName RENAME TO newName

Сохранит зависимости и данные таблицы, но всегда может быть фрагмент PL / SQL, который ссылается на старое имя, которое станет недействительным.

Comments

    Ничего не найдено.