(SELECT 'TRUE'
FROM Progress
WHERE (DATEPART(mm,getDATE())<>'01' AND NTerm %2=1)
OR (DATEPART(mm,getDATE())<>'06' AND NTerm %2=0))
BEGIN
RAISERROR('Нельзя исправлять оценку!!!',20,1)
/*-- Откат транзакции в случае возникновения ошибки*/
ROLLBACK TRAN
END
Теперь любая попытка вставить или изменить данные в период, отличный от оговоренного, например попытка 14 декабря выполнить действия
UPDATE Progress SET mark=2 WHERE NRecordBook='050001'
INSERT INTO progress VALUES ('050001',1,2,1,4,5)
вызовет сообщение:
Server: Msg 50000
Нельзя исправлять оценку!!!
Пример 95
Задача.
Создать триггер, запрещающий изменять записи для нечетного семестра всегда, кроме января, для четных семестров всегда, кроме июня.
Решение.
CREATE TRIGGER ProgressTerm
ON PROGRESS
FOR INSERT, UPDATE, DELETE
AS
IF EXISTS
(SELECT 'TRUE'
FROM progress
WHERE (DATEPART(mm,getDATE())<>'01' AND NTerm %2=1)
OR (DATEPART(mm,getDATE())<>'06' AND NTerm %2=0))
BEGIN
RAISERROR('Сессия завершена! Правка запрещена!!!',16,1)
/*-- Откат транзакции в случае возникновения ошибки*/
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
Сессия завершена! Правка запрещена!!!
Пример 96
Задача.
Написать триггер, удаляющий строки в таблице 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
Пример 97
Задача.
Создать триггер, запрещающий исправлять оценку в отношении 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.