Зависимыми могут быть следующие объекты базы данных:
· Представления
· Процедуры
· Функции
· Спецификации пакетов
· Тела пакетов
· Триггеры базы данных
Зависимые объекты могут содержать в своем описании ссылки на следующие объекты базы данных:
· Таблицы
· Представления
· Последовательности
· Синонимы
· Процедуры
· Функции
· Спецификации пакетов
При изменении определения ссылаемого объекта, зависимые объекты приобретают статус INVALID. Статус объекта отображается в колонке STATUS представления USER_OBJECTS словаря данных. В зависимости от характера произведенных изменений в описании ссылаемого объекта, зависимый объект или может быть автоматически перекомпилирован сервером базы данных, или не может быть использован без внесения поправок.
Зависимости могут быть прямыми, когда зависимый объект прямо ссылается на объекты базы данных, или непрямыми, когда зависимый объект ссылается на объекты базы данных через другие объекты (подпрограмма ссылается на представление, которое зависит от таблицы базы данных).
Если все объекты находятся в одной и той же базе данных, обслуживаемой одним экземпляром Oracle, зависимости между ними являются локальными. В этом случае при изменении определения ссылаемого объекта, все зависимые объекты приобретают статус INVALID. При следующем обращении к такому объекту сервер Oracle автоматически перекомпилирует его. Если компиляция пройдет без ошибок, зависимый объект будет доступен. Этот процесс происходит прозрачно для пользователя, который может даже не заметить, что зависимый объект какое-то время имел статус INVALID. Немного увеличится время отклика, т.к. компиляция объекта занимает определенное время.
Информацию о прямых зависимостях между объектами базы данных можно получить через представление USER_DEPENDENCIES словаря данных.
Колонка |
Описание |
NAME |
Имя зависимого объекта базы данных |
TYPE |
Тип зависимого объекта (PROCEDURE, FUNCTION, PACKAGE, PACKAGE BODY) |
REFERENCED_OWNER |
Схема, в которой находится ссылаемый объект |
REFERENCED_NAME |
Имя ссылаемого объекта |
REFERENCED_TYPE |
Тип ссылаемого объекта |
SQL> SELECT name, type, referenced_name, referenced_type
2 FROM user_dependencies
3 WHERE referenced_name='EMP';
NAME TYPE REFERENCED_NAME REFERENCED_T
-------------------- ------------ -------------------- ------------
PRES_SAL FUNCTION EMP TABLE
EMP_SAL PROCEDURE EMP TABLE
Чтобы получить информацию о непрямых зависимостях, необходимо заполнить таблицы базы данных DEPTREE и IDEPTREE, выполнив хранимую процедуру DEPTREE_FILL. Таблицы и процедура должны быть предварительно созданы администратором базы данных.
При изменении определения ссылаемых объектов сервер базы данных пытается автоматически перекомпилировать зависимые хранимые процедуры и функции при первом же обращении к ним. Если компиляция прошла успешно, перекомпилированные объекты приобретают статус VALID.
Хранимые программные единицы могут быть перекомпилированы явно с помощью команд DDL ALTER PROCEDURE и ALTER FUNCTION.
ALTER PROCEDURE имя_процедуры COMPILE
ALTER FUNCTION имя_функции COMPILE
Перекомпиляция зависимых объектов пройдет успешно
· При добавлении колонки к ссылаемой таблице
· Если типы данных ссылаемых колонок не изменяются
SQL> ALTER TABLE emp ADD (comments VARCHAR2(100));
Table altered.
SQL> SELECT object_name, object_type, status FROM user_objects
2 WHERE object_type='PROCEDURE' OR object_type='FUNCTION';
OBJECT_NAME OBJECT_TYPE STATUS
-------------------- ------------------ -------
EMP_SAL PROCEDURE INVALID
PRES_SAL FUNCTION INVALID
SQL> SELECT ename, sal, pres_sal(sal) FROM emp WHERE LOWER(job)='clerk';
ENAME SAL PRES_SAL(SAL)
---------- ---------- -------------
SMITH 800 1300
ADAMS 1100 1600
JAMES 950 1450
MILLER 1300 1800
SQL> SELECT object_name, object_type, status FROM user_objects
2 WHERE object_type='PROCEDURE' OR object_type='FUNCTION';
OBJECT_NAME OBJECT_TYPE STATUS
-------------------- ------------------ -------
EMP_SAL PROCEDURE INVALID
PRES_SAL FUNCTION VALID
Перекомпиляция зависимых объектов пройдет с ошибками, если
· Удален или переименован ссылаемый объект
· Изменен тип данных ссылаемой колонки
· Ссылаемое представление пересоздано с другими колонками
· Изменен список формальных параметров ссылаемой подпрограммы
SQL> RENAME emp TO emp_new;
Table renamed.
SQL> SELECT object_name, object_type, status FROM user_objects
2 WHERE object_type='PROCEDURE' OR object_type='FUNCTION';
OBJECT_NAME OBJECT_TYPE STATUS
-------------------- ------------------ -------
EMP_SAL PROCEDURE INVALID
PRES_SAL FUNCTION INVALID
SQL> SELECT ename, sal, pres_sal(sal) FROM emp WHERE LOWER(job)='clerk';
SELECT ename, sal, pres_sal(sal) FROM emp WHERE LOWER(job)='clerk'
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> SELECT object_name, object_type, status FROM user_objects
2 WHERE object_type='PROCEDURE' OR object_type='FUNCTION';
OBJECT_NAME OBJECT_TYPE STATUS
-------------------- ------------------ -------
EMP_SAL PROCEDURE INVALID
PRES_SAL FUNCTION INVALID
Чтобы перекомпиляция зависимых объектов после изменения определений ссылаемых объектов проходила успешно, выполняйте следующие рекомендации при создании программных единиц:
· Описывайте локальные идентификаторы, используя атрибуты %TYPE и %ROWTYPE
· При чтении данных из таблиц базы данных используйте нотацию SELECT *
· При добавлении данных в таблицу базы данных явно указывайте список колонок в предложении INSERT
1. Вильям Дж. Пэйдж Использование Oracle8/8i: пер. с англ. – М.: Издательский дом "Вильямс", 1999.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.