Міністерство освіти та науки України
Національний університет «Львівська політехніка»
Інститут комп’ютерних наук та інформаційних технологій
Кафедра ПЗ
ЗВІТ
до лабораторної роботи №2
з дисципліни «Бази даних (частина ІІ)»
на тему: «Ознайомлення із мовою Transact-SQL»
Мета: Навчитися використовувати T-SQL, DML та транзакції для зміни даних та управління запитами в SQL Server 2008.
Завдання
1.Створити базу даних з наступною архітектурою таблиць:
- Product (maker, model, type)- PC (code, model, speed, ram, hd, cd, price)- Laptop (code, model, speed, ram, hd, screen, price)- Printer (code, model, color, type, price)
2.Всі новостворені об’єкти бази даних помістити у наперед створену схему бази даних.
3.Внести відповідні дані у таблиці.
4.Використовуючи DML, видалити всі блокноти, що випускаються виробниками, які не випускають принтери.
5.Продемонструвати використання інструкцій для роботи із транзакціями та обробки помилок, використовуючи вірний та хибний запит.
6.Вивести відповідні повідомлення про статус виконання запиту.
Хід роботи
1.Створення бази даних і чотирьох таблиць: Product, PC, Laptop, Printer. Відповідні SQL скрипти:
USE [pzDB]
GO
CREATE TABLE [ComputerFirm].[Product](
[maker] [varchar](10) PRIMARY KEY,
[model] [varchar](50) NOT NULL,
[type] [varchar](50) NOT NULL
)
GO
USE [pzDB]
GO
CREATE TABLE [ComputerFirm].[PC](
[code] [int] PRIMARY KEY,
[model] [varchar](50) NOT NULL,
[speed] [smallint] NOT NULL,
[ram] [smallint] NOT NULL,
[hd] [real] NOT NULL,
[cd] [varchar](10) NOT NULL,
[price] [money] NULL
)
GO
USE [pzDB]
GO
CREATE TABLE [ComputerFirm].[Laptop](
[code] [int] PRIMARY KEY,
[model] [varchar](50) NOT NULL,
[speed] [smallint] NOT NULL,
[ram] [smallint] NOT NULL,
[hd] [real] NOT NULL,
[price] [money] NULL,
[screen] [tinyint] NOT NULL
)
GO
USE [pzDB]
GO
CREATE TABLE [ComputerFirm].[Printer](
[code] [int] PRIMARY KEY,
[model] [varchar](50) NOT NULL,
[color] [char](1) NOT NULL,
[type] [varchar](10) NOT NULL,
[price] [money] NULL
)
GO
Вигляд таблиць та встановлених зв’язків на діаграмі:
2. Створення схеми бази даних:
USE [pzDB]
GO
CREATE SCHEMA [ComputerFirm] AUTHORIZATION [pzUser]
GO
Задання створеної схеми схемою за замовчуванням для даного користувача. Після цього всі новостворені таблиці поміщатимуться в цю схему:
USE [pzDB]
GO
ALTER USER [pzUser] WITH DEFAULT_SCHEMA=[ComputerFirm]
GO
3. Внесення відповідних даних у таблиці:
INSERT INTO [pzDB].[ComputerFirm].[Product]
VALUES('Samsung','1428','PC')
,('Samsung','1429','PC')
,('Samsung','1621','Laptop')
,('HP','3734','Laptop')
,('HP','3992','Printer')
,('SomeFirm','7144','PC')
,('SomeFirm','7321','Laptop')
,('SomeFirm','7979','Printer')
GO
INSERT INTO [pzDB].[ComputerFirm].[PC]
VALUES(40,'1428',1200,512,160,'52x',250)
,(41,'1428',1200,1024,500,'52x',350)
,(84,'7144',1500,2048,320,'52x',500)
GO
INSERT INTO [pzDB].[ComputerFirm].[Laptop]
VALUES(44,'1621',1200,512,160,400,15)
,(72,'3734',800,256,80,250,14)
,(87,'7321',1500,1024,240,NULL,15)
GO
INSERT INTO [pzDB].[ComputerFirm].[Printer]
VALUES(75,'3992','y','Laser',200)
,(88,'7979','n','Jet',140)
,(89,'7979','n','Matrix',120)
GO
4. Інформація про продукти комп’ютерної фірми (таблиця Product):
Блокноти, які пропонує комп’ютерна фірма (таблиця Laptop):
Запит, який видаляє всі блокноти, що випускаються виробниками, які не випускають принтери:
DELETE FROM ComputerFirm.Laptop
WHERE model = (SELECT model FROM ComputerFirm.Product
WHERE maker NOT IN (SELECT maker FROM ComputerFirm.Product
WHERE type = 'Printer')
AND type = 'Laptop')
Блокноти, які залишились після виконання запиту (таблиця Laptop):
5. Вірний запит: транзакція видаляє з таблиці Product рядок, ключ якого вже не використовується іншими таблицями:
USE pzDB
GO
BEGIN TRANSACTION
BEGIN TRY
DELETE FROM ComputerFirm.Product
WHERE model = '1621';
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;
ROLLBACK TRANSACTION;
END CATCH;
GO
Хибний запит: транзакція видаляє з таблиці Product рядок, ключ якого використовується іншою таблицею (Laptop) як зовнішній:
USE pzDB
GO
BEGIN TRANSACTION
BEGIN TRY
DELETE FROM ComputerFirm.Product
WHERE model = '7321';
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;
ROLLBACK TRANSACTION;
END CATCH;
GO
6. У вірному запиті інструкція TRY видаляє відповідний рядок з таблиці Product; транзакція підтверджується:
У хибному запиті інструкція CATCH виводить таблицю з інформацією про неможливість видалення відповідного рядка з таблиці Product; здійснюється відкат транзакції:
Висновок: На цій лабораторній роботі я навчився використовувати Transact-SQL, DML та транзакції для зміни даних та управління запитами в SQL Server 2008; створив власну базу даних, вніс у неї відповідні дані та змінив у ній дані за допомогою DML та транзакцій.