/*-- Откат транзакции в случае возникновения ошибки*/
ROLLBACK TRAN
END
Теперь попытка ввода или редактирования данных в период между сессиями:
update Progress SET mark=2 WHERE NRecordBook='050001'
INSERT INTO Progress
VALUES ('050001',1,2,1,4,5)
UPDATE Progress SET mark=2
WHERE NRecordBook='050001'
потерпит неудачу и будет выдано сообщение
Server: Msg 50000
Сессия завершена! Правка запрещена !!!
Пример 94
Задача.
Написать триггер, удаляющий строки в таблице Progress относящиеся к записям удаляемым из отношения Student.
Решение
CREATE TRIGGER StudentProgress
ON Student
FOR INSERT, UPDATE, DELETE
AS
DECLARE @COUNT int
SELECT @COUNT=COUNT(*) FROM DELETED
-- Проверяем удалялись ли из главной таблицы Student какие-либо записи.
-- Если да, то удаление необходимо выполнить и из зависимой таблицы
IF @COUNT>0
BEGIN
DELETE FROM PROGRESS
FROM DELETED D
JOIN PROGRESS P
ON D.NRecordBook=P.NRecordBook
END
Пример 95
Задача.
Создать триггер, запрещающий исправлять оценку в отношении Progress на более высокую.
Решение
CREATE TRIGGER Update1Progress
ON PROGRESS FOR UPDATE
AS
IF EXISTS
( SELECT 'TRUE'
FROM INSERTED I
LEFT JOIN DELETED D
ON D.NRecordBook=I.NRecordBook
WHERE I.mark>D.mark)
BEGIN
RAISERROR('Нельзя исправлять оценку!!!',16,1)
-- Откат транзакции в случае возникновения ошибки
ROLLBACK TRAN
END
Теперь выполнение команды, пытающейся заменить оценку 3 на оценку 4
UPDATE Progress
SET mark=4
WHERE NRecordBook='050001'
Завершится следующим сообщением
Server: Msg 50000
Нельзя исправлять оценку!!!
Триггеры можно включать и выключать с помощью команды ALTER.
Cинтаксис команды
ALTER TABLE <имя таблицы>
<ENABLE|DISABLE> TRIGGER <ALL|<имя триггера>>
Задание 31
Создать триггер, запрещающий добавление строк в таблицу PLAN.
Задание 32
Создать триггер, запрещающий обновление строк в таблице SUBJECT.
Задание 33
Создать триггер, запрещающий обновление строк в таблице WORK.
Задание 34
Создать хранимую процедуру, выполняющую вставку строк в таблицу Progress и триггер, который будет срабатывать на вставку строк и будет подсчитывать средний балл вводимого студента и выводить его фамилию и средний балл (по экзаменам).
Вопросы для самоконтроля к лабораторной работе № 8
1. С каким объектом базы данных связан триггер и как запускается триггер?
2. Какие существуют типы триггеров в SQL Server 2000 (по типу операции, по поведению)?
3. Сколько триггеров каждого типа можно создать для одной таблицы?
4. Какие операции не могут выполняться в триггере?
5. С помощью какой команды изменяются параметры триггера?
6. С помощью какой команды удаляется триггер, кто обладает правом удаления триггера?
7. Какие таблицы автоматически создаются при вызове триггера? От чего зависит содержимое этих таблиц?
8. В чём сходство и отличие триггера и хранимой процедуры?
9. В чём преимущества хранимых процедур? Для чего обычно используются хранимые процедуры?
10. Могут ли хранимые процедуры возвращать значения?