- •Введение
- •Лабораторное занятие № 1
- •Описание учебного примера.
- •Удаление таблиц
- •Создание таблиц
- •Имена ограничений
- •Ограничения null и not null
- •Ограничение primary key
- •IdSubject, idReport, nTerm));
- •Ограничение unique
- •Ограничение Foreign key
- •Ограничение check
- •Вопросы для самоконтроля к лабораторной работе № 1
- •Лабораторная работа № 2
- •Команда вставки - insert
- •Команда обновления - update
- •Команда удаления - delete
- •Вопросы для самоконтроля к лабораторной работе № 2
- •Лабораторная работа №3
- •Команда alter table
- •Модификация ограничений
- •Добавление ограничений с ограниченной областью проверки
- •Отключение и подключение ограничений
- •Правила для изменения и модификации описания столбцов
- •Добавление столбца
- •Модификация столбца
- •Удаление столбца
- •Удаление таблицы
- •Переименование таблицы
- •Вопросы для самоконтроля к лабораторной работе № 3
- •Лабораторная работа № 4
- •Выборка данных из нескольких таблиц
- •Определение условий выборки в предложении where.
- •Групповые функции и предложение group by
- •Наиболее часто встречающиеся ошибки при выполнении group by
- •Предложение order by
- •Вопросы для самоконтроля к лабораторной работе № 4
- •Лабораторная работа № 5
- •Подзапросы
- •Inner join Student s
- •Inner join Student s
- •Inner join
- •Inner join Student s
- •Вопросы для самоконтроля к лабораторной работе № 5
- •Лабораторная работа №6
- •Представления
- •Вопросы для самоконтроля к лабораторной работе № 6
- •Лабораторная работа №7
- •Хранимые процедуры
- •Оператор use
- •Оператор declare
- •Операторы set и select
- •Функция @@identity
- •Функция @@error
- •Объявление параметров
- •Изменение хранимых процедур
- •Удаление хранимой процедуры
- •Лабораторная работа №8
- •If exists
- •Вопросы для самоконтроля к лабораторной работе № 8
- •Задания в тестовой форме
- •Литература Оглавление
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 и триггер, который будет срабатывать на вставку строк и будет подсчитывать средний балл вводимого студента и выводить его фамилию и средний балл (по экзаменам).