Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Объекты базы данных






 

После создания базы данных в ней можно создавать внутренние структуры, часто называемые объектами. Любой объект БД имеет имя и занимает некоторое место в некотором табличном пространстве(ах). Ниже приводится перечень основных объектов БД:

 

• Таблицы, столбцы, ограничения и типы данных (в том числе абстрактные типы данных);

• Секции и подсекции;

• Пользователи и схемы;

• Индексы, кластеры и хеш-кластеры;

• Представления;

• Последовательности;

• Процедуры, функции, пакеты и триггеры;

• Синонимы;

• Привилегии и роли;

• Связи баз данных;

• Моментальные снимки и материализованные представления.

 

 

Таблицы, столбцы, ограничения и типы данных

 

Таблицы представляют собой структуру сохранения информации в базе данных Oracle. Они содержат фиксированный набор столбцов, в которых описываются атрибуты объекта, с которым эта таблица работает. У каждого столбца есть имя и уникальные характеристики.

Столбец характеризуется типом данных и длиной. Для столбцов типа NUM­BER можно задать дополнительные характеристики точности и масштаба. Точ­ность определяет число значащих цифр. Масштаб показывает место десятичной точки. Определение NUMBER (9, 2) показывает, что в поле столбца хранится всего 9 разрядов, два из которых располагаются справа от десятичной точки. Точ­ность по умолчанию — 38 разрядов. Применяемые типы данных перечислены в таблице.

 

Типы данных Oracle Описание
CHAR Символьное поле фиксированной длины до 2000 байт.
NCHAR   Поле фиксированной длины для набора символов, состоящих из нескольких байт. Максимальный размер — 2000 символов или 2000 байт в зависимости от набора символов.
VARCHAR2 Символьное поле переменной длины до 4000 символовбайт.
NVARCHAR2 Поле переменной длины для набора символов, состоящих из нескольких байт. Максимальных размер — 4000 символов или 4000 байт в зависимости от набора символов.
DATE 7-байтовое поле фиксированной длины, используемое для хранения любых дат, в т.ч и времени. Время сохраняется как часть даты. При обращении дата выводится в формате, зависящем от установок территории, например 22-APR-01 (территория - AMERICA) для 22 апреля 2001 г., если только формат даты не будет переопределен с помощью параметра инициализации NLS_DATE_FORMAT.
INTERVAL DAY TO SECOND 11-байтовое поле фиксированной длины для интервала времени; представляется как дни, часы, минуты и секунды. Значения точности определяют для даты число значащих цифр в поле DAY и поле дробной части SECOND. Эти значения по умолчанию составляют 2 для дней, 6 — для секунд, но их можно изменять от 0 до 9.
INTERVAL YEAR TO MONTH TIMESTAMP 5-байтовое поле фиксированной длины для интервала времени; представляется как годы и месяцы. Значение точности определяет число значащих цифр в поле YEAR даты; по умолчанию составляет 2, но может изменяться от 0 до 9.
TIMESTAMP WITH TIME ZONE Фиксированное значение, составляющее 13 байт, представляет дату и время плюс настройки, связанные с часовым поясом. Часовой пояс может отсчитываться от UTC (всемирное время), например " -5: 0" или иметь название региона, например " US/Pacific".
TIMESTAMP WITH LOCAL TIME ZONE Изменяется от 7 до 11 байт. Этот тип данных похож на TIMESTAMP WITH TIME ZONE за исключением того, что при сохранении дата приводится к часовому поясу базы данных и настраивается таким образом, чтобы при поиске она соответствовала часовому поясу клиента.
NUMBER Числовой тип переменной длины. В качестве значения может принимать ноль и любые положительные и отрицательные числа. Основной тип для хранения чисел в СУБД Oracle. Внутренняя память, необходимая для хранения значения NUMBER, равна приблизительно половине числа значащих цифр в этом значении. Берется вся длина, например 9, делится на 2, округляется до целого числа, и добавляется 1 для положительного числа. Следовательно, для сохранения числа с 9 цифрами требуется 6 байт.
LONG Символьный тип переменной длины, до 2 Гбайт (оставлен для совместимости).
RAW Двоичный тип переменной длины (до 2000 байт) (оставлен для совместимости).
LONG RAW Поле переменной длины (до 2 Гбайт), используемое для хранения двоичных данных.
BLOB Двоичный тип «большой объект» длиной до 4 Гбайт.
CLOB Символьный тип «большой объект» длиной до 4 Гбайт.
NCLOB Тип данных CLOB для набора символов, состоящих из нескольких байт; длина до 4 Гбайт.
BFILE Внешний двоичный файл; размер ограничивается операционной системой.
ROWID Шестнадцатеричный тип для уникального определения любой строки любой таблицы в БД. Длина его составляет 18 символов, которая делится на 4 элемента разной длины (6+3+6+3) например, OOOOOOFFFBBBBBBRRR, где: · OOOOOO: Уникальный номер объекта (data object number) в БД, которому принадлежит строка. · FFF: Уникальный номер файла данных (datafile number) БД, где хранится строка. · BBBBBB: Номер блока данных, который хранит строку. Уникален на уровне файла дынных. Т.е. в разных файлах данных могут существовать блоки данных с одинаковыми номерами. · RRR: Адрес строки в блоке.
UROWID Специальный шестнадцатеричный тип данных для адресации строк в таблицах, организованных по индексу (index organized tables). Максимальное значение – 4000 байт.

 

