ЛР №9
.docxМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
«Национальный исследовательский университет «МИЭТ»
Факультет «Микроприборы и системы управления» (МПСУ)
Кафедра «Вычислительная техника» (ВТ)
Лабораторная работа №9 по дисциплине
«Базы данных»
Тема: «Триггеры, курсоры, транзакции в SQL Server»
Цель работы: получить навыки применения курсоров, использования транзакций, а также работы с триггерами в MS SQL Server.
Продолжительность работы: 4 часа.
Выполнила студентка группы «ИВТ-44»: Никитина София Геннадьевна
Преподаватель: Немченко Дмитрий Игоревич
2021 г.
Содержание
Выполнение работы 3
Триггер AFTER 3
Триггер INSTEAD OF 4
Вывод 6
Выполнение работы
Задание 1. Базу данных, созданную в рамках Л.р. №7,8 дополнить триггерами в соответствии с необходимыми по логике функционирования БД ограничениями. При необходимости использовать механизм курсоров и механизм управления транзакциями.
Задание 2. Проверить работоспособность в БД изменений. Результат занести в отчет.
Триггер AFTER
Раннее обсуждалось, что пол должен указываться как «мужской» или «женский» с ограничением в 7 символов. Создадим триггер, который откатывает изменения в случае неверно указанного пола и принимает изменения в случае верно указанного.
Рисунок 1. Таблица студентов.
Создадим триггер. CREATE OR ALTER – указывает на создание или изменение уже существующего триггера при каждом запуске. DECLARE использовался, т.к. прямая отсылка к измененной ячейке в колонке «Пол» – невозможна. Для этого обратились к курсору в временно созданной таблице inserted, содержащей новые значения. Использование ROLLBACK TRANSACTION откатывает изменения.
CREATE OR ALTER TRIGGER Неверный_пол
ON Студент AFTER UPDATE, Insert
AS IF UPDATE (Пол)
BEGIN
DECLARE @sex VARCHAR(7)
SELECT @sex = (SELECT Пол FROM inserted)
IF (@sex = 'мужской') OR (@sex = 'женский')
BEGIN
PRINT 'Изменение пола успешно'
PRINT ('Указанный пол: ' + @sex)
END
ELSE
BEGIN
PRINT 'Пожалуйста, укажите пол "мужской" или "женский"'
PRINT ('Указанный пол: ' + @sex)
ROLLBACK TRANSACTION
END
END
Запустим триггер с неверными данными:
UPDATE Студент
SET Пол = 'студент'
WHERE НомерСтуденческого = 2301
Рисунок 2. Неверные данные в указании пола.
Запустим триггер с верными данными.
UPDATE Студент
SET Пол = 'мужской'
WHERE НомерСтуденческого = 2301;
Рисунок 3. Верные данные в указании пола.
У нас также существуют ограничения по символам (VARCHAR(7)). Проверим их.
UPDATE Студент
SET Пол = 'менеджер'
WHERE НомерСтуденческого = 2301;
Рисунок 4. Усеченные данные в указании пола.
Данный триггер был подробно разобран с курсорами транзакциями и ограничениями, дальнейшее создание таких триггеров будет подобно этому, поэтому не будут рассматриваться.
Триггер INSTEAD OF
Допустим, студент Гордон плохо учился и попал в списки на отчисление. Обычный пользователь базы данных больше не хочет видеть его в списках студентов и удалил его. Однако у таблицы «Студент» есть много наследуемых данных в других таблицах «Родственник», «Льгота» и т.д., которые могут понадобится, как и сам «Студент».
В этом нам поможет «мягкое удаление», которое устанавливает флаг «удален», без полного уничтожения данных (действует по принципу «Корзины»).
Триггер INSTEAD OF заменит транзакцию и вместо реального удаления выставит флаг.
CREATE TRIGGER Отчисление
ON Студент
INSTEAD OF DELETE
AS
UPDATE Студент
SET IsDeleted = 1
WHERE НомерСтуденческого =(SELECT НомерСтуденческого FROM deleted)
Создадим такой флаг. Для этого добавим колонку «IsDeleted», которая при ненулевом значении будет указывать на удаленную строку.
ALTER TABLE Студент
ADD IsDeleted smallint;
SELECT * FROM Студент
Рисунок 5. Добавление колонки «IsDeleted».
Попробуем удалить студента из списка.
DELETE FROM Студент
WHERE Фамилия='Гордон';
SELECT * FROM Студент
Рисунок 6. Изменение колонки «IsDeleted» посредством удаления.
Итак, в строке студента появилось значение, которое мы выставили как удаленную строку.
Вывод
Получили навыки применения курсоров, использования транзакций, а также работы с триггерами в MS SQL Server.