
- •Добряк Павел Вадимович управление данными
- •Управление данными
- • Угту-упи, 2012
- •Введение
- •1. Основные определения
- •1.1. Элементы баз данных
- •1.2. Технологии управления данными
- •1.3. Модели данных
- •2. Реляционная модель
- •2.1. Основные понятия реляционной модели
- •2.2. Нормализация
- •2.3. Проблемы проектирования реляционных баз данных
- •Задачи для самостоятельного решения
- •3. Реляционные алгебра и исчисления
- •3.1. Реляционная алгебра
- •3.2. Реляционное исчисление на кортежах
- •3.3. Реляционное исчисление на доменах
- •4.1. Введение в sql
- •4.2. Пример реляционной базы данных
- •4.3. Запросы к одной таблице
- •4.4. Запросы к нескольким таблицам
- •4.5. Вложенные запросы
- •4.6. Вложенные подзапросы и кванторы
- •4.7. Объединение однотипных запросов
- •4.8. Рекурсивные запросы
- •Объединение однотипных запросов.
- •Запросы для самостоятельного программирования
- •5. Olap и хранилища данных
- •5.1. Архитектура хранилищ данных
- •5.2. Аналитические запросы
- •6. Триггеры, хранимые процедуры, события
- •7. Транзакции
- •7.1. Функции транзакций
- •7.2. Уровни изолированности
- •7.3. Сериализация транзакций
- •7.4. Синхронизационный захват
- •7.5. Метод временных меток
- •8. Обзор перспективных направлений баз данных
- •9. Объектные технологии в субд
- •9.1. Три манифеста баз данных
- •9.2. Объектная модель sql
- •9.3. Модель данных odmg и язык oql
- •10. Запросы к интернет-страницам
- •10.1. Теговая парадигма
- •10.2. Язык запросов xQuery
- •11. Пространственные базы данных
- •12. Лабораторные работы
- •13. Курсовая работа
- •13.1. Концептуальное проектирование
- •13.2. Семантическое проектирование
- •13.3. Физическое проектирование. Реляционная модель данных
- •13.4. Запросы
- •Объединение однотипных запросов.
- •13.5. Интеллектуализация базы данных.
- •13.6. Клиентская часть информационной системы
- •13.7. Дополнительные элементы базы данных
- •Вопросы к экзамену
- •1. Основные определения.
- •2. Реляционная модель
- •3. Реляционные алгебра и исчисления
- •10. Запросы к интернет-страницам
- •11. Пространственные базы данных
- •Литература
- •Список иллюстраций список таблиц
- •Список листингов
- •Алфавитный указатель
- •Список сокращений
6. Триггеры, хранимые процедуры, события
Триггер - это отдельная хранимая в БД подпрограмма, связанная с таблицей или представлением, которая автоматически включается, когда в таблицу или представление вставляется (триггер добавления), модифицируется (триггер модификации) или удаляется (триггер удаления) строка.
Триггеры позволяют:
Контролировать входные данные, обеспечивая достоверность информации и ее логическую непротиворечивость.
Выполнять синхронные изменения в нескольких таблицах, обеспечивая логическую целостность данных.
Обеспечить автоматическую регистрацию изменений в таблицах. Приложение может хранить полный протокол изменений, используя триггеры, которые включаются при каждом изменении таблицы.
Автоматически уведомлять об изменениях в БД, используя события, создаваемые триггерами.
Повысить независимость прикладного программного обеспечения. Изменение схемы контроля в триггере автоматически отражается во всех приложениях, не требуя внесения в них каких-либо изменений.
Хранимая процедура – отдельная подпрограмма, хранящаяся и выполняющаяся на сервере СУБД. Она может получать входные параметры и возвращать значения вызвавшим её клиентским приложениям. Хранимые процедуры могут обрабатывать и возвращать отдельные записи и множество записей.
SQL для триггеров и хранимых процедур содержит множество операторов императивного программирования: конкатенацию строк, арифметические операции, операции сравнения, логические (not, and, or), операторы структурного программирования (IF, FOR, WHILE), объявление переменных (DECLARE), возврат значений выхода переменных (SUSPEND), выход из процедуры (EXIT), генерацию события (POST_EVENT), обработку ошибок (WHEN), вызов процедуры (EXECUTE). Эти операторы используются совместно с операторами декларативного программирования INSERT, UPDATE, DELETE и SELECT. В современных СУБД код хранимых процедур и триггеров может писаться на смеси диалектов SQL и языков высокого уровня, например, в Oracle – на PL/SQL или Java. Фактически запросы, написанные на декларативном языке, вкладываются в процедуры, написанные на императивном языке (см. Рис. 26).
Рис. 26. Языковая структура хранимой процедуры и триггера
Пример хранимой процедуры приведен на Лист. 50. Она написана для базы данных «библиотека», состоящей из таблиц «книги», «авторы» и промежуточной таблицы, показывающей взаимосвязь авторов и книг. Хранимая процедура по коду книги возвращает авторов книги, записанных в одну строковую переменную. Процедура написана для СУБД Interbase и ее процедурная часть напоминает язык Pascal. Внутри нее «спрятан» SQL запрос, возвращающих авторов книги. Используя оператор For, идет обработка каждой записи, возвращаемой запросом. При этом поля из декларативной части помещаются в переменные процедурной части с помощью оператора INTO.
Лист. 50. Пример хранимой процедуры
CREATE PROCEDURE PBUTHOR (CODE INTEGER)
RETURNS (AUTHORS VARCHAR(250))
AS
DECLARE VARIABLE AUNAME VARCHAR(60);
DECLARE VARIABLE UNIKEY INTEGER;
DECLARE VARIABLE WS INTEGER;
BEGIN
WS=-1;
FOR SELECT A.UNIKEY, B.AUNAME
FROM TBOOK A, TAUTHOR B, TBOOK_AUTHOR C
WHERE (A.UNIKEY=:CODE AND A.UNIKEY=C.BOOKKEY AND C.AUTHOR=B.AUTHOR)
INTO :UNIKEY, :AUNAME
DO
BEGIN
IF (WS=-1) THEN AUTHORS=AUNAME;
ELSE AUTHORS = AUTHORS || ‘, ‘ || AUNAME;
WS = UNIKEY;
END
IF (WS!=-1) THEN SUSPEND;
END
Пример триггера приведен в Лист. 51. Это триггер, который выполняет вставку нового автора и предварительно проверяет, не пустое ли имя автора. Если пустое – то генерируется исключение.
Лист. 51. Пример триггера
CREATE TRIGGER I_TAUTHOR_1 FOR TAUTHOR
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.AUTHOR IS NULL) THEN
NEW.AUTHOR=GEN_ID(SYSNUMBER, 1);
IF (NEW.AUNAME IS NULL) THEN EXCEPTION NO_AUTHOR;
IF (NEW.COMMENT IS NULL) THEN NEW.COMMENT=” ”;
END
Событие – это вызов СУБД внешних или внутренних действий. Хранимая процедура или триггер генерирует событие, выдавая команду post_event eventname1. Обработка события строится по схеме: приложение формирует список событий event init requestname (eventname1, eventname2…); то или другое приложение выдает команду event wait requestname; по этой команде приложение останавливается и ждет события.
Обработка исключений похожа на обработку событий и строится по формату, приведенному на Лист. 52. В данном случае перехватывается исключение, сгенерированное триггером на Лист. 51 (пустое имя автора).
Лист. 52. Формат обработки исключений
WHEN NO_AUTHOR
DO
BEGIN…END
Подробнее о триггерах, хранимых процедурах и событиях см. [11].
Вопросы для самопроверки:
1. Чем триггер отличается от хранимой процедуры?