Помимо перечисленных в таблице типов данных, Oracle поддерживает некоторые типы данных стандарта ANSI SQL. Вместо типа ANSI CHARACTER можно использовать тип данных Oracle CHAR, вместо ANSI CHARACTER VARYING и CHAR VARYING - VARCHAR2, вместо ANSI NUMERIC, DECIMAL, DEC, INTEGER, INT и SMALLINT - NUMBER. Вместо типов ANSI FLOAT REAL и DOUBLE PRECISION в Oracle поддерживается тип данных FLOAT внутри PL/SQL.

Начиная с версии Oracle8 i можно создавать свои собственные абстрактные типы данных. С помощью специальных типов данных REF можно ссылаться на строковые объекты в базе данных.

Ряд таблиц, а еще больше представлений, принадлежащие SYS, называются таблицами словаря данных. Они со­держат системный каталог, с помощью которого система управляет своей рабо­той. Словарь данных создается набором сценариев, предоставляемых системой Oracle. При каждой установке или модернизации базы данных необхо­димо запускать сценарии, создающие или модифицирующие таблицы словаря данных (catalog.sql).

Таблицы связываются друг с другом через общие столбцы. База данных реа­лизует эти отношения с помощью так называемой ссылочной целостности. При ис­пользовании объектно-ориентированных возможностей Oracle строки можно связывать друг с другом при помощи внутренних ссылок, называемых идентифи­каторами объектов. На уровне базы данных ссылочная целостность реализуется путем использования ограничений (constraints).

 

Временные таблицы

 

Подобно обычной таблице, временная таблица является механизмом хране­ния данных в БД Oracle. Временная таблица состоит из столбцов, имеющих типы данных и длину, как и обычная таблица. В отличие от обычной таблицы, описание временной таблицы сохраняется, но данные, внесенные в таблицу, остаются в ней лишь во время сеанса или во время транзакции. Создание временной таблицы в качестве глобальной временной таблицы обеспечивает для всех сеансов, поддер­живающих соединение с базой данных, возможность видеть данную таблицу и обращаться к ее данным. Во время коллективных сеансов во временные таблицы можно вставлять строки данных. Однако каждая строка данных в таблице видна только для того сеанса, который вставил эту строку.

Данные, содержащиеся во временной таблице, относятся либо к сеансу, либо к транзакции, в зависимости от ключевых слов, которые используются в конст­рукции on commitпо отношению к данной временной таблице. Можно указать on commit delete rowsили on commit preserve rows.

 

Ограничения

 

На столбцы таблицы можно налагать ограничения, при этом каждая ее строка должна удовлетворять указанному в описании ограничению. Ниже с помощью команды create tableсоздается таблица EMPLOYEE с несколькими налагаемыми на нее ограничениями:

 

create table EMPLOYEE

(Empno NUMBER (10) PRIMARY KEY,

Name VARCHAR2(40) NOT NULL,

DeptNo NUMBER(2) DEFAULT 10 foreign key (DeptNo)

references DEPT(DeptNo),

Salary NUM8ER(7, 2) CHECK (salary< 1000000)

Birth_Date DATE,

Soc_Sec_Num CHAR(9) UNIQUE) tablespace USERS;

 

