Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы к экзамену по БД (ВФ) / !Все ответы по БД v0.2.13.docx
Скачиваний:
189
Добавлен:
10.05.2014
Размер:
3.32 Mб
Скачать

30. Триггеры в Transact sql. Пример реализации триггера.

Три́ггер (англ. trigger) — это хранимая процедура особого типа, исполнение которой обусловлено наступлением определенного события (действием) — по сути добавлением INSERT или удалением DELETE строки в заданной таблице, или модификации UPDATE данных в определенном столбце заданной таблицы реляционной БД.

Триггеры применяются для обеспечения целостности данных и реализации сложной бизнес-логики. Триггер запускается сервером автоматически при попытке изменения данных в таблице, с которой он связан. Все производимые им модификации данных рассматриваются как выполняемые в Транзакции, в которой выполнено действие, вызвавшее срабатывание триггера. Соответственно, в случае обнаружения ошибки или нарушения целостности данных может произойти откат этой транзакции. Момент запуска триггера определяется с помощью ключевых слов BEFORE, триггер запускается до выполнения связанного с ним события; например, до добавления записи) или AFTER (после события). В случае если триггер вызывается до события, он может внести изменения в модифицируемую событием запись (конечно, при условии, что событие — не удаление записи). Некоторые СУБД накладывают ограничения на операторы, которые могут быть использованы в триггере (например, может быть запрещено, вносить изменения в таблицу, на которой «висит» триггер, и т. п.)

Кроме того, триггеры могут быть привязаны не к таблице, а к представлению (VIEW). В этом случае с их помощью реализуется механизм «обновляемого представления». В этом случае ключевые слова BEFORE и AFTER влияют лишь на последовательность вызова триггеров, так как собственно событие (удаление, вставка или обновление) не происходит.

В [] необязательные параметры

Создание триггера

 CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { { { FOR | AFTER | INSTEAD OF }

{ DELETE] [,] [INSERT] [ , ] [ UPDATE ] } [ WITH APPEND ] [ 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 ] } }

trigger_name – название триггера

{ table | view } – имя таблицы или вьюхи на которую вешается триггер

[ WITH ENCRYPTION ] – шифровать или нет триггер

{ { FOR | AFTER | INSTEAD OF } – тип триггера (For – срабатывает до операции, After – после операции, INSTEAD OF - вместо)

{[DELETE] [,] [INSERT] [,] [UPDATE]} – операции на которые срабатывает триггер

[ WITH APPEND ] - Указывает, что требуется добавить триггер существующего типа. Не может быть использовано для триггеров INSTEAD OF или при явном указании триггера AFTER.

[ NOT FOR REPLICATION ] – не срабатывать при репликации

AS – после данного слова идет SQL скрипт самого триггера

IF UPDATE ( column ) – проверяет был ли изменен столбец column

IF (COLUMNS_UPDATED () – возвращает последовательность битов, которая показывает какие столбцы были изменена (например, табличка из столбцов Field1, Field2, Field3. Изменяем значение Field3. D результате после срабатывание триггера COLUMNS_UPDATED вернет нам 100 в двоичной системе или 4 в десятичной)

Для отката изменений используется

RAISERROR (‘Тест ошибки’, 16, 1) – вывод сообщения об ошибке

ROLLBACK TRANSACTION – откат изменений

В триггерах MSSQL существуют две системные таблицы Inserted и Deleted. В данных таблицах содержится полная структура (все поля) изменяемых таблиц и измененные данные.

  • при добавление, то в Inserted попадают добавляемые записи, а Deleted остается пустой

  • при удаление, то в Deleted попадают удаленные записи, а Inserted остается пустой.

  • при внесении изменения, то в Deleted попадают значения записей до изменения, а Inserted значения после изменения.

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

Пример:

CREATE TRIGGER CheckSpec

ON WorkSalesTable

FOR INSERT, UPDATE

AS

declare @work_Id int, @worker_Id int, @rr int

SELECT @work_Id = workId, @worker_Id = workerId FROM inserted

SELECT @rr=count(*) FROM WorkWorker WHERE workId = @work_Id AND workerId = @worker_Id

if(@rr = 0)

BEGIN

raiserror('You Can not do it!',16,1)

ROLLBACK transaction

END

GO