Переименование таблицы, оставляя существующие триггеры позади
Было принято решение объединить несколько существующих таблиц в кластер.
Это, очевидно, означает, что таблицы должны быть воссозданы, чтобы их можно было кластеризовать вместе, однако существующие данные должны быть сохранены.
Естественно, я предполагаю, что процедура будет выглядеть примерно так:
- Резервное копирование существующей таблицы под другим именем (через переименование или что-то)
- Создать новую кластерную таблицу под старым именем
- Скопируйте все данные из резервной таблицы во вновь созданную.
Однако текущей таблице назначено несколько триггеров (и исправьте меня, если я здесь ошибаюсь, но), когда я выполню операцию переименования над этой таблицей, я предполагаю, что все триггеры, назначенные ей в порядке удобства, будут рефакторизовать себя соответствовать новому имени.
В этом случае идеальным сценарием, вероятно, будет то, что триггеры временно "отсоединятся" от таблицы после того, как она будет переименована (все еще указывают на старое имя таблицы, которого не будет в этой точке), а затем снова будет работать, когда Появится вновь созданная кластерная таблица.
Однако я не уверен, возможно ли это.
Таким образом, здесь возникает вопрос: могу ли я оставить триггеры позади при переименовании таблицы или я должен иметь дело с ними вручную?
2 ответа
Да, вы правы: при переименовании таблицы связанные с ней триггеры все равно будут ссылаться на ту же таблицу. (Обратите внимание, что имена триггеров не будут переименованы).
У меня была эта проблема, поэтому я написал скрипт, который использовал DMBS_METADATA.GET_DDL
извлечь код триггера (ов) для таблицы. Процесс был:
Для каждого стола T
:
- Для каждого триггера, ограничения, проверочные ограничения, не-pk индексы на
T
извлечь в DDL с помощьюDMBS_METADATA.GET_DDL
- Переименовать таблицу
T
вOLD_TABLE_NAME
- Создайте новую таблицу (вы можете использовать CTAS, если хотите перенести данные)
- Удалить (или переименовать) все триггеры, ограничения, индексы из
OLD_TABLE_NAME
- Запустите извлеченный DDL, чтобы воссоздать триггер, ограничение, индексы для новой таблицы.
Триггеры не ссылаются на таблицу по имени, это делает только DDL, который их создает. Они ссылаются на внутренний идентификатор таблицы, поэтому при переименовании таблицы триггер не меняется вообще. Однако если вы перепроектируете DDL для триггера из базы данных, код, конечно, будет ссылаться на новое имя таблицы. Код внутри триггера не изменяется, если он конкретно ссылается на имя таблицы, но, надеюсь, это не так.
Поэтому, конечно, триггеры не могут быть отделены от таблицы, и лучшее, что вы можете сделать, это экспортировать DDL для триггеров, привилегии индексов и т. Д.
Точно так же индексы не ссылаются напрямую на имена таблиц.
Похоже, основная проблема здесь заключается в том, что вы не используете репозиторий кода, поскольку это позволит вам просто перезапустить сценарии, необходимые для предоставления привилегий, создания индексов, применения триггера и т. Д. После переименования таблицы и отбрасывания связанных элементов схемы.