Прежде всего обратите внимание, что таблице дано имя EMPLOYEE (служа­щий). Все ее столбцы также имеют имена (EmpNo, Name и т.д.). Для каждого столбца указаны его типы данных и длина. Столбец EmpNo определен как имею­щий тип NUMBER без масштаба, что эквивалентно целочисленным значениям. Столбец Name относится к типу VARCHAR2(40), поля этот столбца имеют пере­менную длину до 40 символов.

Первичным ключом (primary key) таблицы называется столбец или набор столбцов, значения которых для каждой строки уникальны. Столбец или столбцы первичного ключа определяются в базе данных с ограничением NOT NULL. Это значит, что каждая строка табли­цы должна содержать значение для данных столбцов; их нельзя оставить рав­ным NULL. Ограничение NOT NULL можно применять и к другим строкам таблицы, как показано на примере столбца Name.

На столбец могут налагаться и другие ограничения. Нпример, ограничение DEFAULT генерирует значе­ние для столбца по умолчанию, при вставке (insert) строки в таблицу, если для него не указывается никакого значения, используется значение DEFAULT.

Ограничение CHECK позволяет удостовериться, что значения в указанном столбце соответствуют определенному условию (в данном случае значения в столбце Salary меньше 1000000). Ограничение NOT NULL воспринимается ба­зой данных как частный случай ограничения CHECK.

Ограничение UNIQUE гарантирует уникальность столбца, который должен быть уникальным, но не является частью первичного ключа. В данном примере это ограничение имеет столбец Soc_Sec_Num, поскольку значение этого столбца для каждой записи таблицы должно быть уникальным.

Ограничение внешнего ключа (foreign key) определяет механизм взаимоотношений между таб­лицами. Внешний ключ одной таблицы ссылается на ранее определенный первичный ключ другой таблицы. Например, если первич­ным ключом таблицы DEPT является поле DeptNo (номер департамента), то можно создать внешний ключ в таблице EMPLOYEE по полю с таким же названием deptno, и этот внешний ключ будте ссылаться на поле deptno таблицы dept. При этом нельзя будет, например, вставить в таблицу EMPLOYEE строку, описывающую работника, работающего в департаменте, не узазанном в таблице DEPT.

Ограничения в БД позволяют гарантировать ссылочную целост­ность информации. Это дает уверенность в том, что все ссылки в базе данных достоверны и все ограничения соблюдены.

 

Абстрактные типы данных

 

Как и в СУБД Oracle8 i, можно определить свои собственные типы данных. Например, можно создать тип данных, содер­жащий несколько составных частей полного имени человека: имя, фамилию, промежуточный инициал, суффикс и т.д. как один тип данных. В следующем примере создается тип данных NAME_TY:

 

create type NAME_TY as object

(First_Name VARCHAR2(25),

Middle_Initial CHAR(1),

Last_Name VARCHAR2(30),

Suffix VARCHAR2(5));

 

Вы можете использовать определенные вами типы данных для стандартизации использования данных в своих приложениях. Например, тип данных NAME_TY можно использовать повсюду, где используются любые другие типы данных. В следующем примере снова создается таблица EMPLOYEE, но на этот раз тип данных NAME_TY является типом данных для столбца EMPLOYEE.Name:

 

create table EMPLOYEE

(EmpNo NUMBER(IO) PRIMARY KEY,

Name NAME_TY,

DeptNo NUMBER(2) DEFAULT 10,

Salary NUMBER(7, 2) CHECK (salary< 1000000),

Birth_Date DATE,

Soc_Sec_Num CHAR(9) UNIQUE,

foreign key (DeptNo) references DEPT(DeptNo)) tablespace USERS;

 

Как показано в операторе создания типа NAME_TY, столбец Name таблицы EMPLOYEE содержит четыре атрибута. Если для типа NAME_TY определить ме­тоды, т.е. программы, воздействующие на атрибуты типов данных, их можно бу­дет применять к значениям столбца Name таблицы EMPLOYEE.

Методы-конструкторы

 

При создании абстрактного типа данных Oracle автоматически создает ме­тод-конструктор, поддерживающий ввод данных в столбец, использующий этот тип данных. Для типа NAME_TY конструктор называется NAME_TY и в качестве параметров содержит атрибуты типа данных.

 

Таблицы объектов

 

