Сопровождение объектных типов и объектных представлений Oracle

Сопровождение объектных типов и объектных представлений Oracle

Продолжаем разговор об объектно-ориентированных возможностях 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;

Какие атрибуты содержит тип foo?

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';

Какой тип данных возвращает метод bar типа foo?

SELECT * FROM                     user_method_results

WHERE type_name =  'FOO' AND method_name = 'BAR';

Как выглядит исходный код foo, включая все команды ALTER?

SELECT text FROM user source

WHERE name = 'FOO'

AND type = 'TYPE' /* или 'TYPE BODY' */ ORDER BY line;

Какие объектные таблицы реализуют foo?

SELECT table_name FROM user_object_tables WHERE table_type =  'FOO';

Какие столбцы содержит объектная табли­ца foo_tab (включая скрытые)?

SELECT column_name, data_type, hidden_column, virtual_column

FROM user_tab_cols

WHERE table name =  'FOO TAB';

Какие столбцы реализуют foo?

SELECT table_name, column_name FROM user_tab_columns WHERE data type =   'FOO';

Какие объекты базы данных зависят от foo?

SELECT name, type FROM                                user_dependencies

WHERE referenced name       = 'FOO';

Какие объектные представления я создал, какие OID при этом использовались?

SELECT view_name, view_type, oid_text FROM user_views

WHERE type text IS NOT NULL;

Как выглядит моя иерархия представле­ний? (Требует использования временной таблицы в версиях Oracle, которые не мо­гут использовать подзапрос с CONNECT BY)

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;

На основе какого запроса было определе­но представление foo_v?

SET LONG 1000 -- or greater SELECT text FROM     user_views

WHERE view name =   'FOO V';

Какие столбцы присутствуют в представле­нии 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 ему недоступны). Другие привилегии DMLINSERT, UPDATE и DELETE — также применяются только к реляционной интерпретации таблицы.

Аналогичным образом получатель не сможет использовать конструктор или другие объектные методы, если только владелец типа объекта не предоставит ему привиле­гию EXECUTE для объектного типа. Все столбцы, определенные в подтипах, останутся невидимыми.

 

Вас заинтересует / Intresting for you:

Значения NULL в PL/SQL Oracle
Значения NULL в PL/SQL Oracle 4826 просмотров Дэн Wed, 01 Jul 2020, 08:10:56
Oracle Text и PL/SQL: многоязы...
Oracle Text и PL/SQL: многоязы... 3507 просмотров Максим Николенко Fri, 18 Oct 2019, 12:41:03
 Версии PL/SQL и Oracle 12c
Версии PL/SQL и Oracle 12c 3429 просмотров Александров Попков Tue, 21 Nov 2017, 13:28:01
Использование SQL*Plus и Oracl...
Использование SQL*Plus и Oracl... 13444 просмотров aleksandr Tue, 21 Nov 2017, 13:19:25
Войдите чтобы комментировать

apv аватар
apv ответил в теме #9881 3 года 2 мес. назад
Часто использую объектные методы при программировании под Оракла. Хорошая шпаргалка по получению информации об объектах, пользовательских типах и т. д. Спасибо!