Ограничения использования триггеров
В триггерах не допускается использование следующих операторов:
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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!