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

Другие аспекты использования триггеров

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

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

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

Рассмотрим примеры.

Пример 5.2 После добавления или обновления строки в таблице КАФЕДРА установить значение поля Фонд в таблице Факультет равным сумме фондов всех кафедр соответствующего факультета.

CREATE TRIGGER Факультет_Фонд

AFTER INSERT OR UPDATE ON Кафедра

BEGIN

UPDATE Факультет

SET Фонд = SELECT SUM(Фонд)

FROM Кафедра

WHERE Кафедра.#F = Кафедра.NEW.#F AND

Факультет.#F = Кафедра.NEW.#F

END

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

    1. Перед выполнением добавления, обновления и удаления неявно инициируется команда BEGIN TRANSACTION.

    2. Реализуется операция добавления/ обновление/ удаление.

    3. Инициируется и выполняется триггер.

    4. Триггер отменяет транзакцию или за умалчиванием его действие завершается.

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

CREATE TRIGGER Кафедра_Прибавление

BEFORE INSERT ON Кафедра

WHEN TO EXISTS (SELECT * FROM Факультет WHERE Факультет.#F = Кафедра.#F)

BEGIN

ROLLBACK TRANSACTION

END

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

3. Хранимые процедуры

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

Хранимая процедура может выполнять SQL-операторы и манипулировать данными в таблицах. Ее можно вызывать с другой процедуры, что сохраняется, функции, что сохраняется, или триггера, а также непосредственно из строки приглашения.

Процедура состоит из двух основных частей: спецификации и тела. Спецификация процедуры (procedure specification) включает имя процедуры и описание ее входных и исходных данных. Эти входные и исходные данные называются формальными параметрами (formal parameters) или формальными аргументами (formal arguments). Если при вызове процедуры указываются параметры командной строки или другие входные данные, эти значения называются фактическими (actual) параметрами или фактическими аргументами.

Теперь рассмотрим некоторые примеры спецификаций процедур. (Помните, что спецификация не содержит никакого кода; в ней определяется только имя процедуры, а также ее входные и исходные параметры.)

rtm_ytd_reports

Эта простая спецификация содержит только имя процедуры. Данная процедура не имеет параметров.

\’ •.., -... increase_prices (percent_increase NUMBER)

Этой процедуре при вызове может быть передано значение. Внутри процедуры значение будет известно под именем PERCENT_INCREASE. Обратите внимание, что здесь указанный тип данных: NUMBER.

\ ‘ increase_salary_find_tax (increase_percent IN NUMBER := 7

sal IN OUT NUMBER

tax OUT NUMBER

)

Здесь мы видим процедуру с тремя формальными параметрами. Слово IN после имени параметра означает, что при вызове процедура может считать из этого параметра входное значение. Слово OUT означает, что процедура может использовать данный параметр для возвращения значения в ту программу, из которой она была вызвана. Комбинация IN OUT после имени параметра говорит о том, что параметр может использоваться как для передачи значения процедуре, так и для возвращения значения.

Параметру INCREASE_PERCENT в этом примере присвоенное значение по умолчанию (default value), равное 7, путем добавления := 7 после типа данных. Таким образом, если процедура будет вызвана без указания процента прироста, она увеличит переданное значение зарплаты на 7% и рассчитает налог, исходя из новой зарплаты.

Типы данных в процедуре не могут иметь спецификаций размера. Например, вы можете указать для параметра тип данных NUMBER, а не NUMBER(10,2).