Таблицей объектов называется таблица, все строки которой являются объекта­ми, и для них определены значения идентификаторов объектов. Для создания таблицы объектов можно использовать команду create table. Например, в следу­ющем листинге команда create tableиспользуется для создания таблицы NAME на основе типа данных NAME_TY:

 

create table NAME of NAME_TY;

 

Затем можно создать ссылки из других таблиц на объекты строк таблицы объ­ектов NAME. Это позволит выбирать строки данной таблицы по ссылкам, не об­ращаясь к таблице NAME непосредственно.

 

 

Вложенные таблицы (nested tables) и изменяемые массивы (varray)

 

Вложенная таблица — это пользовательский тип данных (коллекция), через который можно определить столбец (столбцы) таблицы, содержащие несколько зна­чений в одной строке. Например, если человек имеет несколько адресов, в таблице можно создать строку, содержащую несколько значений для столбца Address и толь­ко по одному значению для остальных столбцов. Вложенные таблицы могут содер­жать несколько столбцов и неограниченное число строк.

Другим типом коллекций является изменяемый массив (varray), в котором число строк фиксировано при его определении. Обычно вложенные таблицы предоставляют большую гибкость в ра­боте с данными, чем изменяемые массивы. Использование как вложенных таб­лиц, так и изменяемых массивов требует модификации синтаксиса SQL, применяемого для доступа к данным. В целом отношения между данными вло­женных таблиц можно симулировать с помощью реляционных таблиц.

 

 

Секции (partitions) и подсекции (subpartitions)

 

По мере увеличения размера таблиц процесс управления ими все более усложня­ется. Администрирование больших БД можно значительно упрос­тить, распределив данные одной большой таблицы по нескольким меньшим разделам, например по времени, отделам или по наименованиям продукции. Эти разделы называются секциями (partitions).

 

Секционирование доступно только для серверов СУБД Oracle 10gEnterprise Edition с опцией Partitioning.

 

В БД можно определять диапазоны, используемые при разбиении большой таблицы на секции. Как правило, секциямилегче управлять. Например, можно усечь (truncate)данные одной секции, не затрагивая остальных. Oracle рассматривает разбитую на секции таблицу как одну большую таблицу, но секциями можно управлять как отдельнмми объектами.

Секции могут повысить производительность приложения. Поскольку оптимизатор будет знать значения столбцов, используемые в качестве базиса для секций при работе с таблицей, он сможет направлять запросы сразу в конк­ретные секции, не просматривая лишних строк. Поэтому при обработке каждого запроса будет считываться ме­ньшее количество данных и производительность обработки запроса повысится.

Индексы можно также разбивать на секции. Диапазоны значений разделов та­кого разделенного индекса могут соответствовать диапазонам, используемым для проиндексированной таблицы, — в этом случае индекс называется локаль­ным. Если разделы индекса не соответствуют диапазонам значений разделов таб­лицы, индекс называется глобальным.

Секции можно также разбивать, создавая подсекции. На­пример, можно разбить таблицу на секции, основываясь на одном наборе зна­чений, а затем разбить секции с помощью другого метода разделения. Начиная с версии Oracle9i, помимо секционирования по диапазону и хеширования, можно создать секционирование по списку.

Пользователи

 

В базе данных учетная запись пользователя не является физической структурой, но она связана важными взаимоотношениями с объектами БД: пользо­вателям принадлежат объекты. Пользователь SYS владеет таблицами словаря данных, содержащими информацию об остальных структурах базы данных. По­льзователю SYSTEM принадлежат некоторые представления, обращающиеся к этим табли­цам словаря данных, что позволяет остальным пользователям базы данных использовать их.

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

Учетные записи пользователей можно связать с учетными записями системы, что дает возможность пользователям получать доступ к базе данных из операцион­ной системы, не вводя при этом пароли для доступа к БД, но это не очень хорошо с позиций безопасности.

 

Схемы

 

Набор объектов, принадлежащих учетной записи пользователя, называется схе­мой. Имя схемы совпадает с именем учетной записи. Можно создать пользователей, не имеющих права входа в базу данных. Но зато та­кие учетные записи могут хранить наборы объектов базы данных для работы других пользователей.

 

Индексы

 

Для того чтобы Oracle мог быстро найти некоторые данные в БД, каждая строка в каждой таблице помечается с помощью идентификатора RowID. Этот идентификатор содержит информацию о том, где конкретно расположена строка (файл, блок внутри этого файла и строка внутри этого блока).

 

