Опубликован: 28.12.2011 | Доступ: свободный | Студентов: 7487 / 958 | Оценка: 3.81 / 3.53 | Длительность: 19:30:00
ISBN: 978-5-9963-0488-2

Лекция 12: Служебные виды объектов. Работа с редакциями объектов

< Лекция 11 || Лекция 12: 12345 || Лекция 13 >

Некоторые общие свойства объектов хранения разных видов

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

  • VIEW
  • SYNONYM
  • PROCEDURE
  • FUNCTION
  • TRIGGER
  • PACKAGE/PACKAGE BODY
  • TYPE/TYPE BODY
  • LIBRARY

Основное применение техники редакций объектов можно видеть в области поддержки и развития приложения. Она позволяет выполнять часть работ по внесению изменений в существующее прикладное ПО, не останавливая использование рабочей системы, и отлаживать нововведения в параллель основной работе.

Создание редакций конкретных объектов сопряжено с определенными ограничениями. Скажем, нельзя создавать публичный синоним на редакцию объекта (к примеру, на редакцию какой-нибудь функции или какого-нибудь представления).

В версии 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, для которого разрешено редактирование, так или иначе будет привязан к какой-нибудь редакции.

< Лекция 11 || Лекция 12: 12345 || Лекция 13 >
Ярослав Прозоров
Ярослав Прозоров

В лекции № 7 "Введение в Oracle SQL" в подразделе "Несамостоятельность группировки с обобщениями ROLLUP, CUBE и GROUPING SETS"  представленная таблица сравнения содержит ошибки - окончания запросов пропущены. Видимо, ошибки вызваны некорректным переносом материала лекции.

Володимир Миколайчук
Володимир Миколайчук
Помогите разобраться поетапно с логикой запроса
-------TOOLS
NAME PRICE TYPE
drill 155 A
sawzall 192 N
mitre saw 292 M
router 86 I
RAD 145 M
jigsaw 128 I
screwdriver 77 P
------TOOL_TYPES
TYPE USAGE
A Always
I Often
M Sometimes
N Rarely
P Never

Запрос SQL:
SELECT t.type, SUM(t.price)
FROM tools t
GROUP BY t.type
HAVING SUM(t.price) >= (SELECT AVG(price)
FROM tools
WHERE type IN (SELECT type
FROM tool_types
WHERE usage = 'Often'));

И сколько строк он все таки вернет