БД_лабы(11 лаб, 5 семестр) / БД_ЛР11
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра Систем автоматизированного проектирования
отчет
по лабораторной работе №11
по дисциплине «Базы Данных»
Тема: СОЗДАНИЕ ТРИГГЕРОВ
Студенты гр. 3352 |
________________ |
Гареева К.Р. |
|
________________ |
Жигунова О.М. |
Преподаватель |
________________ |
Горяинов С.В. |
Санкт-Петербург
2025
Цель работы
Научится создавать триггеры.
Ход работы
Упражнение 1 - создание новой таблицы.
Запрос 1
Описание: Создадим таблицу HumanResources.JobCandidateHistory, содержащая сведения о кандидатах: идентификатор, резюме, рейтинг, дата отклонения и ссылка на контакт (рис. 1). В таблице применены ограничения:
UNIQUE — уникальность идентификатора кандидата; DEFAULT — значение рейтинга по умолчанию (5); FOREIGN KEY — связь с таблицей Person.Contact; CHECK — контроль диапазона допустимых значений рейтинга.
USE [AdventureWorks];
GO
CREATE TABLE [HumanResources].[JobCandidateHistory] (
[JobCandidateID] INT NOT NULL UNIQUE,
[Resume] XML NULL,
[Rating] INT NOT NULL
CONSTRAINT [DF_JobCandidateHistory_Rating] DEFAULT (5),
[RejectedDate] DATETIME NOT NULL,
[ContactID] INT NULL,
CONSTRAINT [FK_JobCandidateHistory_Contact_ContactID]
FOREIGN KEY ([ContactID]) REFERENCES [Person].[Contact]([ContactID]),
CONSTRAINT [CK_JobCandidateHistory_Rating]
CHECK ([Rating] >= 0 AND [Rating] <= 10)
) ON [PRIMARY];
GO
Рисунок 1 - Результат выполнения запроса 1
Упражнение 2 - создание триггера для таблицы JobCandidate схемы Human Resources.
Запрос 2
Создадим триггер dJobCandidate в схеме HumanResources. Он будет автоматически записывать удалённые данные кандидатов в таблицу JobCandidateHistory (рис. 2):
CREATE TRIGGER [HumanResources].[dJobCandidate]
ON [HumanResources].[JobCandidate]
AFTER DELETE
AS
BEGIN
INSERT INTO [HumanResources].[JobCandidateHistory]
(JobCandidateID, Resume, RejectedDate, ContactID)
SELECT
d.JobCandidateID,
d.Resume,
GETDATE(),
NULL
FROM deleted AS d;
END;
GO
Рисунок 2 - Результат выполнения запроса 2
Упражнение 3 - проверка работы триггера.
Запрос 3
Проверим, что созданный триггер dJobCandidate действительно срабатывает при удалении кандидата из таблицы HumanResources.JobCandidate — и автоматически копирует его данные в таблицу HumanResources.JobCandidateHistory.
DELETE FROM [HumanResources].[JobCandidate]
WHERE JobCandidateID = (
SELECT MIN(JobCandidateID)
FROM [HumanResources].[JobCandidate]
);
Рисунок 3 - Результат выполнения запроса 3
Запрос 4
Проверим работу триггера (рис. 4) с помощью строк:
SELECT *
FROM [HumanResources].[JobCandidateHistory];
Рисунок 4 - Проверка работы триггера.
Запрос 5
Очистим историю (рис. 5) с помощью:
TRUNCATE TABLE [HumanResources].[JobCandidateHistory];
Рисунок 5 - Очистка таблицы истории.
Упражнение 4 - создание триггера на обновление и вставку.
Запрос 6
Создадим триггер, который будет срабатывать при добавлении или изменении строк.
CREATE TRIGGER [Sales].[OrderDetailNotDiscontinued]
ON [Sales].[SalesOrderDetail]
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS (
SELECT 1
FROM inserted AS i
INNER JOIN Production.Product AS p
ON i.ProductID = p.ProductID
WHERE p.DiscontinuedDate IS NOT NULL
)
BEGIN
RAISERROR('Невозможно оформить заказ: товар снят с поставок.', 16, 1);
ROLLBACK TRANSACTION;
RETURN;
END
END;
GO
Рисунок 6 - Результат выполнения запроса 6.
Запрос 7
Проверяем, есть ли снятые с поставок товары (рис. 7).
SELECT ProductID, Name
FROM Production.Product
WHERE DiscontinuedDate IS NOT NULL;
Рисунок 7 - Результат выполнения запроса 7.
Запрос 8
Добавим вручную товар, чтобы проверить работу триггера (рис. 8).
UPDATE Production.Product
SET DiscontinuedDate = GETDATE()
WHERE ProductID = 680;
Рисунок 8 - Ввод изменений в таблицу.
Запрос 9
При попытке добавить заказ выводится сообщение об ошибке и выполняется откат транзакции (рис. 9).
INSERT INTO Sales.SalesOrderDetail
(SalesOrderID, OrderQty, ProductID, SpecialOfferID, UnitPrice, UnitPriceDiscount)
VALUES
(43660, 5, 680, 1, 1431, 0);
Рисунок 9 - Сообщение об ошибке.
Вывод
В ходе лабораторной работы была изучена и реализована технология создания триггеров в базе данных AdventureWorks. В процессе работы создана новая таблица HumanResources.JobCandidateHistory, предназначенная для хранения архивных данных о кандидатах, с применением ограничений уникальности, значений по умолчанию, внешних ключей и проверки диапазона. Далее разработан триггер dJobCandidate, который автоматически сохраняет сведения об удалённых записях из таблицы JobCandidate в таблицу JobCandidateHistory с фиксацией текущей даты удаления. Проведена проверка его работы — при удалении кандидата данные успешно копируются в историю. Триггер OrderDetailNotDiscontinued, контролирует корректность добавления и изменения записей в таблице Sales.SalesOrderDetail: он запрещает оформление заказов на товары, снятые с поставок, выдаёт сообщение об ошибке и откатывает транзакцию. Проверка показала, что триггер корректно реагирует на попытку добавить такой товар.
