Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторна робота №13 БД

.docx
Скачиваний:
17
Добавлен:
05.03.2016
Размер:
36.62 Кб
Скачать

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ УКРАЇНИ

ТЕРНОПІЛЬСЬКИЙ ТЕХНІЧНИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ

Факультет комп’ютерно – інформаційних систем та програмної інженерії

Кафедра програмної інженерії

Лабораторна робота № 13

Тригери

Виконав

студент групи СПс-31

Підгайний Олександр

Тернопіль – 2013

Мета роботи: Набути навичок по використанню різноманітних тригерів подій при роботі з СУБД

Завдання: Cтворити тригер контролю обмежень цілісності, виконати скрипти, підготовлені для перевірки тригера і зберегти протокол їх виконання. Вивести вміст таблиць, що показує дію тригерів.

Хід роботи

Проаналізувавши роботу своєї бази даних, було зроблени висновок, що необхідна деяка автоматизація. А саме, при добавленні, оновленні, або видалені товару із замовлення, була постійна необхідність вручну змінювати значення поля кінцевою вартості замовлення вручну. Для того щоб автоматизувати цей процес було вирішено написати для кожного типу товару, по 3 тригери:

  • FOR INSERT – даний тригер спрацьовував би при добавленні товару до замовлення і автоматично сумував би значення вартості товару з вартістю замовлення;

  • FOR UPDATE – даний тригер спрацьовував би при оновленні даних про товару і відповідно мінусував би старе значення вартості і сумував би нове значення;

  • FOR DELETE – даний тригер спрацьовував би при видаленні товару і відповідно мінусував значення вартості товару від значення замовлення;

Для того щоб створити новий тригер у Management Studio 2012 необхідно обрати потрібну таблицю, натиснути на папку Triggers і обрати пункт New Trigger… По замовчуванню це СУБД створює запит з насутпним кодом:

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author: <Author,,Name>

-- Create date: <Create Date,,>

-- Description: <Description,,>

-- =============================================

CREATE TRIGGER <Schema_Name, sysname, Schema_Name>.<Trigger_Name, sysname, Trigger_Name>

ON <Schema_Name, sysname, Schema_Name>.<Table_Name, sysname, Table_Name>

AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE>

AS

BEGIN

-- SET NOCOUNT ON added to prevent extra result sets from

-- interfering with SELECT statements.

SET NOCOUNT ON;

-- Insert statements for trigger here

END

GO

В кінцевому результаті вийшло 3 наступних тригери:

Лістинг коду тригера [TRIGGER_MAGNETS_INSERT]:

USE [MDF]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

ALTER TRIGGER [dbo].[TRIGGER_MAGNETS_INSERT]

ON [dbo].[Magnets]

FOR INSERT

AS

BEGIN

DECLARE @ID INT;

DECLARE @VALUE INT;

select @ID = inserted.ID_Order from inserted

select @VALUE = inserted.Full_price from inserted

update [dbo].[Order] set Profit = Profit + @VALUE where ID_Order = @ID

END

Лістинг коду тригера [TRIGGER_MAGNETS_UPDATE]:

USE [MDF]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

ALTER TRIGGER [dbo].[TRIGGER_MAGNETS_UPDATE]

ON [dbo].[Magnets]

FOR UPDATE

AS

BEGIN

DECLARE @ID INT;

DECLARE @VALUE INT;

select @ID = deleted.ID_Order from deleted

select @VALUE = deleted.Full_price from deleted

update [dbo].[Order] set Profit = Profit - @VALUE where ID_Order = @ID

select @VALUE = inserted.Full_price from inserted

update [dbo].[Order] set Profit = Profit + @VALUE where ID_Order = @ID

END

Лістинг коду тригера [TRIGGER_MAGNETS_DELETE]:

USE [MDF]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

ALTER TRIGGER [dbo].[TRIGGER_MAGNET_DELETE]

ON [dbo].[Magnets]

FOR DELETE

AS

BEGIN

DECLARE @ID INT;

DECLARE @VALUE INT;

select @ID = deleted.ID_Order from deleted

select @VALUE = deleted.Full_price from deleted

update [dbo].[Order] set Profit = Profit - @VALUE where ID_Order = @ID

END

Відповідні тригери з таким самим кодом були створенні для інших 5 таблиць із товарами, єдина різниця між ними в назві тригера(оскільки СУБД неможе містити тригери з одинаковими назвами) та в назві таблиці. Оскільк код фактично одинаковий, тесутвання будемо проводити лише з однією таблицею – [dbo].[Magnets].

Тестування даних тригерів будемо проводити за насутпним планом:

  • Обераємо будь яке замовлення і фіксуємо в ньому значення поля Profit;

  • Додаємо новий запис в таблиці зі значенням деякого замовлення;

  • Оновлюємо таблицю [dbo].[Orders], перевіряємо результат;

  • Редагуваємо той же запис в таблиці;

  • Оновлюємо таблицю [dbo].[Orders], перевіряємо результат;

  • Видаляємо той же запис;

  • Оновлюємо таблицю [dbo].[Orders], перевіряємо результат;

Обираємо замовлення під номером 22, в якому значення поля Profit рівне 0 (рис. 1).

Додамо запис в таблицю [dbo].[Magnets] з наступними значеннями полів (рис. 1):

Рисунок 1 – Новий запис в таблиці [dbo].[Magnets]

Після добавлення цього запису значення поля Profit в таблиці з відповідним замовленням збільшився на 1000 як і планувалось. Тепер змінимо в тому самому записі значення поля Full_price на 2000. Значення поля в таблиці з відповідним замовленням стало 2000 (рис. 2).

Рисунок 2 – Значення запису

Останній тест який необхідний це видалення. Видаливши останній запис, значення поля профіт повернулось на 0. Таблиця проведення тестування тригерів зображена в табиці 1.

Таблиця 1- Тесутвання тригерів

Назва тригера

Початкове значення

Очікуване значення

Отримане значення

Статус

TRIGGER_MAGNETS_INSERT

0

1000

1000

Успішно

TRIGGER_MAGNETS_UPDATE

1000

2000

2000

Успішно

TRIGGER_MAGNETS_DELETE

2000

0

0

Успішно

Тестування пройшло успішно.

Висновок: Результатом виконання даної лабораторної роботи є 3 протестованих робочих тригери. Під час виконання даної лабораторної роботи було проаналізовано саму сутність тригерів та важливість їх використання, оскліьки в деяких випадках вони можуть сильно спростити і полегшити процес розробки. Також було вивчино синтаксис та прицнипи написання тригерів для різних подій: INSERT, UPDATE, DELETE.