Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вся метода 3 (2).doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
1.15 Mб
Скачать

2.8.3. Триггеры

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

Расширение возможностей защиты целостности данных с помощью триггеров

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

Триггеры позволяют писать процедуры, вызываемые при модификации табличных дан­ных в результате исполнения операторов INSERT, UPDATE или DELETE. Как к таблицам, так и к представлениям можно привязать триггеры, реализующие бизнес-правила в базе данных. Например, одно из бизнес-правил, определенных для базы данных BookShopDB, утверждает, что при добавлении книги к заказу необходимо пометить ее в инвентарном списке как проданную. К таблице BookOrders можно привязать триггер, срабатывающий при размещении заказа на книгу. Бизнес-логика триггера находит книгу в таблице Books и помечает ее как проданную.

Процедурная целостность данных

Прежде чем реализовывать триггер, следует выяснить, нельзя ли получить аналогичные результаты с использованием ограничений или правил. Для уникальной идентификации строк табличных данных используют целостность сущностей (ограничения primary key и unique key). Доменная целостность служит для определения значений по умолчанию (оп­ределения default) и ограничения диапазона значений, разрешенных для ввода в данное поле (ограничения check и ссылочные ограничения). Ссылочная целостность использует­ся для реализации логических связей между таблицами (ограничения foreign key и check). Если значение обязательного поля не задано в операторе INSERT, то оно определяется с помощью определения default. Лучше применять ограничения, чем триггеры и правила.

Правила оставлены в SQL Server 2000 для совместимости, а использование большого чис­ла триггеров зачастую снижает производительность системы. Оптимизатор запросов использует определения ограничений для построения высокопроизводительных планов исполнения запросов. Триггеры особенно полезны, поскольку позволяют описывать значительно более сложную логику по сравнению с той, что доступна методам декларативной целостности. Триггеры применяются в следующих случаях:

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

  • если необходимо каскадное изменение через связанные таблицы в базе данных. Например, чтобы изменять объем складских запасов при размещении заказа, следует создать риггер, привязанный к таблице Orders. Другой триггер, привязанный к таблице Inventory, при изменении количества товара на складе добавляет к таблице Purchasing запрос на закупку товара. Чтобы обновить или удалить данные в столбцах с ограничением foreign key, вместо пользовательского триггера следует применять ограничения каскадной ссылочной целостности;

  • если база данных денормализована и требуется способ автоматизированного обновле­ния избыточных данных в нескольких таблицах;

  • если необходимо сверить значение в одной таблице с неидентичным значением в другой таблице;

  • если требуется вывод пользовательских сообщений и сложная обработка ошибок.

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

Один триггер способен выполнять несколько действий и реагировать на несколько разных событий. Например, можно создать триггер, который реагирует на любое из собы­тий INSERT, UPDATE или DELETE, или в программе на языке Transact-SQL описать бизнес-логику для обработки каждого типа событий.

Нельзя устанавливать триггеры на временные или системные таблицы, хотя на такие таб­лицы разрешено ссылаться в операторах Transact-SQL самого триггера. Следует помнить о следующем важном ограничении: триггеры INSTEAD OF DELETE и INSTEAD OF UPDATE нельзя определять в таблицах, где заданы ограничения каскадной ссылочной целостности ON DELETE или ON UPDATE соответственно.

Автоматическое срабатывание триггера вызывают три события: INSERT, UPDATE и DELETE, которые происходят в таблице или представлении. Триггеры нельзя запустить вручную. В синтаксисе триггеров перед фрагментом программы, уникально определяющим выполняемую триггером задачу, всегда определено одно или несколько таких событий. Типы триггеров соответствуют этим событиям. Например, можно создать триггер на об­новление, срабатывающий при обновлении данных таблицы. Один триггер разрешается запрограммировать для реакции на несколько событий, поэтому несложно создать процедуру, которая одновременно является триггером на обновление и добавление. Порядок этих событий в определении триггера не ограничен.

Есть определенные обстоятельства, при которых событие модификации или удаления данных не вызывает срабатывания соответствующего триггера. Например, при исполне­нии оператора TRUNCATE TABLE не происходит срабатывание DELETE-триггера. Важной особенностью триггеров является автоматический откат неудачных транзакций. По­скольку TRUNCATE TABLE — непротоколируемое событие, его откат невозможен и оно не вызывает срабатывание DELETE-триггера. Кроме того, исполнение оператора WRITE-ТЕХТ не вызывает срабатывания INSERT- и UPDATE-триггеров.