Создание и управление индексами. Создание и управление встроенными процедурами. Оптимизация производительности запросов. Управление транзакциями и блокировками, страница 23

Следующий код показывает работу триггера:

DELETE FROM Employees WHERE EmployeeID>6

Изменение и удаление триггеров

Если вы хотите изменить объявление существующего триггера, вы можете изменить его без удаления и воссоздания. Вы можете изменить и действие, на которое реагирует триггер. Например, если триггер реагирует на вставку, то вы можете изменить его и на изменение.

Вы можете ссылаться в объявлении триггера на объекты, которые не существуют. Если по время создания объявления, какой-то объект не существует, то вы увидите предупреждение.

Синтаксис:

ALTER TRIGGER trigger_name

ON ( table | view )

[ WITH ENCRYPTION ]

{

{ ( FOR | AFTER | INSTEAD OF ) { [ DELETE ] [ , ]

[ INSERT ] [ , ] [ UPDATE ] }

[ NOT FOR REPLICATION ]

AS

sql_statement [ ...n ]

}

|

{ ( FOR | AFTER | INSTEAD OF ) { [ INSERT ] [ , ] [ UPDATE ] }

[ NOT FOR REPLICATION ]

AS

{ IF UPDATE ( column )

[ { AND | OR } UPDATE ( column ) ]

[ ...n ]

| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )

{ comparison_operator } column_bitmask [ ...n ]

}

sql_statement [ ...n ]

}

}

Следующий пример изменяет созданный нами ранее триггер. Новая версия позволяет удалять до 6 строк.

USE ClassNorthwind

GO

ALTER TRIGGER Empl_Delete ON Employees

FOR DELETE

AS

IF (SELECT COUNT (*) FROM Deleted)>6

BEGIN

RAISERROR('Вы не можете удалить более одной строки', 16,1)

ROLLBACK TRANSACTION

END

Вы можете включать и выключать определённый триггер или все триггеры на таблицу. Когда триггер отключён, он всё ещё существует в таблице, однако не выполняется на указанные события. Вы можете отключить триггер с помощью команды ALTER TABLE.

Синтаксис:

ALTER TABLE table

{ENABLE | DISABLE} TRIGGER

{ALL | trigger_name[,..n]}

Для удаления триггера вы можете воспользоваться оператором DROP TRIGGER. Он удаляется автоматически, когда связанная с ним таблица удаляется.

Для выполнения этого действия, вы должны обладать соответствующими правами.

11.3 Как работают триггеры

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

Как работает триггер INSERT

Вы можете объявить триггер для выполнения во время вставки данных в таблицу. Когда триггер срабатывает, новые строки добавляются в таблицу триггера и таблицу inserted. Таблица inserted – это логическая таблица, которая содержит копию строк, которые должны быть вставлены в таблицу. Она содержит журнал активности оператора INSERT. Вы можете использовать данные из этой таблицы для определения вставляемых данных. Строки из таблицы inserted всегда дублируют одну или несколько строк таблицы триггера.

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

Пример

Следующий пример создаёт триггер в котором происходит сравнение текущего значения с новым:

USE Northwind

GO

CREATE TRIGGER OrdDet_Insert ON [Order Details]

FOR INSERT

AS

UPDATE P SET

UnitInStock = (P.UnitsInStock - I.Quality)

FROM Products AS P INNER JOIN Inserted AS I

ON P.ProductID=I.ProductID

Как работает триггер DELETE

Когда срабатывает триггер удаления, удаляемые строки помещаются в таблицу deleted. Это логическая таблицы, которая ссылается на данные журнала из оператора DELETE.

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

*  Когда строки добавляются в таблицу deleted, они ещё существуют в таблице базы данных.

*  Для таблицы deleted выделяется память, поэтому она всегда в КЭШе.

*  Триггер удаление не выполняется на операцию TRUNCATE TABLE, потому что эта операция не заносится в журнал и не удаляет строк.

Пример

Следующий пример создаёт триггер для таблицы категорий. Если из категории удалена строка, то соответствующий продукт не имеет скидки и поле Discount устанавливается в 1:

USE Northwind

GO

CREATE TRIGGER Category_Delete ON Categories

FOR DELETE

AS

UPDATE P SET Discount = 1

FROM Products AS P INNER JOIN Deleted AS d