Ограничения использования триггеров



 

В триггерах не допускается использование следующих операторов:

 

ALTER DATABASE

CREATE DATABASE

DISK INIT

DISK RESIZE

DROP DATABASE

LOAD DATABASE

LOAD LOG

RECONFIGURE

RESTORE DATABASE

RESTORE LOG

 

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

Для триггеров INSTEAD OF срабатывание на удаление или обновление не допускается, если на таблицу наложена связь с указанием каскадного удаления или обновления соответственно. Также не допускается использование данного типа триггеров для представлений, в которых указано WITH CHECK OPTION.

 

Триггеры Insert

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

 

Пример. Триггер изменяющий количество товара при его заказе клиентом.

 

CREATE TRIGGER Order_Insert
ON [Order Details]
FOR INSERT
AS
UPDATE Prod SET
Kol = (Prod.Kol - Ins.Kol)
FROM Products AS Prod INNER JOIN Inserted AS Ins
ON Prod.ProdN = Ins.ProdN

 

Триггеры Delete

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

 

Пример. Триггер, задающий для товаров удаляемой категории признак ‘Не используется’.

CREATE TRIGGER Kategor_Delete
ON Kategories
FOR DELETE
AS
UPDATE Prod SET Prizn = ‘Не используется’
FROM Products AS Prod INNER JOIN deleted AS del
ON Prod.KategN = del. KategN

 

Триггеры Update

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

 

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

CREATE TRIGGER Sotr_Update
ON Sotr
FOR UPDATE
AS
IF UPDATE (TabN)
BEGIN
RAISERROR ('Транзакция не может быть выполнена.\
***** Табельный номер сотрудника не может быть изменен.', 10, 1)
ROLLBACK TRANSACTION
END

 

Триггеры Instead of

Данный тип триггера может быть задан как на таблицу, так и на представление. На каждую таблицу или представление может быть задан только один триггер данного типа на каждое действие по изменению данных (INSERT, UPDATE, or DELETE).

 

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

CREATE TRIGGER Clients_Update
ON ClientsView
INSTEAD OF UPDATE AS
DECLARE @Country nvarchar(15)
SET @Country = (SELECT Country FROM Inserted)
IF @Country = 'Германия'
BEGIN
UPDATE ClientsGer
SET ClientsGer.Phone = Inserted.Phone
FROM ClientsGer JOIN Inserted
ON ClientsGer. ClientID = Inserted. ClientID
END
ELSE
IF @Country = 'Россия'
BEGIN
UPDATE ClientsRus
SET ClientsRus.Phone = Inserted.Phone
FROM ClientsRus JOIN Inserted
ON ClientsRus.ClientID = Inserted.ClientID
END

 

Изменение триггеров

Изменение действий самого триггера и набора вызывающих его срабатывание действий возможно с помощью оператора ALTER TRIGGER. При этом используется следующий синтаксис:

ALTER TRIGGER trigger_name
ON table
[WITH ENCRYPTION]
{{FOR {[,] [DELETE] [,] [UPDATE] [,][INSERT]}
[NOT FOR REPLICATION]
AS
sql_statement [...n] }
|
{FOR {[,] [INSERT] [,] [UPDATE]}
[NOT FOR REPLICATION]
AS
IF UPDATE (column)
[{AND | OR} UPDATE (column) [,...n]]
sql_statement [...n] }
}

Включение и отключение триггеров

Имеющиеся для таблицы триггеры можно отключать и задействовать снова при помощи оператора Transact-SQL ALTER TABLE:

ALTER TABLE table
{ENABLE | DISABLE} TRIGGER
{ALL | trigger_name[,…n]}


Дата добавления: 2018-08-06; просмотров: 202; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!