При изменении объекта зависимые от него объекты становятся недостоверными. Если это объекты одной базы данных, то зависимые объекты становятся недостоверными сразу же после изменения базового. Это происходит очень быстро, поскольку зависимости отслеживаются в словаре данных. Предположим, что имеются две процедуры: Р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, применяемом во время выполнения программы.
< Предыдущая | Следующая > |
---|