В лекции № 7 "Введение в Oracle SQL" в подразделе "Несамостоятельность группировки с обобщениями ROLLUP, CUBE и GROUPING SETS" представленная таблица сравнения содержит ошибки - окончания запросов пропущены. Видимо, ошибки вызваны некорректным переносом материала лекции. |
Лекция 12: Служебные виды объектов. Работа с редакциями объектов
Некоторые общие свойства объектов хранения разных видов
Формально в Oracle имеется несколько десятков разных видов хранимых в БД объектов. Некоторое представление о многообразии дает запрос:
SELECT DISTINCT object_type FROM all_objects;
(Не все из них управляются командами SQL CREATE/ALTER/DROP, значительная часть — процедурно.)
Некоторые группы видов объектов хранения объединены общими свойствами. Например, переименование объекта командой RENAME выполняется для таблиц, представлений данных, генераторов последовательности и для частных синонимов. О подобных общих свойствах говорится ниже.
Пространства имен для объектов в Oracle
Для именования объектов хранения Oracle разных видов используются различные пространства имен. Распределение по пространствам имен для наиболее популярных типов поясняется таблицей.
Отдельное общее пространство имен | Отдельные собственные пространства имен |
---|---|
Таблицы
Представления данных Генераторы последовательностей из чисел Частные синонимы Хранимые процедуры Хранимые функции Пакеты Материализованные представления данных Собственные типы пользователей … |
Индексы
Заявляемые ограничения целостности Кластеры Частные связи с иной БД Каталог в ОС Публичные синонимы Публичные связи с иной БД … |
Например, разрешено назвать в одной схеме одним и тем же именем таблицу, индекс, ограничение целостности и каталог. При работе со схемой SCOTT следующие команды не вызовут ошибок:
CREATE UNIQUE INDEX emp ON emp ( ename ) ; -- Ошибки нет. ALTER TABLE emp ADD CONSTRAINT emp UNIQUE ( ename ) USING INDEX emp ; -- Ошибки нет.
Не разрешено назвать в одной схеме одним и тем же именем таблицу и представление данных, таблицу и функцию и так далее. При работе со схемой SCOTT следующие команды вернут в программу ошибку:
VIEW emp AS SELECT * FROM emp ; -- Ошибка !. CREATE SEQUENCE emp ; -- Ошибка !
Редакции объектов БД в Oracle
С версии 11.2 для некоторых видов хранимых объектов можно заводить разные "редакции" (editions) и переключаться между ними в работе, моделируя тем самым несколько версий прикладного программного обеспечения на этапе его разработки или переделки. Речь не идет о редакциях данных, и на таблицы эта техника не распространяется. Она применима к объектам следующих видов:
Основное применение техники редакций объектов можно видеть в области поддержки и развития приложения. Она позволяет выполнять часть работ по внесению изменений в существующее прикладное ПО, не останавливая использование рабочей системы, и отлаживать нововведения в параллель основной работе.
Создание редакций конкретных объектов сопряжено с определенными ограничениями. Скажем, нельзя создавать публичный синоним на редакцию объекта (к примеру, на редакцию какой-нибудь функции или какого-нибудь представления).
В версии Oracle 11.2 техника редакций объектов воплощена в своем начальном варианте, вероятно, не окончательном.
Создание редакций для объектов и управление ими
Управление редакциями регулируется привилегиями CREATE/ALTER/DROP ANY EDITION. Слово ANY в названиях напоминает о внесхемном характере редакций, распространяющемся на уровень всей БД целиком (формально они все приписаны пользователю SYS).
Если правом создавать редакции объектов и управлять ими требуется доверить пользователю YARD, администратору БД следует выдать:
CONNECT / AS SYSDBA GRANT CREATE ANY EDITION, DROP ANY EDITION TO yard; Узнать действующую в данный момент редакцию можно из контекста сеанса USERENV (встроенного в СУБД): SQL> CONNECT yard/pass Connected. SQL> SELECT SYS_CONTEXT ( 'USERENV', 'CURRENT_EDITION_NAME' ) FROM dual; SYS_CONTEXT('USERENV','CURRENT_EDITION_NAME') -------------------------------------------------------------------- ORA$BASE
ORA$BASE — это встроенная в БД умолчательно действующая редакция, на основе которой администратор может создавать последовательность редакций (а в будущих версиях Oracle, возможно, дерево) на свое усмотрение. Имя умолчательной для БД редакции можно выяснить запросом
SELECT property_value FROM database_properties WHERE property_name = 'DEFAULT_EDITION' ;
Примеры создания редакций:
CREATE EDITION app_release_1; CREATE EDITION app_release_2 AS CHILD OF app_release_1;
В первом случае редакция APP_RELEASE_1 была создана на основе умолчательно действующей редакции ORA$BASE, во втором — как следует из текста команды.
Откомментировать редакцию в словаре-справочнике БД можно командой COMMENT:
COMMENT ON EDITION app_release_1 IS 'The first release of application' ;
Снять комментарий можно, указав пустую строку ''. Наблюдаются комментарии через таблицу ALL_EDITION_COMMENTS.
Узнать существующие редакции в их взаимосвязи можно запросом к особой таблице:
SQL> SELECT * FROM all_editions; EDITION_NAME PARENT_EDITION_NAME USA ------------------------------ ------------------------------ --- ORA$BASE YES APP_RELEASE_1 ORA$BASE YES APP_RELEASE_2 APP_RELEASE_1 YES
Удалить можно только лист из дерева (пока — ветки), свободный от подчиненных редакций:
DROP EDITION app_release_2;
Для того чтобы пользователь Oracle мог не просто обращаться с редакциями объектов, но и формировать их, ему следует сообщить особое качество:
CONNECT / AS SYSDBA ALTER USER yard ENABLE EDITIONS;
Качество ENABLE EDITIONS — не изначальное и неотъемлемое; если оно раз выдано, отменить его нельзя. В результате все пользователи Oracle оказываются разделены на две категории: те, кому разрешено формировать редакции, и те, кому не разрешено. При том возможен перевод пользователя из второй категории в первую, но никак не обратно. Удостовериться в наличие свойства ENABLE EDITIONS у пользователя можно по значению поля EDITIONS_ENABLED (нового в версии 11.2) в таблице DBA_USERS (владелец ее SYS, и обычным пользователям сама по себе она не видна).
После выдачи последней команды каждый объект пользователя YARD, для которого разрешено редактирование, так или иначе будет привязан к какой-нибудь редакции.