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('Нельзя исправлять оценку!!!',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.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: