CREATE TRIGGER


Главная - Примеры разработки 1С - CREATE TRIGGER
CREATE TRIGGER [owner.]trigger_name
ON [owner.]table_name
FOR {INSERT, UPDATE, DELETE}
[WITH ENCRYPTION]
AS sql_statements
Или используя предложение IF UPDATE
CREATE TRIGGER [owner.]trigger_name
ON [owner.]table_name
FOR {INSERT, UPDATE}
[WITH ENCRYPTION]
AS
IF UPDATE (column_name)
[{AND | OR} UPDATE (column_name)...] sql_statements
Этот оператор создает триггер - специальную разновидность хранимой процедуры, которая выполняется в тех случаях, когда пользователь пытается добавить, удалить или модифицировать данные. Триггеры часто используются для реализации бизнес-логики и проверки целостности данных.
Таблицы INSERTED и DELETED
Когда триггер срабатывает и начинает выполняться, во время его выполнения существуют две специальные таблицы - INSERTED и DELETED. В них находятся записи, соответсвенно добавляемые или удаляемые. Глобальная переменная @@ROWCOUNT указывает на число записей, учавствующих в операциях с данными.
!
Обратите внимание: Триггер срабатывает один раз на всю операцию вставки, модификации или удаления данных. Даже если операция реально не затрагивает ни одной записи, как, например, в случае
DELETE FROM PAYS WHERE 1=2
триггер все равно сработает, @@ROWCOUNT будет равен нулю, а таблица DELETED пуста Невозможно создать триггер на VIEW.
Пример

CREATE TRIGGER employee_insupd
ON employee
FOR INSERT, UPDATE
AS
/* Get the range of level for this job type from the jobs table. */
DECLARE @min_lvl tinyint,
@max_lvl tinyint,
@emp_lvl tinyint,
@job_id smallint
SELECT @min_lvl = min_lvl,
@max_lvl = max_lvl,
@emp_lvl = i.job_lvl,
@job_id = i.job_id
FROM employee e, jobs j, inserted i
WHERE e.emp_id = i.emp_id AND i.job_id = j.job_id
IF (@job_id = 1) and (@emp_lvl <> 10)
BEGIN
RAISERROR ( Job id 1 expects the default level of 10. ,16,-1)
ROLLBACK TRANSACTION
END
ELSE
IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl)
BEGIN
RAISERROR ( The level for job_id:%d should be between %d and %d. ,
16, -1, @job_id, @min_lvl, @max_lvl)
ROLLBACK TRANSACTION
END