Вы находитесь на странице: 1из 5

Презентация №10.

Использование
триггеров
Три́ггер (англ. trigger) — хранимая процедура особого типа, которую пользователь
не вызывает непосредственно, а исполнение которой обусловлено действием по

модификации данных: добавлением  INSERT , удалением  DELETE  строки в заданной

таблице, или изменением  UPDATE  данных в определённом столбце заданной


таблицы реляционной базы данных. Триггеры применяются для обеспечения целостности
данных и реализации сложной бизнес-логики. Триггер запускается сервером
автоматически при попытке изменения данных в таблице, с которой он связан. Все
производимые им модификации данных рассматриваются как выполняемые в транзакции,
в которой выполнено действие, вызвавшее срабатывание триггера. Соответственно, в
случае обнаружения ошибки или нарушения целостности данных может произойти откат
этой транзакции.

Момент запуска триггера определяется с помощью ключевых слов  BEFORE  (триггер


запускается до выполнения связанного с ним события; например, до добавления записи)

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

Кроме того, триггеры могут быть привязаны не к таблице, а к представлению (VIEW). В


этом случае с их помощью реализуется механизм «обновляемого представления». В этом

случае ключевые слова  BEFORE  и  AFTER  влияют лишь на последовательность вызова
триггеров, так как собственно событие (удаление, вставка или обновление) не происходит.

В некоторых серверах триггеры могут вызываться не для каждой модифицируемой


записи, а один раз на изменение таблицы. Такие триггеры называются табличными.

Пример:

/* Триггер на уровне таблицы */


CREATE OR REPLACE TRIGGER DistrictUpdatedTrigger
AFTER UPDATE ON district

1
BEGIN
insert into info values ('table "district" has changed');
END;

В этом случае для отличия табличных триггеров от строчных вводится дополнительные


ключевые слова при описании строчных триггеров. В Oracle это словосочетание FOR
EACH ROW.

Пример:

CREATE OR REPLACE TRIGGER DistrictUpdatedTrigger


AFTER UPDATE ON district
BEGIN
insert into info values ('one string in table "district" has changed');
END;

Для рассмотрения операций с триггерами определим следующую базу данных productsdb:

1 CREATE DATABASE productsdb;


2 GO
3 USE productsdb;
4 CREATE TABLE Products
5 (
6     Id INT IDENTITY PRIMARY KEY,
7     ProductName NVARCHAR(30) NOT NULL,
8     Manufacturer NVARCHAR(20) NOT NULL,
9     ProductCount INT DEFAULT 0,
10     Price MONEY NOT NULL
11 );
12 CREATE TABLE History
13 (
14     Id INT IDENTITY PRIMARY KEY,
15     ProductId INT NOT NULL,
16     Operation NVARCHAR(200) NOT NULL,
17     CreateAt DATETIME NOT NULL DEFAULT GETDATE(),
18 );

Здесь определены две таблиц:


Products - для хранения товаров и
History - для хранения истории операций с товарами.

Добавление

2
При добавлении данных (при выполнении команды INSERT) в триггере мы можем
получить добавленные данные из виртуальной таблицы INSERTED.
Определим триггер, который будет срабатывать после добавления:

1 USE productsdb
2 GO
3 CREATE TRIGGER Products_INSERT
4 ON Products
5 AFTER INSERT
6 AS
7 INSERT INTO History (ProductId, Operation)
8 SELECT Id, 'Добавлен товар ' + ProductName + '   фирма ' + Manufacturer
9 FROM INSERTED

Этот триггер будет добавлять в таблицу History данные о добавлении товара, которые
берутся из виртуальной таблицы INSERTED.
Выполним добавление данных в Products и получим данные из таблицы History:

1 USE productsdb;
2 INSERT INTO Products (ProductName, Manufacturer, ProductCount, Price)
3 VALUES('iPhone X', 'Apple', 2, 79900)
4
5 SELECT * FROM History

Удаление данных

При удалении все удаленные данные помещаются в виртуальную таблицу DELETED:

1 USE productsdb
2 GO
3 CREATE TRIGGER Products_DELETE
4 ON Products

3
5 AFTER DELETE
6 AS
7 INSERT INTO History (ProductId, Operation)
8 SELECT Id, 'Удален товар ' + ProductName + '   фирма ' + Manufacturer
9 FROM DELETED

Здесь, как и в случае с предыдущим триггером, помещаем информацию об удаленных


товарах в таблицу History.

Выполним команду на удаление:

1 USE productsdb;
2 DELETE FROM Products
3 WHERE Id=2
4
5 SELECT * FROM History

Изменение данных
Триггер обновления данных срабатывает при выполнении операции UPDATE. И в таком
триггере мы можем использовать две виртуальных таблицы. Таблица INSERTED хранит
значения строк после обновления, а таблица DELETED хранит те же строки, но до
обновления.

4
Создадим триггер обновления:
1 USE productsdb
2 GO
3 CREATE TRIGGER Products_UPDATE
4 ON Products
5 AFTER UPDATE
6 AS
7 INSERT INTO History (ProductId, Operation)
8 SELECT Id, 'Обновлен товар ' + ProductName + '   фирма ' + Manufacturer
9 FROM INSERTED

И при обновлении данных сработает данный триггер:

Задание:

Написать триггеры (before, after, instead of DML) для любой таблицы в базе данных и
проверить эффекты работы

Предусмотрены произвольные задания для индивидуальной практики и разработке на C#

Вам также может понравиться