Добавил:
Меня зовут Катунин Виктор, на данный момент являюсь абитуриентом в СГЭУ, пытаюсь рассортировать все файлы СГЭУ, преобразовать, улучшить и добавить что-то от себя Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный_практикум_по_АБД_sqlserver.docx
Скачиваний:
6
Добавлен:
03.08.2023
Размер:
496.52 Кб
Скачать

13. Лабораторная работа по теме «Триггеры»

Цель работы: научиться создавать триггеры

  • для поддержания целостности данных,

  • для обеспечения сложных алгоритмов модификации данных.

1. Создание триггера на вставку новой записи

Запустите Query Analyzer и наберите программу, представленную ниже. Программа проверяет, существует ли триггер 'OrdDet_Insert', и удаляет его, а затем создает заново. Триггер создается на добавление новой записи в таблицу Order Details (заказанные товары).

/*

** Создание триггера на добавление записи в таблицу Order Details.

** Когда в таблицу Order Details записываются сведения о новом заказе,

** в таблице Products значение поля UnitsInStock должно уменьшаться на

** количество заказанного товара (Quantity).

*/

USE Northwind

/*

** Если триггер 'OrdDet_Insert' существует, удалим его командой DROP

** TRIGGER…

*/

IF EXISTS ( SELECT name FROM sysobjects

WHERE type = 'TR' AND name = 'OrdDet_Insert' )

DROP TRIGGER OrdDet_Insert

GO

/* Создадим триггер*/

CREATE TRIGGER OrdDet_Insert

ON [Order Details]

FOR INSERT

AS

UPDATE P SET

UnitsInStock = P.UnitsInStock - I.Quantity

FROM Products P INNER JOIN Inserted I

ON P.ProductID = I.ProductID

GO

/*

** Проверим наличие триггера :

** 1. С помощью запроса к таблице sysobjects

*/

SELECT name FROM sysobjects

WHERE type = 'TR'

ORDER BY type, name

GO

/*

**2. С помощью хранимой процедуры sp_helptrigger

*/

sp_helptrigger [Order Details]

Запустите части программы, в которых проверяется наличие триггера и создается триггер. Сохраните этот текст в своем отчете. Опишите, что делает данный триггер.

Запустите по очереди части программы, которые сообщают информацию о созданных триггерах.

Где хранятся сведения о триггерах?

Тестирование созданного триггера

  1. Проверьте наличие запаса продукта (UnitInStock) с кодом (ProductID), равным 22. Запишите значение поля UnitInStock в отчет.

  2. Добавьте строку в таблицу Order Details, которая соответствует заказу продукта с кодом 22 в количестве (Quantity) 50 штук командой

Insert into [Order Details] (OrderID,ProductID,UnitPrice,Quantity,Discount)

Values (11077,22,21.00,50,0.0)

  1. Еще раз выполните запрос п.1. Запишите значение поля UnitInStock в отчет.

Проработал ваш триггер или нет?

Доработайте данный триггер таким образом, чтобы вначале в нем осуществлялась проверка, существует ли в таблице Products заказанный товар в нужном количестве, выдавалось сообщение, если товара нет совсем или его запас меньше требуемого, и операция добавления записи в таблицу Order Details откатывалась. Еще раз протестируйте триггер.

2. Создание триггера на обновление для обновления содержимого колонки

  1. Создайте две новые таблицы NewCategories и NewProducts на основе соответствующих таблиц с помощью команд SELECT * INTO…, например,

Select * into newcategories from categories

При этом в новые таблицы перенесутся данные, но они не будут содержать ограничения типа Primary KEY и Foreign Key.

  1. Создайте триггер на удаление записи из таблицы NewCategories такой, что при отсутствии соответствующей категории в этой таблице, в таблице Newproducts изменялось значение поля Discontinued на 1.

create trigger category_delete on newcategories

for delete

as

update p set discontinued=1 from newproducts as p

inner join deleted as d

on p.categoryid=d.categoryid

  1. С помощью запроса выведите все записи из таблицы Products с кодом категории (CategoryID), равным 7 (показать поля ProductID, CategoryID, Discontinued). Сохраните результаты запроса в отчете.

  2. Удалите из таблицы Categories запись с кодом категории =7.

  3. Выполните еще раз запрос п.3. для тестирования триггера. Сделайте выводы.