Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции2011.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
1.86 Mб
Скачать

Контрольные вопросы

  1. Что такое представление? Его назначение

  2. Объясните формат команд создания и удаления представлений

  3. Можно ли модифицировать представление и если да, то в каких случаях?

  4. Какое назначение предложения WITH CHECK OPTION?

Тема 2.4 Триггеры и хранимые процедуры

тип занятия: лекция

цель занятия: ознакомить с определением триггера, его назначениям; объяснить способы создания и модификации триггеров; дать определение хранимой процедуры

1.Определение триггера и его назначение

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

Вы можете написать триггеры, которые срабатывают в одной из следующих ситуаций:

  • Применение оператора DML к определенному объекту схемы.

  • Выполнение оператора DDL внутри схемы или базы данных.

  • Вход пользователя в систему или выход его из системы, ошибка сервера, запуск базы данных или остановка экземпляра.

Между триггерами и процедурами имеется три отличия:

    • Триггеры нельзя вызывать из кода программы. СУБД вызывает их автоматически в ответ на определенное событие.

    • Триггеры не имеют списка параметров.

    • Спецификация триггера не на много отличается от спецификации процедуры.

Сходство между триггерами и процедурами заключается в следующем:

  • Тело триггера выглядит точно так же, как тело процедуры — и то, и другое базовые блоки.

  • Триггер не возвращает никаких значений.

  • Триггеры можно использовать для выполнения разнообразных задач.

  • Триггеры автоматически генерируют производные значения столбцов.

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

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

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

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

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

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

Триггеры могут собирать статистику доступа к таблицам. Например, триггер позволяет зафиксировать, сколько раз на протяжении дня выполнялся запрос на «Small Widget» к таблице с каталогом товаров. Как вы уже, вероятно, поняли, триггеры являются весьма мощными инструментами. Однако их следует использовать аккуратно, поскольку триггер может срабатывать при каждом обращении к таблице, тем самым увеличивая нагрузку на сервер базы данных.

Умное практическое правило заключается в том, чтобы использовать триггер только для действий, которые не возможно выполнить другими средствами. Например, если имеется возможность создать одно или несколько ограничений, которые выполняют работу некоторого триггера, следует использовать эти ограничения. Если итоговые величины допустимо вычислять в нерабочее время, систему лучше спроектировать именно так, а не использовать триггеры, которые срабатывают при каждой транзакции. Представьте, например, что банк принимает решение о доставке дополнительной наличности из центрального хранилища в зависимости от того, сколько 20-долларовых банкнот было выдано за текущий день. Эту величину можно определять по завершении рабочего дня. Если же для обновления счетчика 20-долларовых банкнот будет использоваться триггер, то его постоянное выполнение может существенно замедлить скорость выполнения транзакций в рабочие часы.

Триггеры, определенные для таблиц, называются табличными триггерами (table triggers). Дальше речь пойдет именно о них. В самом простом случае синтаксис объявления триггера является таким:

CREATE TRIGGER <имя триггера >

{BEFORE|AFTER} <операции над таблицей > [ <список полей >] ON <іимя таблицы>

[WHEN (<условие >)]

<операторы SQL>.

Если условие во фразе WHEN является истинным или эта фраза отсутствует, до (BEFORE) или после (AFTER) выполнения операции INSERT, UPDATE или DELETE над таблицей, отмеченной после слова ON, будут выполнены указанные ниже операторы SQL. Когда таких операторов несколько, их следует поместить между ключевыми словами BEGIN ATIMIC и END. Конструкция второй строки определения триггера называется предложением инициации, WHEN – условием инициации, а <операторы SQL> - действием триггера.

Рассмотрим примеры применения триггеров.

После удаления информации о кафедре удалить информацию обо всех преподавателях кафедры.

CREATE TRIGGER Кафедра_Удаление

AFTER DELETE ON Кафедра

DELETE FROM Преподаватель

WHERE Преподаватель.#D = Преподаватель.#D

Момент_срабатывания определяет, когда будет срабатывать триггер: до (BEFORE) или после (AFTER) наступления события триггера (выполнение запускающего оператора). Если указанное значение BEFORE, триггер запускается до каких-либо проверок строк, которые затрагиваются тригерным событием. Никакие строки не блокируются. Триггер этого типа называется, соответственно, BEFORE-триггером (BEFORE trigger). Если выбрать ключевое слово AFTER, то триггер будет срабатывать после того, как запускающий оператор завершит свою работу и будут выполнены проверки всех ограничений. Строки, что в этом случае затрагиваются, блокируются на время выполнения триггера. Триггер этого типа называется AFTER-триггером (AFTER trigger).

Тригерное_событие может принимать значение INSERT, UPDATE или DELETE.

Тригерное_ограничение — это одно из дополнительных условий, которое должно быть выполнено для срабатывания триггера.

Необязательный набор ключевых слов FOR EACH ROW указывает на необходимость выполнить тело триггера для каждой строки, что задевает оператор запуска. Такие триггеры называются строчными (row triggers). Если опция FOR EACH ROW отсутствует, то при наступлении события триггера триггер выполняется только один раз. В этом случае он называется операторным триггером (statement trigger), поскольку выполняется только один раз для каждого запускающего оператора.

Различные события триггеров можно комбинировать при помощи оператора OR. Например:

DELETE OR INSERT другие_операторы

В случае использования UPDATE можно указать список столбцов:

UPDATE OR столбец_1, столбец_2...

Для триггеров, как и для представлений, не существует команды модификации. Старый триггер просто заменяется новым посредством команды CREATE OR REPLACE TRIGGER.

Триггер можно удалить, выдав команду со следующим синтаксисом:

DROP TRIGGER имя_триггера;

Существующие триггеры можно деактивировать и повторно активировать, используя команды с таким синтаксисом:

ALTER TRIGGER имя_триггера DISABLE;

ALTER TRIGGER имя_триггера ENABLE;