Таблица, организованная по индексу, не содержит традиционных для Oracle идентификаторовRowID, Вместо этого в качестве логических идентификаторов используется первичный ключ и специальный типURowID.

 

Индекс — это структура базы данных, используемая сервером для быстрого по­иска строки в таблице. Существуют три типа индексов: кластерные, табличные и индексы битовой карты (bitmap). Кластерные индексы содержат значения ключей кластеров в кластерах (подробнее об использовании кластеров см. ниже). Табличный (B*Tree) индекс содержит значения строк таблиц вместе с физиче­ским расположением строки (RowID) и предназначается для индексирования уникальных столбцов или столбцов с выскокой селективностью. Битовый индекс является особым типом табличного индекса, предназначенным для индексирования столбцов с низкой селективностью.

Каждое поле индекса состоит из ключевого значения и идентификатора RowID. Можно проиндексировать один или несколько столбцов. В обычных табличных индексах Oracle сохраняет поля индекса с помощью механизма B*tree, который обеспечивает путь до­ступа к ключевому значению: когда запрос обращается к индексу, он находит поля индекса, соответствующие критерию запроса. Значение RowID соответст­вующего поля указывает на физическое расположение связанной с ним строки — все это уменьшает объем операций ввода/вывода, требуемых для локализации данных.

Индексы повышают производительность, а также могут (при желании) обеспе­чивать уникальность столбца. СУБД Oracle 10gавтоматически создает индекс, если в команде create tableуказывается ограничение UNIQUE или PRIMARY KEY. С помощью команды create indexможно вручную создать и свои собственные индексы.

Индексы можно создавать на основе одного или нескольких столбцов табли­цы. В приведенном выше примере таблицы EMPLOYEE автоматически будут со­зданы уникальные индексы для столбцов EmpNo и Soc_Sec_Num, поскольку они были определены с ограничениями PRIMARY KEY и UNIQUE, Удаление индекса не оказывает влияния на данные ранее проиндексированной таблицы.

С версии Огас1е 7.3 можно создавать битовые индексы. Они полезны, если дан­ные не слишком избирательны, т.е. в столбце содержится мало отличающихся друг от друга значений. Битовые индексы ускоряют процесс поиска, если в каче­стве ограничивающих условий запроса используются такие неселективные столбцы. Они наиболее эффективны для совершенно статичных данных.

Можно создавать индексы, в которых порядок данных перед сохранением меняется на противоположный. Например, если значением поля является 1002, то оно будет проиндексировано как 2001. Такой способ позволяет лучше распределять данные в индексе. Индексы обратного порядка полезны только при выполнении операций сравнения в запросах, например:

 

where key_col_value = 1002

 

Если выполняется поиск в диапазоне, то индексы обратного порядка применять нецелесообразно, так как последо­вательные значения будут располагаться не рядом, а на расстоянии друг от друга и, следовательно, запрос в диапазоне, использующий индекс обратного порядка, должен будет прочитать больше блоков, чем при использовании традиционного индекса.

C версии Oracle8i можно создавать таблицы организованные по индексу (index organized tables - IOT). В такой таб­лице, определенной с помощью оператора organization indexкоманды create table, всятаблица сохраняется в структуре индекса, а ее данные сортируются по пер­вичному ключу. Чтобы создать таблицу с индексной организацией, нужно опре­делить для нее первичный ключ. Ее строки не будут иметь идентификатора RowID, а в качестве логического идентификатора будет использоваться значение первичного ключа. Теперь для таких таблиц можно создавать вторичные индексы, что расширяет их применение.

Можно создавать индексы, основанные на функциях Oracle или функциях, определенных пользователем. Например, можно создать индекс по UPPER(Name) вместо просто столбца Name, если известно, что в конструкции whereв запросах всегда будет использоваться функция UPPER.

 

Кластеры

 

Таблицы, с которыми часто работают совместно, можно физически хранить со­вместно. Для этого создается кластер, который будет их содержать. Данные та­ких таблиц сохраняются вместе в кластере, что уменьшает число операций ввода/вывода и повышает производительность.

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

