МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА"
Інститут КНІТ
Кафедра ПЗ
ЗВІТ
До лабораторної роботи № 2
На тему: “ Ознайомлення із мовою Transact-SQL ”
З дисципліни : " Бази даних. Частина 2 "
Лектор:
Доцент
Павич Н.Я.
Тема роботи: Ознайомлення із мовою Transact-SQL
Мета роботи: Навчитися використовувати T-SQL, DML та транзакції для зміни даних та управління запитами в SQL Server 2008.
Індивідуальне завдання
Створити базу даних із архітектурою таблиць згідно варіанту.
Всі новостворені об’єкти бази даних помістити у наперід створену схему бази даних.
Внести відповідні дані у таблиці.
Використовуючи DML виконати індивідуальне завдання згідно варіанту для відповідної навчальної бази даних.
Продемонструвати використання інструкцій для роботи із транзакціями та обробки помилок використовуючи вірний та хибний запит.
Вивести відповідні повідомлення про статус виконання запиту.
Варіант 8. Видаліть з таблиці Ships всі кораблі, потоплені в битвах.
Результати виконання завдання
Створюємо схему бази даних:
USE [Ships]
GO
CREATE SCHEMA [ShipSchema] AUTHORIZATION [ShipOwner]
GO
Створюємо структуру бази дних та поміщаємо всі об’єкти у раніше створену схему:
use Ships
go
create table ShipSchema.Classes (
Class varchar(50) not null primary key,
[Type] varchar(2) not null,
Country varchar(20) not null,
NumGuns tinyint,
Bore real,
Displacement int
)
go
create table ShipSchema.Ships (
Name varchar(50) not null primary key,
Class varchar(50) not null,
Lunched smallint
)
go
create table ShipSchema.Battles (
Name varchar(20) not null primary key,
[Date] datetime not null
)
go
create table ShipSchema.Outcomes (
Ship varchar(50) not null,
Battle varchar(20) not null,
Result varchar(10) not null
constraint PK_Outcomes primary key clustered ( Ship, Battle )
)
go
Створюємо зв’язки між таблицями:
В результаті отримаємо наступний вигляд структури бази даних :
Заносимо дані в таблиці:
use Ships
go
insert into ShipSchema.Classes (Class, [Type], Country, NumGuns, Bore, Displacement)
Values ('Aurora', 'bb', 'France', 100, 8, 150),
('Titanic', 'bc', 'USA', 150, 10, 300),
('Flying Golandec', 'bb', 'Netherlands', 100, 12, 200),
('Broken Ship', 'bb', 'China', 70, 7, 68)
go
use Ships
go
insert into ShipSchema.Ships (Name, Class, Lunched)
Values ('AuroraShip1','Aurora', 1950),
('AuroraShip2','Aurora', 1952),
('Aurora3','Aurora', 1963),
('TtitanicShip1','Titanic', 1950),
('TtitanicShip2','Titanic', 1947),
('Ttitanic3','Titanic', 1962),
('Flying_GolShip1','Flying Golandec', 1950),
('Flying_GolShip2','Flying Golandec', 1951),
('Broken_Ship1','Broken Ship', 1950),
('Broken_Ship2','Broken Ship', 1952),
('Broken_Ship3','Broken Ship', 1953),
('Broken_Ship4','Broken Ship', 1953)
go
use Ships
go
insert into ShipSchema.Battles
Values ('Битва в середземному', '02/05/1950'),
('Битва БІЛЯ ПУНКТУ 1', '02/05/1952'),
('Битва біля пунту 2', '02/05/1951'),
('Битва біля Китаю', '02/05/1950')
go
use Ships
go
insert into ShipSchema.Outcomes
Values ('AuroraShip1','Битва в середземному', 'sunk'),
('AuroraShip2','Битва в середземному', 'OK'),
('TtitanicShip1','Битва в середземному', 'damaged'),
('Ttitanic3','Битва БІЛЯ ПУНКТУ 1', 'OK'),
('Broken_Ship1','Битва БІЛЯ ПУНКТУ 1', 'sunk'),
('Flying_GolShip1', 'Битва біля пунту 2', 'OK'),
('Flying_GolShip2', 'Битва біля пунту 2', 'damaged'),
('TtitanicShip2', 'Битва біля пунту 2', 'damaged'),
('Broken_Ship2','Битва біля Китаю', 'damaged'),
('Broken_Ship3','Битва біля Китаю', 'sunk'),
('Broken_Ship4','Битва біля Китаю', 'sunk'),
('Flying_GolShip2','Битва біля Китаю', 'OK')
go
Виконання індивідуально завдання:
Стан до виконання запиту:
Запит:
use Ships
go
delete from ShipSchema.Ships
where
ShipSchema.Ships.Name in
(Select distinct Ship from ShipSchema.Outcomes
Where Result = 'sunk')
go
Стан після виконання запиту:
Робимо запит, який згенерує помилку
USE Ships
GO
BEGIN TRANSACTION; -- Починаємо явну транзакцію
BEGIN TRY
-- Генерується помилка унікальності ключа.
INSERT INTO ShipSchema.Classes
VALUES ('Aurora', 'bb', 'England', 100, 8, 150)
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; -- повний текст повідомлення про помилку
IF @@TRANCOUNT > 0 -- Якщо є запущені транзакції
ROLLBACK TRANSACTION; -- відкат
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION; -- підтвердження
GO
В результаті цього запиту помилку буде перехвачено і виведено інформацію про неї, сам запис в таблицю проведений не буде так як відбудеться відкат транзакції:
Якщо, помилки не робити то запит виконається, транзакція підтвердиться і запис буде внесено в таблицю:
USE Ships
GO
BEGIN TRANSACTION; -- Починаємо явну транзакцію
BEGIN TRY
-- Генерується помилка унікальності ключа.
INSERT INTO ShipSchema.Classes
VALUES ('Aurora', 'bb', 'England', 100, 8, 150)
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; -- повний текст повідомлення про помилку
IF @@TRANCOUNT > 0 -- Якщо є запущені транзакції
ROLLBACK TRANSACTION; -- відкат
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION; -- підтвердження
GO
Висновок
На даній лабораторній роботі я навчився використовувати Transact-SQL, запити мови DML та транзакції для зміни даних. Я ознайомився із методами управління запитами в SQL Server 2008 за допомогою конструкції TRY...CATCH.