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

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

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

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

Ответы [ 3 ]

20 голосов
/ 14 февраля 2012

Если вы

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;
12 голосов
/ 14 февраля 2012

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

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

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

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

1 голос
/ 14 февраля 2012
ALTER TABLE oldName RENAME TO newName

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

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