Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие.doc
Скачиваний:
57
Добавлен:
14.05.2015
Размер:
1.51 Mб
Скачать

3. Использование триггеров. Виды триггеров

Различают триггеры вставки, обновления и удаления.

Триггеры вставки (INSERT) и обновления (UPDATE) особенно удобны, так как могут поддерживать условия ссылоч­ной целостности и обеспечения правильности данных перед их вводом в таблицу. Обычно триггеры применяют для обновления столбцов отсчета времени или для проверки данных в определен­ных столбцах на соответствие требуемому критерию. Триггеры следует применять, когда критерий проверки более сложен, чем условие декларативной ссылочной целостности.

Триггеры удаленияобычно применяются в двух случаях:

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

  • выпол­нение каскадных операций удаления дочерних строк главной строки.

Переменная @@ROWCOUNTпозволяет узнать, сколько строк составляет рабочий набор и регулировать количество уда­ляемых строк.

Оператор RASEERRORдает возможность указать текст сообщения, уровень опасности, состояние информации и ском­бинировать все это для пользователя в описательное сообщение.

Триггеры откатаимеют специальную опцию:

ROLLBACK TRIGGER [WITH RAISERROR номер_ошиб-ки [сообщение]]

Эта инструкция прекращающает все операции. Ра­бота триггера останавливается, отменяется модификация данных, которая вызвала выполнение триггера. При использовании инструкции триггера отката следует указать номер ошибки и сообщения.

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

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

Триггеры и механизм декларативной ссылочной целостно­сти обычно не могут работать вместе. Следует применять либо триггер, либо условие ссылочной целостности (через FOREIGNKEY). Для изменения триггера можно использоватьSQLServerEnterpriseManagerили командуALTER TRIGGER, которая имеет тот же синтаксис, что и команда создания триггера.

Системные процедуры sp_help,sp_dependsиsp_helptextпредоставляют следующую информацию о триггере: существует ли триггер, к каким структурам он обращается, что является его текстом и источником кода. Эти процедуры работают, если не применялась опцияENCRYPTION.

Системная процедура sp_help сообщает информацию о любом объекте базы данных. Если не указано имя объекта, тоSQLServerсообщает информацию обо всех пользовательских объектах, найденных в таблицеSysobjects. Эта системная проце­дура сообщает имя создателя триггера и время его создания.

Процедура sp_helptext представляет текст триггера, хра­нящийся в таблицеSyscomments.

Для удаления триггера используют команду

DROP TRIGGER[владелец.] имя_триггера[,…n]

При удалении таблицы удаляются и связанные с нею триг­геры.

Поддержка в системе SQLServerцелостности ссылок, вы­полняемой в СУБДAccessавтоматически, без триггеров невоз­можна.

Для примера рассмотрим использование триггера для поддержания целостности данных в небольшой БД.

Для этого создадим следующие две таблицы:

  1. Имя таблицы: TABLE1,

используемые поля:

MYIDINT,MYNAMECHAR(15);

  1. Имя таблицы: TABLE2,

используемые поля:

MYIDINT,MYVALUE SMALLMONEY.

Следующим этапом разработки структуры будет опреде­ление триггера INCHECKдля таблицыTABLE2, который будет проверять наличие вводимого значенияMYIDв полеMYIDтаблицыTABLE1. Другими словами, созда­ваемый триггер не позволит добавить новую запись в таблицуTABLE2, если значение в полеMYIDне совпадает со значением в полеMYIDтаблицыTABLE1.

Для создания триггера INSCHECKс помощью утилитыSQLServerEnterpriseManagerнеобходимо выбрать таблицуTABLE2в списке объектов базы данных, после чего выполнить командуВсе задачи /Manager TriggersменюДействие. Это приведет к открытию диалогового окна свойств триг­гера. В данное диалоговое окно введите следующий текст:

CREATE TRIGGER INCНECK ON TABLE2

FOR INSERT

AS

DECLARE @X INT

SELECT @X=I.MYID FROM TABLE2 A,

INSERTED I WHERE A.MYID=I.MYID

IF NOT (EXISTS (SELECT * FROM

TABLE1 WHERE MYID=@X))

BEGIN

ROLLBACK TRAN

RAISERROR (‘Ошибка целостности!!!’,16,10)

END

Рассмотрим подробнее команды данного листинга. Здесь с помощью первых строк определяется создание нового триггера с именем INCНECKдля таблицыTABLE2, причем создание триг­гера определяется для процесса добавления новых записей (клю­чевое словоINSERT). Далее определяется переменная@X, кото­рой будет присваиваться значениеMYIDдобавляемой записи.

В процессе использования триггера создается временная таблица INSERTED, хранящая в себе добавляемые значения начальной таблицыTABLE2. С помощью оператораSELECTпеременной@Xприсваивается значение поляMYIDиз таблицыTABLE2, т.е. значение поляMYIDвновь добавляемой записи.

Следующим шагом работы триггера будет определение наличия в поле MYIDтаблицыTABLE1значения переменной@X, т.е. осуществляется проверка допустимости вводимого зна­чения. Если данное значение не найдено, то выполняется блок операторов, заключенных в областиBEGINEND. Здесь с помо­щью командыROLLBACK TRAN осуществляется отмена последней опе­рации добавления данных. При этом с помощью оператораRAISERRORосуществляется выдача системного сообщения об ошибке, с текстом, указанным внутри данного оператора.Значе­ния 16 и 10 данной команды определяют уровень критичности ошибки.

Проверьте работоспособность данного триггера, предва­рительно добавив значения в основную определяющую таблицу TABLE1. При этом удобно проверить функционирование данного триггера, производя удаление с помощью утилиты SQL Server Query Analyzer, что позволит увидеть системные сообщения об ошибке, возникающие при его работе.

Следующим, разрабатываемым в данном примере, будет триггер таблицы TABLE1, позволяющий удалять все зависимые записи из таблицы TABLE2 при удалении загаси из таблицы TABLE1. Другими словами, если в таблице TABLE1 произво­дит­ся удаление записи, то при этом должны удаляться все записи из таб­лицы TABLE2, у которых значение поля MYID соответствует значению поля MYID удаляемой из таблицы TABLE1 записи.

Для этого создайте в таблице TABLE1 новый триггер DELCHECK, выполняющий следующий код:

CREATE TRIGGER DELCHECK ON TABLE1

FOR DELETE

AS

DECLARE @X INT

SELECT @X=D.MYID FROM TABLE1 A,

DELETED D WHERE A.MYID=D.MYID

IF EXISTS (SELECT * FROM

TABLE2 WHERE MYID=@X)

DELETE FROM TABLE2 WHERE MYID=@X

Рассмотрим подробней данные SQL-команды. В первых строках этого кода создается новый триггер с именем DELCHECK для таблицы TABLE1, активизирующийся при удалении (ключе­вое слово DELETE) записи. Следующим шагом является опреде­ление переменной @X, которая будет содержать значение поля MY1D удаляемой записи. Затем с помощью оператора SELECT данной переменной присваивается значение поля MYID таблицы DELETED, в которой и буферизуется удаляемая запись. С помо­щью оператора EXISTS определяется наличие данных в таблице TABLE2, для которых в поле MY1D находится значение . Если таковые записи найдены, то система выполняет опера­цию удаления таких записей.