- •1.Традиционные файловые системы
- •1.1.Подход, используемый в файловых системах
- •2.Системы с базами данных
- •2.1.База данных
- •2.2.Система управления базами данных ─ субд
- •2.3.Разработка базы данных смена парадигмы
- •3.Преимущества и недостатки субд
- •4.Модели данных
- •4.1.Объектные модели данных
- •4.2.Модели данных на основе записей
- •4.2.1 Иерархическая модель данных
- •4.2.2 Сетевая модель данных
- •4.2.3 Реляционная модель данных
- •4.2.4 Свойства отношений
- •4.2.5 Реляционная целостность
- •Целостность сущностей
- •Ссылочная целостность
- •Корпоративные ограничения целостности.
- •5.Функции субд
- •6.Компоненты субд
- •7.Системные каталоги
- •8.Инструкции sql
- •8.1.Имена
- •8.2.Имена таблиц
- •8.3.Имена столбцов
- •8.4.Типы данных
- •8.5.Константы
- •9.Инструкция select
- •9.1.Предложение select
- •9.2.Предложение from
- •9.3.Результаты запроса на выборку
- •9.4.Простые запросы
- •9.5.Вычисляемые столбцы
- •9.6.Выборка всех столбцов
- •9.7.Повторяющиеся строки
- •9.8.Отбор строк (предложение where)
- •9.8.1 Сравнение
- •9.8.2 Проверка на принадлежность значений (оператор between and)
- •9.8.3 Проверка на членство в множестве (оператор in)
- •9.8.4 Проверка на соответствие шаблону (оператор like)
- •10.Запросы с объединением таблиц
- •10.1.Производительность при обработке многотабличных запросов
- •11.Статистические (агрегатные) функции
- •12.Запросы с группировкой (предложение group by)
- •12.1.Условие отбора групп (предложение having)
- •13.Подчиненные запросы (подзапросы)
- •13.1.Условия отбора в подчиненном запросе
- •13.1.1 Проверка на существование (предикат exists)
- •13.1.2 Многократное сравнение (предикаты any и all)
- •Предикат any
- •Предикат all
- •13.1.3 Уровни вложенности запросов
- •14.Представления
- •14.1.Создание представлений
- •14.2.Как субд работает с представлениями
- •14.3.Преимущества представлений
- •14.4.Недостатки представлений
- •14.5.Обновление представлений
- •14.6.Контроль над обновлением представлений (предложение with check option)
- •15.Добавление новых данных
- •15.1.Однострочная инструкция insert
- •15.2.Добавление значений null
- •15.3.Добавление всех столбцов
- •15.4.Многострочная инструкция insert
- •16.Удаление существующих данных
- •16.1.Удаление всех строк
- •16.2.Инструкция delete с подчиненным запросом
- •17.Обновление существующих данных
- •17.1.Обновление всех строк
- •17.2.Инструкции update с подчиненным запросом
- •18.Условия целостности данных
- •18.1.Обязательное наличие данных
- •18.2.Условия на значения
- •18.3.Целостность таблиц (сущностей)
- •18.4.Проблемы, связанные со ссылочной целостностью
- •18.5.Правила удаления и обновления
- •18.6.Каскадные удаления
- •18.7.Ссылочные циклы
- •19.Язык определения данных
- •19.1.Создание базы данных
- •19.2.Создание таблиц (инструкция create table)
- •19.2.1 Определения столбцов
- •19.2.2 Определение первичного и внешнего ключей
- •19.2.3 Условия уникальности и ограничения на значения столбцов
- •19.3.Удаление таблицы (инструкция drop table)
- •19.4.Изменение определения таблицы (инструкция alter table)
- •19.4.1 Добавление и удаление столбца
- •19.4.2 Изменение первичных и внешних ключей
- •20.Псевдонимы таблиц (инструкции create / drop synonym)
- •21.Индексы (инструкции create/drop index)
- •22.Транзакции
- •22.1.Инструкции commit и rollback
- •22.2.Модель транзакции в стандарте ansi/iso
- •22.3.Журнал транзакций
- •22.4.Транзакции и работа в многопользовательском режиме
- •22.4.1 Проблема пропавшего обновления
- •22.4.2 Проблема промежуточных данных
- •22.4.3 Проблема несогласованных данных
- •22.4.4 Проблема строк – призраков
- •22.5.Параллельные транзакции
- •22.6.Блокировка
- •22.6.1 Уровни блокировки
- •22.6.2 Жесткая и нежесткая блокировки
- •22.6.3 Тупиковые ситуации
- •22.6.4 Явная блокировка
- •23.Принципы защиты данных, применяемые в sql
- •23.1.Пользователи
- •23.1.1 Аутентификация пользователей
- •23.2.Защищаемые объекты
- •23.3.Привилегии
- •23.3.1 Работа с привилегиями при помощи ролей
- •23.3.2 Роли, определяемые пользователями
- •23.3.3 Разрешение и запрещение ролей
- •23.3.4 Предоставление привилегий (инструкция grant)
- •23.3.5 Передача привилегий (предложение with grant option)
- •23.3.6 Отмена привилегий (инструкция revoke)
- •Инструкция revoke и право предоставления привилегий
- •24.Программирование сервера баз данныхoracle посредством pl/sql
- •24.1.Блоки
- •24.2.Комментарии
- •24.3.Объявления
- •24.3.1 Переменные и константы
- •24.3.2 Подтипы, определяемые пользователями
- •24.3.3 Составные типы, определяемые пользователями
- •Вложенные таблицы
- •Изменяемые массивы
- •24.3.4 Атрибуты
- •24.3.5 Особые замечания относительно вложенных таблиц и изменяемых массивов
- •Инициализация вложенных таблиц и изменяемых массивов
- •Использование методов сборных конструкций со вложенными таблицами и с изменяемыми массивами
- •24.3.6 Курсоры, курсорные типы и курсорные переменные
- •Курсорные типы и переменные
- •24.4.Функциональные возможности программ
- •24.4.1 Управление выполнением программ
- •Условное управление
- •Итерационное управление
- •24.4.2 Взаимодействие с базами данных
- •Стандартный dml
- •Работа с курсорами
- •Работа с курсорными переменными
- •24.4.3 Обработка исключительных ситуаций
- •24.5.Типы программ pl/sql
- •24.5.1 Анонимные блоки
- •24.5.2 Хранимые процедуры и функции
- •Создание процедур
- •Создание функций
- •Вызов процедур и функций
- •Управление блоками в sql*Plus
- •24.5.3 Модули
- •Использование объектов модуля
- •24.5.4 Триггеры баз данных
- •24.6.Служебные модули oracle
- •24.6.1 Модуль dbms_output
- •24.6.2 Динамический sql
- •Модуль dbms_sql
- •Использование dbms_sql
- •24.6.3 Файловый ввод/вывод (модуль utl_file)
- •Безопасность
- •Безопасность базы данных
- •Безопасность операционной системы
- •Исключительные ситуации, устанавливаемые в utl_file
- •Открытие и закрытие файлов
- •Файловый вывод
- •Файловый ввод
- •24.6.4 Взаимодействие между соединениями (модуль dbms_pipe)
- •Посылка сообщений
- •Получение сообщений
- •Создание программных каналов и управление ими
- •Программные каналы
- •Общие и частные каналы
- •Привилегии и безопастность
- •Установление протокола связи
- •Форматирование сообщений
- •Адресация данных
- •25.Создание приложений баз данных средствами odbc
- •25.1.Архитектура odbc
- •25.2.Коды возврата
- •25.3.Основной алгоритм программ odbc
- •25.4.Функции инициализации и завершения
- •25.5.Выполнение операторов
- •25.5.1 Функции управления каталогом
- •25.5.2 Непосредственное выполнение
- •25.5.3 Подготавливаемое выполнение
- •Использование параметров при выполнении.
- •25.6.Выборка результатов.
- •25.6.1 Выборка информации о результирующем множестве
- •25.6.2 Базовые функции выборки данных
- •25.7. Подробный алгоритм использования odbc в прикладных программах
Использование объектов модуля
Как и в хранимых процедурах и функциях, вид ссылок на объекты модуля зависит от вызывающей среды. Однако приложения ссылаются на общие объекты модуля, как правило, при помощи стандартной уточняющей записи через точку. В следующем анонимном блоке PL/SQL демонстрируются способы ссылки на объекты модуля.
declare
begin
/*ОПЕРАТОР, ИНИЦИАЛИЗИРУЮЩИЙ ГЛОБАЛЬНУЮ ПЕРЕМЕННУЮ МОДУЛЯ*/
select * into sales.part_mgmt.current_part
from sales.parts
where id = 3;
/*ОПЕРАТОР, ВЫЗЫВАЮЩИЙ ПРОЦЕДУРУ INSERT_PART РАНЕЕ ОПРЕДЕЛЕННОГО МОДУЛЯ*/
sales.part_mgrnt.insert_part (3, 500.00,'Network Computer');
…
В ORACLE встроено несколько служебных модулей, предлагающих ряд дополнительных возможностей, недоступных в SQL или PL/SQL. Подробная информация по работе с некоторыми из них (DBMS_OUTPUT – модуль серверного вывода, DBMS_SQL – модуль “динамического SQL”, UTL_FILE – модуль файлового ввода/вывода, DBMS_PIPE – модуль взаимодействия между соединениями) будет предложена в последующих разделах.
24.5.4 Триггеры баз данных
Триггер базы данных – это хранимая процедура, которую можно связать с некоторой таблицей. Когда приложение выполняет SQL – оператор DML над таблицей, удовлетворяющей условиям, указанным в триггере, ORACLE автоматически активизирует или выполняет триггер. Таким образом, триггеры можно использовать для настройки реакции ORACLE Server на различные события приложения. Вне зависимости от типа триггера все триггеры создаются одинаково. Общий синтаксис создания, таков:
сreate [or replace] trigger имя_триггера
{before | after | instead of} активизирующее_событие
on имя_таблицы
[for each row]
тело_триггера
Здесь активизирующее_событие, указывает событие активации триггера (далее указывается конкретная таблица или представление).
Например, следующий триггер автоматически регистрирует изменения, вносимые в таблицу PARTS.
create or replace trigger parts_log
after insert or update or delete on parts
declare
stmt_type char(1);
begin
if inserting then
stmt_type:=’I’;
elsif updating then
stmt_type:=’U’;
else
stmt_type:=’D’;
end if;
insert into part_change_log
values(stmt_type, USER);
end parts_log;
Как видно из вышеприведенного примера, описание триггера содержит однозначно определяемые части:
• список операторов, активизирующих триггер, который включает INSERT, UPDATE и/или DELETE. Триггер может быть связан с одной и только с одной таблицей;
• триггер может быть активизирован до (before) или после (after) выполнения оператора триггера в зависимости от логики конкретного приложения.
Помимо этого в описании триггера, указывается должен ли триггер активизироваться один раз, независимо от того, на какое количество строк оказывает воздействие оператор триггера (такие триггеры носят название операторных), или для каждой изменяемой строки (такие триггеры называются строчными). Приведенный выше триггер это операторный триггер. В следующем примере триггер PARTS_LOG является строчным (FOR EACH ROW):
create or replace trigger parts_log
before insert or update or delete on parts
for each row
declare
stmt_type char(1);
begin
if inserting then
stmt_type:=’I’;
elsif updating then
stmt_type:=’U’;
else
stmt_type:=’D’;
end if;
insert into part_change_log
values (:new.id, :old.id, :new.unit_price, :old.unit_price, :new.description,:old. description, stmt_type, USER, TO_CHAR (SYSDATE, ’DD-MON-YYYY’));
end parts_log;
Из рассмотренных выше примеров видно, что в PL/SQL имеются следующие уникальные языковые конструкции для триггеров баз данных:
• предикаты INSERTING, UPDATING, DELETING могут использоваться в операторах условного перехода в теле триггера.
• значения корреляции позволяют с помощью строковых триггеров обращаться к новым и старым значениям полей текущей строки. Когда оператором триггера является INSERT, все старые значения полей являются NULL –значениями. Аналогично, когда оператором триггера является DELETE, все новые значения являются соответственно NULL – значениями.
В связи с триггерами необходимо отметить, что, начиная с восьмой версии ORACLE, появляются так называемые INSTEAD OF триггеры, посредством которых становится возможным выполнять операции обновления над “необновляемыми представлениями”. В предыдущих версиях ORACLE обновляемыми были лишь те представления, которые соответствовали основному правилу обновления представлений. В 8-й версии ORACLE любое представление, для которого создан корректный триггер INSTEAD OF – обновляемое. Детальное описание триггеров instead of приведено в [3].
