Неверный триггер в Oracle - PullRequest
13 голосов
/ 08 июля 2010

Некоторые триггеры в моей базе данных становятся недействительными после определенных изменений в таблицах.Но похоже, что они все еще работают.Единственная проблема, с которой я столкнулся, это то, что если я использую SQL Developer, в левой части триггеров есть красные крестики, указывающие, что они недействительны.Это большая проблема?

Я знаю, что могу перекомпилировать триггер, чтобы исправить это, но я не уверен, стоит ли это действительно беспокоить.Если это так, мне нужно будет пересмотреть мои предыдущие сотни изменений и выяснить, что является причиной проблемы.Спасибо.

Ответы [ 3 ]

17 голосов
/ 08 июля 2010

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

Так что нам не нужно об этом беспокоиться, верно? Ну да, до определенного момента. Дело в том, что аннулирование триггеров (или чего-то еще) является для нас признаком того, что было сделано изменение, которое может повлиять на работу этого триггера, что может иметь побочные эффекты. Наиболее очевидным побочным эффектом является то, что триггер не скомпилируется. Более тонко, триггер компилируется, но не работает во время операций.

Следовательно, хорошей идеей является принудительная перекомпиляция триггеров в среде разработки, чтобы гарантировать, что наши изменения ничего не сломали. Но мы можем пропустить этот шаг при развертывании наших изменений в производстве, потому что мы уверены, что все будет перекомпилировано по требованию. Зависит от наших нервов :)

Oracle предоставляет механизмы для автоматической перекомпиляции всех недопустимых объектов в схеме.

  • Самое простое - использовать DBMS_UTILITY.COMPILE_SCHEMA(). Но с 8i это было изворотливо (потому что поддержка хранимых процедур Java открыла возможности для циклических зависимостей) и больше не гарантирует успешную компиляцию всех объектов с первого раза.

  • В 9i Oracle дал нам скрипт $ORACLE_HOME/rdbms/admin/utlrp.sql, который перекомпилировал вещи. К сожалению, это требует доступа SYSDBA.

  • В 10g они добавили пакет UTL_RECOMP, который в основном делает все, что делает этот скрипт. Это рекомендуемый подход для перекомпиляции большого количества объектов. К сожалению, это также требует доступа SYSDBA. Узнать больше .

В 11g Oracle представила детальное управление зависимостями. Это означает, что изменения в таблицах оцениваются с более высокой степенью детализации (в основном на уровне столбца, а не на уровне таблицы), и затрагиваются только объекты, на которые изменения оказывают непосредственное влияние. Узнайте больше .

0 голосов
/ 08 июля 2010

Если триггеры работают, то, скорее всего, Oracle перехватывает ошибку ORA-04068, когда запускает триггер, и повторяет попытку после его автоматической перекомпиляции.

0 голосов
/ 08 июля 2010

Совсем не большая проблема.

Просто щелкните правой кнопкой мыши по ним, чтобы перекомпилировать, и вы готовы к работе ... Я пишу это из собственного опыта.есть ошибки в коде, который вы только что изменили, они появятся, чтобы вы могли это исправить.Компилятор сообщит вам, где проблемы (номера строк, имена переменных и т. Д.) В случае ошибок.

...