Кластеры эффективны для таблиц, с которыми часто работают совместно. В кла­стерах строки из отдельных таблиц сохраняются в одних и тех же блоках, так что за­просы, объединяющие эти таблицы, выполняются за счет меньшего числа операций ввода/вывода, чем при сохранении таблиц по отдельности. Однако производите­льность операций вставки, обновления и удалениядля кластерных таблиц может быть значительно ниже, чем в случае некластерных таблиц. Прежде чем объеди­нять таблицы в кластеры, определите частоту совместного обращения к ним. Если с ними всегда работают совместно, стоит рассмотреть возможность их объедине­ния в одной таблице, а не группировать в одном кластере.

 

Хеш-кластеры

 

Второй тип кластеров — хеш-кластеры — использует функции хеширования клас­терного ключа строки для определения физической локализации того места, где строку следует сохранить. Наибольшие преимущества хеш-кластеров связа­ны с запросами, использующими операции равенства, как показано в следующем листинге:

 

select Name

from EMPLOYEE where EmpNo = 123;

 

В этом примере в запросе таблицы EMPLOYEE определяется точное соответ­ствие значению столбца EmpNo. Если таблица входит в состав хеш-кластера, а столбец EmpNo — в состав кластерного ключа, то база данных может воспользо­ваться функциями хеширования для быстрого определения физической локали­зации данных. Не следует ожидать такого же повышения производительности, если в конструкции определен диапазон значений:

 

select Naroe

from EMPLOYEE where EmpNo > 123;

 

Поиск строки в стандартной проиндексированной таблице может потребо­вать нескольких операций ввода/вывода: одну или больше для поиска значения ключа в индексе и еще одну для прочтения строки из таблицы. Использование алгоритмов хеширования уменьшает число операций ввода/вывода, требуемых для возврата строки в ответ на запрос с критерием равенства.

 

Представления (views)

 

На самом деле представление — это хранимый запрос, обращение к которому может осуществляться точно так же, как и к таблице. Однако оно не содержит данных. Кон­цептуально представление можно считать маской, перекрывающей одну или неско­лько таблиц, так как столбцы представления содержатся в одной или нескольких таблицах. Но физически представления не содержат данных. Определение представ­ления (включающее запрос, на котором оно основано, расположение его столбцов и назначенные привилегии) содержится в словаре данных.

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

Представления часто используются для обеспечения безопасности данных уровня строки или столбца. Например, можно предоставить пользователю до­ступ только к такому представлению, которое показывает из таблицы лишь стро­ки этого пользователя, не открывая при этом доступа ко всем строкам таблицы. Таким же способом можно ограничить видимые пользователем столбцы.

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

 

Объектные представления

 

Используя абстрактные типы данных, можно столкнуться с проблемами непро­тиворечивости при их реализации. Доступ к атрибутам абстрактных типов дан­ных требует синтаксиса, который не используется для доступа к обычным столбцам. В результате для поддержки абстрактных типов данных может потре­боваться изменить стандарты кодирования SQL вашего предприятия. Кроме того, нужно помнить, какие таблицы используют абстрактные типы данных при выполнении транзакций и запросов в них.

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

 

Последовательности

 

Определение последовательностей (sequences) содержится в словаре данных. По­следовательности позволяют упростить процесс программирования, поскольку предоставляют последовательный список уникальных номеров.

При первом обращении к последовательности в запросе она возвращает пре­допределенное значение. Каждый следующий запрос возвращает значение, кото­рое больше (либо меньше) предыдущего на указанное приращение (оно может быть отрицательным). Последовательности могут быть циклическими, а могут увеличиваться до достижения заданного максималь­ного значения.

При работе с последовательностями нельзя дать гарантии, что вы получите не­прерывную строку значений. Например, при запросе следующего значения (nextval) из после­довательности для использования в команде insert вам принадлежит единственный сеанс, и только он может использовать это значение. Если вы не сможете завершить транзакцию, это значение не будет включено в таблицу, а дальнейшие вставки будут использовать следующие значения из последовательности.

 

Процедуры

 

Процедура — это именованный блок операторов PL/SQL, сохраняемый в словаре данных и вызы­ваемый приложениями. Процедуры позволяют сохранять в базе данных часто используемую бизнес-логику приложений. При выполнении процедуры все ее операторы полняются как единое целое. Процедуры не возвращают никаких значений вызвавшей их программе.

Хранимые процедуры позволяют поддерживать безопасность данных. Вместо предоставления пользователю доступа к таблицам в приложении можно разрешить ему выполнить только процедуру, осуществляющую доступ к этим таблицам. При выполнении процедура использует привилегии ее владельца. В результате пользователи не смогут получить доступ к таблице, иначе как посредством процедуры.

 

