DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Определение недостоверности

При изменении объекта зависимые от него объекты становятся недосто­верными. Если это объекты одной базы данных, то зависимые объекты становятся недостоверными сразу же после изменения базового. Это про­исходит очень быстро, поскольку зависимости отслеживаются в словаре данных. Предположим, что имеются две процедуры: Р1 и Р2 (рис. 10.9). Р1 зависит от Р2, т.е. при перекомпиляции Р2 процедура Р1 становится недостоверной. Покажем это на примере сеанса работы в SQL*Plus.


Допустим теперь, что Р1 и Р2 находятся в разных базах данных, и Р1 вызывает Р2, используя соединение баз данных (рис. 10.10). В этом случае перекомтштшция Р2 не влечет за собой немедленной недостоверности Р1, как показано в следующем сеансе работы в SQL*Plus:

Внимание
В этом примере связь баз данных в действительности является обратной петлей (loopback), т.е. указывает на тужебазу данных. Тем не менее выполняются точно такие же действия, как и при размещении Р1 и Р2 в разных базах данных. Использование петли позволяет запрашивать сведения о состоянии Р1 и Р2в одном операторе SELECT.
Так почему же при использовании удаленной процедуры результат по­лучается иным? Дело в том, что в словаре данных не отслеживаются уда­ленные зависимости. Было бы слишком дорого определять достоверность всех зависимых объектов, так как они могут находиться в разных базах данных (которые в момент определения достоверности вполне могут ока­заться
Достоверность удаленных объектов проверяется во время выполне­ния программы. При вызове Р1 запрашивается удаленный словарь данных и определяется состояние Р2 (если удаленная база данных недоступна, уста­навливается ошибка). Р1 и Р2 сравниваются, после чего принимается реше­ние, нужно ли перекомпилировать Р1. Существуют два метода сравнения: метод временных меток и метод сигнатур.
Внимание
Для проверки достоверности на этапе выполнения совсем не обязательно иметь связь баз данных. Если Р1 находится в системе поддержки PL/SQL на станции клиента (например, в Oracle Forms), a P2 — на сервере, то ситуация аналогична и используется один из указанных методов (см. главу 2).
Модель временных меток В этой модели сравниваются временные метки, соответствующие последним модификациям двух объектов. Вре­менная метка (timestamp) содержится в поле last_ddl_time представления user_objects. Если временная метка базового объекта более новая, чем метка зависимого объекта, последний перекомпилируется. При работе с этой моделью нужно учитывать ряд обстоятельств:
При сравнении данных не принимается во внимание местонахожде­ние систем поддержки PL/SQL. Если они находятся в разных часо­вых поясах, сравнение не будет достоверным.
Даже если две системы поддержки расположены в одном часовом поясе, использование модели временных меток может привести к ненужной перекомпиляции. В предыдущем примере Р2 только пере­компилировалась, но на самом деле не изменялась. Р1 в действитель­ности не нужно перекомпилировать, но из-за более старой времен­ной метки это будет сделано.
Проблема становится серьезнее, если Р1 размещена в клиентской системе PL/SQL, например в Oracle Forms. В этом случае существу­ет вероятность того, что Р1 не будет перекомпилирована, поскольку ее исходный код может отсутствовать в варианте Oracle Forms, при­меняемом во время выполнения программы.
 









jAntivirus