Как переименовать таблицу в Oracle, чтобы обновить все внешние ключи, ограничения, триггеры и последовательности и сохранить все существующие данные?
Мне нужно переименовать таблицу в Oracle, но я хочу быть уверен, что все внешние ключи, ограничения, триггеры и последовательности, ссылающиеся на таблицу, будут обновлены, чтобы использовать новое имя.
Как я могу быть уверен, что ничего не сломал?
Обратите внимание, что я хочу сохранить все существующие данные, содержащиеся в таблице.
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