Разработка серверной части ИС в СУБД MS SQL Server. Особенности настройки свойств таблиц. Общие рекомендации по выбору типа данных, страница 8

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

SQL Server 2005 позволяет создавать два типа триггеров: DML-триггеры, которые выполняются при возникновении событий языка обработки данных (DML), и DDL-триггеры, срабатывающие при выполнении инструкций языка определения данных (DDL). DML-триггеры выполняются при изменении данных в указанной таблице или представлении с помощью инструкций INSERT, UPDATE, DELETE (т.е. при работе со строками таблицы). DDL-триггеры выполняются при возникновении на сервере таких DDL-событий, как создание, изменение или удаление объекта БД (например, таблицы, представления, но не строки). DDL-триггеры используются для администрирования БД (см. лабораторную работу 3).

Триггер и вызвавший его оператор Transact-SQL рассматриваются как единая транзакция, отменяемая (откатываемая) из триггера. Обычно в состав триггера входит набор команд выполнения некоторых действий над данными или проверки определенных условий. При невозможности обработки данных или невыполнимости условий происходит откат транзакции.

Создание триггера возможно владельцем БД. Это ограничение позволяет избежать случайного изменения структуры таблиц, способов связи с ними других объектов и т. п.

DML-триггеры

Для создания DML-триггеров используется оператор CREATE, упрощенный формат которого имеет следующий вид:

CREATETRIGGER [владелец.]имя_триггера

ON [владелец.]{имя_таблицы | имя_представления}

[WITH ENCRYPTION]

FOR [{AFTER | INSTEAD OF}]

{INSERT, UPDATE, DELETE}

AS

<onepaтopы_SQL>

Параметр WITHENCRYPTION (С шифрованием) служит для предотвращения возможности прочтения текста триггера после помещения его на сервер. После ключевого слова FOR указывается тип триггера: стандартный (AFTER), запускаемый после выполнения пользователем изменений данных, либо выполняемый взамен команды, приведшей к запуску триггера (INSTEAD OF). По умолчанию считается заданным тип AFTER.

Ключевые слова INSERT (Вставить), UPDATE (Обновить) и DELETE (Удалить) определяют операции, которые инициируют выполнение триггера. SQL Server сохраняет текст триггера в таблице системного каталога syscomments.

В отличие от хранимых процедур и функций DML-триггеры не являются отдельными объектами, и их нельзя исполнить напрямую. DML-триггер «привязан» к конкретной таблице или представлению и определяется для конкретного события. При возникновении этого события автоматически запускается на выполнение код триггера. Событиями, вызывающими запуск триггера, являются INSERT, UPDATE, DELETE. Именно эти триггеры можно запускать в двух режимах: AFTER и INSTEAD OF.

Триггер AFTER запускается после успешного завершения SQL Server всех операций. Например, при вставке строки в таблицу триггер, определенный для операции INSERT, запускается только после того, как строка пройдет все ограничения, заданные: первичными ключами, уникальными индексами, ограничениями, правилами и внешними ключами. Если любое из этих условий не проходит проверку, триггер не запускается. Триггер INSTEAD OF выполняется вместо операции, вызвавшей запуск триггера. Программный код триггера может состоять из любых допустимых элементов синтаксиса Transact-SQL, за исключением:

-  нельзя создавать, изменять, удалять резервные копии или восстанавливать БД;

-  в таблице, которая привела к запуску триггера, не допускаются изменения структуры с помощью инструкций CREATE / ALTER / DROP INDEX, ALTER / DROP TABLE и других.

Для таблицы или представления можно создать любое число триггеров AFTER, но для каждой операции изменения данных в таблице или представлении можно создать лишь один триггер INSTEAD OF.

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