Функции

 

Функции, как и процедуры, представляют собой именованные блоки кода PL/SQL, сохраняемые в базе данных. Однако, в отличие от процедур, функции возвращают значения вы­звавшей их программе. Можно создавать свои собственные функции и обраща­ться к ним в операторах SQL, а можно использовать только те функции, которые предоставляются средой Oracle.

Например, Oracle предоставляет функцию SUBSTR, выбирающую подстроку из строки символов. Если создать функцию MY_SUBSTR, выполняющую специа­льные операции подстроки, то обратиться к ней можно с помощью команды SQL:

 

select MY_SUBSTR ('text') from DUAL;

 

Если вы не яляетесь владельцем функции MY_SUBSTR, следует получить на нее разрешение EXECUTE. Определенную пользователем функцию можно применять в операторе SQL, только если она не изменяет строки базы данных.

 

Пакеты

 

С помощью пакетов можно упорядочить процедуры и функции и объединять их в логические группы. Спецификации и тела пакетов сохраняются в словаре дан­ных. Пакеты бывают очень полезны при решении задач администрирования по управлению процедурами и функциями.

Элементы пакетов бывают общими (public) и частными (private). Общие элементы доступны всем использующим пакет, а частные скры­ты от них, хотя и участвуют в обеспечении функциональности пакета. Частные элементы могут включать, например, процедуры, неявно вызывае­мые другими процедурами пакета.

Исходный код функций, пакетов и процедур сохраняется в таблицах словаря данных. Если приложение активно использует пакеты, может потребоваться су­щественно увеличить размер табличного пространства SYSTEM, чтобы оно со­ответствовало увеличившемуся словарю данных.

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

 

Триггеры

 

Триггеры — это неименованные блоки PL/SQL, выполняющиеся при наступлении указанного события базы данных. Триггер нельзя выполнить явно. С помощью триггеров можно укрепить ссылочную целостность, обеспечить дополнительную безопасность или повысить доступные возможности аудита.

Существуют два типа триггеров:

Операторные триггеры. Срабатывают один раз для каждого активизирующего оператора.

Строковые триггеры. Срабатывают один раз для каждой строки таблицы, на которую влияют данные операторы.

Скажем, триггер уровня оператора срабатывает один раз для команды delete, удаляющей 10000 строк. В той же самой транзакции триггер уровня строки дол­жен будет сработать 10000 раз.

Для любого типа триггера можно создать триггеры BEFORE (до) и AFTER (после) события, по которому триггер активизируется. К числу таких событий относятся команды insert, updateиdelete.

Операторные триггеры полезны, если код запускаемого триггера не исполь­зует затрагиваемые данные. Например, в таблице можно создать операторный триггер BEFORE INSERT, который не позволит осуществить вставкув таблицу, кроме как в специальные периоды времени.

Строковые триггеры полезны, если код действия применяет данные, затра­гиваемые транзакцией. Например, можно создать строковый триггер AFTER INSERT, чтобы вставитьновые строки в таблицу аудита или в базовую таблицу триггера.

С версии Oracle8 i можно создавать триггер INSTEAD OF. Он выполняется вместо действия, вызвавшего его запуск. Например, если в таблице задан триг­гер INSTEAD OF INSERT, будет выполняться его код, а вставка, которая вызыва­ет работу этого триггера, никогда не произойдет. Триггеры INSTEAD OF можно применять к представлениям. Если представление объединяет в своем запросе несколько таблиц, триггер INSTEAD OF позволит управлять действиями Oracle при попытке пользователей обновить строки через это представление.

C версии Oracle8 i можно создавать триггеры для событий уровня системы. Код триггера может выполняться при запуске команд create, alterили drop. В качестве запускающих триггер событий можно использовать вход/выход (logon/logoff) из системы, а также отключение и загрузку базы данных.

Новый триггер под названием on logonдает возможность получить значения, которые задаются пользователем с момента установки его соединения с базой данных.

 

Синонимы

 

Для того чтобы полностью идентифицировать объект в распределенной базе данных (например, таблицу или представление), нужно указать имя хост-компь­ютера, имя (экземпляр) сервера, владельца объекта и имя этого объекта. В зави­симости от расположения объекта может потребоваться от одного до всех четырех этих параметров. Чтобы скрыть весь этот процесс от пользователя, можно создать указывающие на объект синонимы; в результате пользователю нужно будет знать только имя синонима. Публичные синонимы используются со­вместно всеми пользователями базы данных. Частные синонимы принадлежат отдельным пользователям, их создавших.

