Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методическое пособие по выполнению лабораторных работ по SQL.doc
Скачиваний:
167
Добавлен:
01.05.2014
Размер:
1.22 Mб
Скачать

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

Нельзя исправлять оценку!!!

Пример 93

Задача.

Создать триггер, запрещающий изменять записи для нечетного семестра всегда, кроме января, для четных семестров всегда кроме июня.

Решение.

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

Сессия завершена! Правка запрещена !!!

Пример 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 и триггер, который будет срабатывать на вставку строк и будет подсчитывать средний балл вводимого студента и выводить его фамилию и средний балл (по экзаменам).