Продолжаем разговор об объектно-ориентированных возможностях Oracle и PL/SQL в целом, и об объектных представлениях в частности. При работе с объектными типами существует несколько способов получения информации о созданных вами типах и представлениях. Если возможностей команды SQL*Plus DESCRIBE
окажется недостаточно, вероятно, придется перейти на прямые запросы к словарю данных Oracle.
Словарь данных
Типы, определяемые пользователем (объекты и коллекции), в словаре данных относятся к категории TYPE
. Определения и тела объектных типов находятся в представлении USER_SOURCE
(или DBA_SOURCE
, или ALL_SOURCE
), как и спецификации и тела пакетов. В табл. 1 перечислены некоторые полезные запросы.
Таблица 1. Элементы словаря данных для объектных типов
Вопрос | Запрос, используемый для получения ответа |
Какие объектные типы и типы коллекций я создал? | SELECT * FROM user types; SELECT * FROM user_objects WHERE object type = 'TYPE'; |
Как выглядят мои иерархии объектных типов? | SELECT RPAD(' ', 3*(LEVEL-1)) || type name FROM user_types WHERE typecode = 'OBJECT' CONNECT BY PRIOR type name = supertype name; |
Какие атрибуты содержит тип | SELECT * FROM user_type_attrs WHERE type_name = 'FOO'; |
Какие методы содержит тип foo? | SELECT * FROM user_type_methods WHERE type_name = 'FOO'; |
Какие параметры получают методы foo? | SELECT * FROM user_method_params WHERE type_name = 'FOO'; |
Какой тип данных возвращает метод | SELECT * FROM user_method_results WHERE type_name = 'FOO' AND method_name = 'BAR'; |
Как выглядит исходный код | SELECT text FROM user source WHERE name = 'FOO' AND type = 'TYPE' /* или 'TYPE BODY' */ ORDER BY line; |
Какие объектные таблицы реализуют | SELECT table_name FROM user_object_tables WHERE table_type = 'FOO'; |
Какие столбцы содержит объектная таблица f | SELECT column_name, data_type, hidden_column, virtual_column FROM user_tab_cols WHERE table name = 'FOO TAB'; |
Какие столбцы реализуют | SELECT table_name, column_name FROM user_tab_columns WHERE data type = 'FOO'; |
Какие объекты базы данных зависят от | SELECT name, type FROM user_dependencies WHERE referenced name = 'FOO'; |
Какие объектные представления я создал, какие | SELECT view_name, view_type, oid_text FROM user_views WHERE type text IS NOT NULL; |
Как выглядит моя иерархия представлений? (Требует использования временной таблицы в версиях Oracle, которые не могут использовать подзапрос с | CREATE TABLE uvtemp AS SELECT v.view_name, v.view_type, v.superview_name, v1.view_type superview_type FROM user_views v, user_views v1 WHERE v.superview_name = v1.view_name (+); SELECT RPAD(' ', 3*(LEVEL-1)) || view_name || ' (' || view_type || ') ' FROM uvtemp CONNECT BY PRIOR view_type = superview_type; DROP TABLE uvtemp; |
На основе какого запроса было определено представление | SET LONG 1000 -- or greater SELECT text FROM user_views WHERE view name = 'FOO V'; |
Какие столбцы присутствуют в представлении | SELECT column_name, data_type_mod, data_type FROM user_tab_columns WHERE table name = 'FOO V'; |
При работе со словарем данных Oracle могут возникнуть недоразумения из-за того, что объектные таблицы не видны в представлении USER_TABLES
. Вместо этого список объектных таблиц присутствует в USER_OBJECT_TABLES
(а также USER_ALL_TABLES
).
Привилегии
С объектными типами связана группа привилегий системного уровня:
CREATE [ ANY ] TYPE
— создание, изменение и удаление объектных типов и тел типов.ANY
означает «в любой схеме».CREATE [ ANY ] VIEW
— создание и удаление представлений, включая объектные представления.ANY
означает «в любой схеме».ALTER ANY TYPE
— использование средствALTER TYPE
с типами в любой схеме.EXECUTE ANY TYPE
— использование объектного типа из любой схемы для таких целей, как создание экземпляров, выполнение методов, обращение по ссылкам и разыменование.UNDER ANY TYPE
— создание подтипа в одной схеме как производного от типа в любой другой схеме.UNDER ANY VIEW
— создание подпредставления в одной схеме как производного от представления в любой другой схеме.
Всего существуют три разновидности привилегий объектного уровня для объектных типов: EXECUTE
, UNDER
и DEBUG
. Также важно понимать, как традиционные привилегии DML применяются к объектным таблицам и представлениям.
Привилегия EXECUTE
Если вы хотите, чтобы ваш коллега Джо использовал один из ваших типов в своих программах PL/SQL или таблицах, предоставьте ему привилегию EXECUTE
:
GRANT EXECUTE on catalog_item_t TO joe;
Если Джо обладает привилегией, необходимой для создания синонимов, и работает в Oracle9i Database Release 2 и выше, он сможет создать синоним:
CREATE SYNONYM catalog_item_t FOR scott.catalog_item_t;
и использовать его следующим образом:
CREATE TABLE catalog_items OF catalog_item_t;
или так:
DECLARE
an_item catalog_item_t;
Джо также может использовать уточненную ссылку на тип scott.catalog_item_t
.
Если вы ссылаетесь на объектный тип в хранимой программе, а потом предоставляете привилегию EXECUTE
для этой программы пользователю или роли, наличие этой привилегии для типа не обязательно, даже если программа определяется с правами вызывающего. Аналогичным образом, если пользователь имеет привилегию DML
для представления, содержащего триггер INSTEAD OF
для этой операции DML, пользователю не понадобятся явные привилегии EXECUTE
, если триггер ссылается на объектный тип, потому что триггеры выполняются с моделью прав создателя. Тем не менее привилегия EXECUTE
необходима для пользователей, выполняющих анонимные блоки, в которых используется объектный тип.
Привилегия UNDER
Привилегия UNDER дает право создания подтипов. Она предоставляется следующим образом:
GRANT UNDER ON image_t TO scott;
Чтобы схема могла создать подтип, необходимо определить супертип с правами вызывающего (AUTHID CURRENT_USER
).
Она также может дать получателю право создания подпредставления:
GRANT UNDER ON images_v TO scott;
Привилегия DEBUG
Если ваш коллега использует отладчик PL/SQL для анализа кода, использующего созданный вами тип, вы можете предоставить ему привилегию DEBUG
:
GRANT DEBUG ON image_t TO joe;
Предоставление этой привилегии позволит другому разработчику заглянуть «за кулисы», изучить переменные, использованные в типе, и установить точки прерывания внутри методов.
Привилегия DEBUG
также применяется к объектным представлениям, давая возможность отладки исходного кода PL/SQL триггеров INSTEAD OF
.
Привилегии DML
Для объектных таблиц традиционные привилегии SELECT
, INSERT
, UPDATE
и DELETE
также имеют смысл. Пользователь, обладающий только привилегией SELECT
для объектной таблицы, может загрузить любые реляционные столбцы базового типа, на котором основана таблица, но ему не удастся загрузить объект как объект (то есть VALUE
, TREAT
, REF
и DEREF
ему недоступны). Другие привилегии DML
— INSERT
, UPDATE
и DELETE
— также применяются только к реляционной интерпретации таблицы.
Аналогичным образом получатель не сможет использовать конструктор или другие объектные методы, если только владелец типа объекта не предоставит ему привилегию EXECUTE
для объектного типа. Все столбцы, определенные в подтипах, останутся невидимыми.