Например, у рассмотренной выше таблицы EMPLOYEE должен быть владе­лец — назовем его HR. Из учетной записи другого пользователя той же базы дан­ных на данную таблицу можно сослаться как на HR.EMPLOYEE. Однако такой синтаксис не предполагает, что вторая учетная запись знает о том, что собствен­никам таблицы EMPLOYEE является учетная запись HR. Чтобы преодолеть это, необходимо создать синоним EMPLOYEE, указывающий на учетную запись HR.EMPLOYEE. Ссылка на этот синоним означает указание на соответствующую таблицу. Синоним EMPLOYEE создает следующий оператор SQL:

 

create public synonym EMPLOYEE for HR.EMPLOYEE

 

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

Синонимы для абстрактных типов создавать нельзя. Более того, Oracle не проверяет допустимость синонима при его создании. Создав синонимы, следует их проверить и убедиться, что их можно использовать.

 

Привилегии и роли

 

Для того чтобы обратиться к объекту, принадлежащему другой учетной записи, нужно сначала получить привилегию на доступ к этому объекту. Как правило, пользо­вателям, не являющимся собственниками объекта, предоставляются привилегии на вставку, выбор, обновлениеили удалениестрок из таблицы, представления или моментального снимка. Можно дать пользователю привилегию на выбор значения из последовательности или на выполнение процедуры, функции, модуля или аб­страктного типа данных. Привилегии, связанные с индексами или триггерами, не даются, поскольку к ним обращается база данных при работе с таблицей. Можно предоставить право чтения— на каталоги (для каталогов BFILE) и вы­полнения— на библиотеки (для внешних программ, вызываемых кодом прило­жения). Привилегии можно предоставлять индивидуальным пользователям или всем пользователям БД (PUBLIC).

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

Роли можно также использовать для предоставления привилегий уровня системы, например create table.

 

Связи баз данных (database links)

 

В базах данных Oracle можно ссылаться на данные, находящиеся вне локаль­ной базы данных. При этом необходимо указать полное имя удаленного объекта. В описанном ранее примере синонима было определено только две части полного имени — имя владельца и имя таблицы. Однако что делать, если таблица содер­жится в удаленной базе данных?

Для того чтобы определить путь доступа к объекту из удаленной базы дан­ных, необходимо создать связь базы данных. Такая связь может быть либо общей (доступной всем пользователям этой БД), либо частной (созданной пользователем только для своей записи). При создании связи базы данных необходимо определить имя и пароль учетной записи для соединения с ней, а также название службы, связанной с удаленной базой данных. Если не ука­зать имя учетной записи, то для соединения с удаленной базой данных Oracle вос­пользуется вашим локальным именем учетной записи и паролем. В следующем примере показано создание общей связи MY_LINK:

 

create public database link MY_LINK

connect to HR identified by PUFFINSTUFF using 'DB1'

 

В этом примере связь откроет сеанс в базе данных, которая идентифицирова­на службой с именем DB1. Открыв сеанс в этом экземпляре DB1, она зарегистри­руется как пользователь с учетной записью HR и паролем puffmstuff. Имена служб для экземпляров сохраняются в файлах конфигураций, используемых Oracle NET. Файл конфигураций для имен служб называется tnsnames.ora и ука­зывает хост, порт и экземпляр, связанный с каждым именем службы.

Для использования этой связи в таблице ее необходимо указать в конструкции from:

 

select * from EMPLOYEE@MY_LINK;

 

Данный запрос получает доступ к таблице EMPLOYEE через связь базы данных MY_LINK. Для этой таблицы можно создать синоним, как показано в следующей команде SQL:

 

create synonym EMPLOYEE for EMPLOYEE@MYLINK;

 

Обратите внимание, что для объекта базы данных было указано полное на­звание: хост и экземпляр — через имя службы, владелец (HR) — через связь базы данных, а также имя (EMPLOYEE). Таким образом, для конечного пользователя локализация таблицы EMP­LOYEE будет полностью прозрачна. Эту таблицу можно перенаправить на дру­гую схему или в другую базу данных; изменение описания связи базы данных переадресует синоним в новое место.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.