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

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

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

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

Ответ 1

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

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

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

Что нужно проверить, это код - пакеты, процедуры и функции - которые ссылаются на имя старой таблицы, а также на любые триггеры, которые ссылаются на имя старой таблицы. Точно так же будут разбиты и взгляды на имя старой таблицы. Вид ALL_DEPENDENCIES может помочь определить, какой из этих объектов необходимо обновить.

Ответ 2

Если вы

ALTER TABLE old_table_name
 RENAME TO new_table_name;

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

Теперь, когда ограничения и триггеры будут продолжать работать корректно, они сохранят свои исходные имена. Если у вас есть соглашения об именах для этих объектов, которые вы хотите сохранить после имени таблицы, вам нужно будет сделать больше. Например, если вы хотите, чтобы уровень строки до триггера insert в таблице 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;

Ответ 3

ALTER TABLE oldName RENAME TO newName

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