Какие ситуации приводят к тому, что пакеты Oracle становятся недействительными?
-
06-07-2019 - |
Вопрос
Сценарий, который создал этот вопрос:
У нас есть пакет, который является зависимостью от другого пакета, иногда внося изменения в " parent " пакет заставляет зависимый пакет становиться недействительным, но иногда это не так. Р>
Это застало нас врасплох раньше.
Было бы очень полезно просто понять, что вызывает аннулирование, чтобы я мог предсказать / спланировать это.
Решение
Изменение любого объекта, на который опирается пакет (например, таблиц, представлений, триггеров, других пакетов), автоматически помечает пакет как недействительный. Как указано выше в Tuinstoel, Oracle достаточно умен, чтобы перекомпилировать пакет при первом его использовании. Р>
Если вас это беспокоит, каждый раз, когда вы вносите изменения в схему (например, таблицы, представления, триггеры, процедуры), запускайте DBMS_UTILITY.compile_schema
(или ваш администратор базы данных делает это). Это заставит скомпилировать все пакеты и даст вам знать, где или если есть ошибки, прежде чем вы найдете их сложным способом. Р>
Другие советы
Или вы можете запросить следующую таблицу, чтобы узнать, какие у вас зависимости
select *
from dba_dependencies
where name = 'YOUR_PACKAGE'
and referenced_owner = 'ANYUSER' --- Comment this out if you are looking for yourself
and owner = USER --- Or can be set to any user
Это покажет все зависимости. Для ваших объектов запросите user_dependencies.
Кстати, если я полностью ошибаюсь из-за ситуации ... заранее извиняюсь
застигнуты врасплох? Р>
Не уверен, что это означает ...
Что-то сломалось в производстве? Р>
Что именно произошло?
Причина, по которой я спрашиваю, состоит в том, что понять последствия каждого возможного изменения гораздо сложнее, чем иметь дело с результатом. Почему недействительность стала проблемой? Я предполагаю, что вы получили "существующее состояние пакета", которое было отклонено ". ошибка в вашем приложении. Это REAL проблема?
Опять же, я подозреваю, что это так, и если так, давайте просто разберемся с этим, а не со списком изменений, который, как я добавил в комментарии, зависит от версии. (11g отслеживает зависимость вплоть до столбца таблицы, а не таблицы в целом, например).
Это может показаться вам не важной ошибкой, если вы не используете состояние пакета. Если бы вы были, это было бы важной ошибкой, и вы бы не удивились, так что я полагаю, что это не так.
Поскольку это не так, эту ошибку можно игнорировать. Поскольку вы можете спокойно проигнорировать его, вы можете закодировать свое клиентское приложение, чтобы проигнорировать эту ошибку и повторить ваш вызов, потому что, как отмечали другие, Oracle перекомпилирует ваш пакет для вас. Это стоящее упражнение. Потому что вместо того, чтобы знать все возможные вещи, о которых вам нужно беспокоиться, когда вы вносите изменения, а затем в аварийном исправлении вы забываете одно из них, ваше приложение просто справится с этим и будет двигаться дальше, без беспокойства.
Я согласен с Томасом Джонсом-Лоу, однако есть еще пара вопросов, связанных с длинными сеансами и перекомпиляцией.
Если вы ссылаетесь на пакет в сеансе, и этот пакет (или зависимый пакет) перекомпилируется во время того же сеанса, то вы получите сообщение об ошибке "ORA-06508: PL / SQL: не удалось найти программный модуль, вызываемый "" ; р>
Как только вы ссылаетесь на пакет в сеансе, вы, как правило, не можете изменить пакет, не аннулировав его для этого сеанса. Это особая проблема для сред разработки, где пакеты часто меняются, но также и для производственных сред, где вы хотите сделать небольшое исправление, не разрушая всю среду. Обратите внимание, что эта ошибка будет возникать, даже если в измененных пакетах ошибок нет.
В дополнение к ответу Томаса Джонса-Лоу, если вы измените только пакет BODY, зависимый объект может быть не помечен как недействительный. Р>
Однако, как только вы измените спецификацию пакета, это обязательно произойдет.
Если попытаться выполнить неверный пакет Oracle, Oracle попытается скомпилировать его. Только когда он останется недействительным после компиляции, Oracle выдаст исключение. Р>