Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
24.01.2026
Размер:
12.22 Mб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра Систем автоматизированного проектирования

отчет

по лабораторной работе №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: он запрещает оформление заказов на товары, снятые с поставок, выдаёт сообщение об ошибке и откатывает транзакцию. Проверка показала, что триггер корректно реагирует на попытку добавить такой товар.

Соседние файлы в папке БД_лабы(11 лаб, 5 семестр)