Всякий раз, когда мы внедряем изменение в объект базы данных, любой код, который зависит от него, становится недействительным. Это влияет на триггеры, представления и хранимые процедуры. Однако в следующий раз, когда что-то вызовет этот код, база данных автоматически перекомпилирует его.
Так что нам не нужно об этом беспокоиться, верно? Ну да, до определенного момента. Дело в том, что аннулирование триггеров (или чего-то еще) является для нас признаком того, что было сделано изменение, которое может повлиять на работу этого триггера, что может иметь побочные эффекты. Наиболее очевидным побочным эффектом является то, что триггер не скомпилируется. Более тонко, триггер компилируется, но не работает во время операций.
Следовательно, хорошей идеей является принудительная перекомпиляция триггеров в среде разработки, чтобы гарантировать, что наши изменения ничего не сломали. Но мы можем пропустить этот шаг при развертывании наших изменений в производстве, потому что мы уверены, что все будет перекомпилировано по требованию. Зависит от наших нервов :)
Oracle предоставляет механизмы для автоматической перекомпиляции всех недопустимых объектов в схеме.
Самое простое - использовать DBMS_UTILITY.COMPILE_SCHEMA()
. Но с 8i это было изворотливо (потому что поддержка хранимых процедур Java открыла возможности для циклических зависимостей) и больше не гарантирует успешную компиляцию всех объектов с первого раза.
В 9i Oracle дал нам скрипт $ORACLE_HOME/rdbms/admin/utlrp.sql
, который перекомпилировал вещи. К сожалению, это требует доступа SYSDBA.
В 10g они добавили пакет UTL_RECOMP, который в основном делает все, что делает этот скрипт. Это рекомендуемый подход для перекомпиляции большого количества объектов. К сожалению, это также требует доступа SYSDBA. Узнать больше .
В 11g Oracle представила детальное управление зависимостями. Это означает, что изменения в таблицах оцениваются с более высокой степенью детализации (в основном на уровне столбца, а не на уровне таблицы), и затрагиваются только объекты, на которые изменения оказывают непосредственное влияние. Узнайте больше .