![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Объекты базы данных
После создания базы данных в ней можно создавать внутренние структуры, часто называемые объектами. Любой объект БД имеет имя и занимает некоторое место в некотором табличном пространстве(ах). Ниже приводится перечень основных объектов БД:
• Таблицы, столбцы, ограничения и типы данных (в том числе абстрактные типы данных); • Секции и подсекции; • Пользователи и схемы; • Индексы, кластеры и хеш-кластеры; • Представления; • Последовательности; • Процедуры, функции, пакеты и триггеры; • Синонимы; • Привилегии и роли; • Связи баз данных; • Моментальные снимки и материализованные представления.
Таблицы, столбцы, ограничения и типы данных
Таблицы представляют собой структуру сохранения информации в базе данных Oracle. Они содержат фиксированный набор столбцов, в которых описываются атрибуты объекта, с которым эта таблица работает. У каждого столбца есть имя и уникальные характеристики. Столбец характеризуется типом данных и длиной. Для столбцов типа NUMBER можно задать дополнительные характеристики точности и масштаба. Точность определяет число значащих цифр. Масштаб показывает место десятичной точки. Определение NUMBER (9, 2) показывает, что в поле столбца хранится всего 9 разрядов, два из которых располагаются справа от десятичной точки. Точность по умолчанию — 38 разрядов. Применяемые типы данных перечислены в таблице.
Помимо перечисленных в таблице типов данных, 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). Таким образом, для конечного пользователя локализация таблицы EMPLOYEE будет полностью прозрачна. Эту таблицу можно перенаправить на другую схему или в другую базу данных; изменение описания связи базы данных переадресует синоним в новое место.
|