Подтвердить что ты не робот

Триггер недействителен в Oracle

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

Не большая проблема.

Просто щелкните правой кнопкой мыши на них, чтобы перекомпилировать, и вам хорошо идти... Я пишу это по собственному опыту.

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

Ответ 3

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