-
Notifications
You must be signed in to change notification settings - Fork 0
Lab1
-
Самостоятельно выбрать предметную область и разработать логический макет реляционной базы данных, состоящей из 4-х таблиц – трех «родительских» и одной «дочерней». Родительские таблицы соответствуют сущностям ER-модели, дочерняя таблица соответствует связи ER-модели и реализует тернарное отношение типа «многие-ко-многим». Прототипом разрабатываемой базы данных может служить учебная база данных «Поставщики, детали и проекты», условно идентифицируемая именем dbSPJ. Для каждой из родительских таблиц определить по одному суррогатному ключу IDENTITY(1,1). Дочерняя таблица должна содержать дополнительные атрибуты, чтобы не превратиться в три внешних ключа.
-
Написать программу (консольное приложение), которая автоматически генерирует относительно правдоподобные тестовые данные для всех четырех таблиц базы данных. Количество записей – не менее 1000 на каждую таблицу.
-
Создать три сценария на Transact-SQL:
- Сценарий создания базы данных и базовых таблиц,
- Сценарий определения ограничений,
- Сценарий массированного копирования данных в базу данных.
- Последовательно выполнить сценарии (запустить сценарии на выполнение) двумя способами:
- С помощью SQL Server Management Studio,
- С командной строки (SQLCMD.exe).
- Построить диаграмму базы данных в среде SQL Server Management Studio.
- При создании сценария (сценариев) создания базы данных, объектов базы данных (таблиц, ограничений, правил и умолчаний) следует руководствоваться следующими инструкциями Transact-SQL.
Создание новой базы данных и файлов, используемых для ее хранения
Инструкция CREATE DATABASE (Transact-SQL)
http://msdn.microsoft.com/ru-ru/library/ms176061(v=sql.105).aspx
Создание новой таблицы в базе данных
Инструкция CREATE TABLE (Transact-SQL)
http://msdn.microsoft.com/ru-ru/library/ms174979(v=sql.105).aspx
Изменение определения таблицы путем изменения, добавления или удаления столбцов и ограничений
Инструкция ALTER TABLE (Transact-SQL)
http://msdn.microsoft.com/ru-ru/library/ms190273(v=sql.105).aspx
Создание объекта, называемого правилом
Инструкция CREATE RULE (Transact-SQL)
http://msdn.microsoft.com/ru-ru/library/ms188064(v=sql.105).aspx
Привязывание правила к столбцу таблицы
Системная хранимая процедура sp_bindrule (Transact-SQL)
http://msdn.microsoft.com/ru-ru/library/ms176063(v=sql.105).aspx
Создание объекта «Значение по умолчанию»
Инструкция CREATE DEFAULT (Transact-SQL)
http://msdn.microsoft.com/ru-ru/library/ms173565(v=sql.105).aspx
Привязывание значения по умолчанию к столбцу таблицы
Системная хранимая процедура sp_bindefault (Transact-SQL)
http://msdn.microsoft.com/ru-ru/library/ms177503(v=sql.105).aspx
Импорт файла данных в таблицу базы данных в формате, указанном пользователем
Инструкция BULK INSERT (Transact-SQL)
http://msdn.microsoft.com/ru-ru/library/ms188365(v=sql.105).aspx
- При создании таблиц базы данных следует руководствоваться следующими типами данных (см. https://msdn.microsoft.com/ru-ru/library/ms187752(v=sql.110).aspx):
- Точные числа: bigint int smallint tinyint bit decimal numeric money smallmoney;
- Приблизительные числа: float real Дата и время: date, datetime2, datetime, datetimeoffset, smalldatetime, time;
- Символьные строки: char varchar text;
- Символьные строки в Юникоде: nchar nvarchar ntext;
- Двоичные данные: binary varbinary image;
- Прочие типы данных: cursor, hierarchyid, sql_variant, table, timestamp, uniqueidentifier, xml.
- В зависимости от параметров хранения, некоторые типы данных в SQL Server относятся к следующим группам:
- типы данных больших значений: varchar(max), nvarchar(max) и varbinary(max);
- типы данных больших объектов: text, ntext, image, varchar(max), nvarchar(max), varbinary(max) и xml.
В состав демонстрационной базы данных dbSPJ входят четыре таблицы:
- Таблица S представляет поставщиков. Каждый поставщик имеет уникальный номер (Sno), уникальное имя (Sname), значение рейтинга или статуса (Status), место расположения (City). Предполагается, что каждый поставщик находится только в одном городе.
- Таблица P представляет детали. У каждой детали есть уникальный номер (Pno), название детали (Pname), цвет (Color), вес (Weight), город, где хранится этот вид деталей (City). Предполагается (где это имеет значение), что вес детали приведен в граммах. Также предполагается, что каждая деталь имеет только один цвет и хранится на складе только в одном городе.
- Таблица J представляет проекты. Каждый проект имеет уникальный номер (Jno), уникальное имя (Jname), место расположения (City).
- Таблица SPJ представляет поставки. Она в известном смысле служит для организации логической связи трех других таблиц. Каждая поставка характеризуется следующими атрибутами: номером поставщика (Sno), номером детали (Pno), номером проекта (Jno) и количеством (Qty). Предполагается, что в одно и то же время может быть не более одной поставки для одного поставщика, одной детали и одного проекта, поэтому для каждой поставки комбинация значений атрибутов Sno, Pno и Jno уникальна с точки зрения набора текущих поставок, представленных в таблице SPJ. Атрибуты Sno, Pno и Jno называются внешними ключами. База данных должна удовлетворять следующему правилу поддержки ссылочной целостности: не должно быть значений внешних ключей, не имеющих соответствия. Проще говоря, правило утверждает, что если B ссылается на A, то A должно существовать.
- Допустимыми номерами поставщиков, деталей и проектов являются целые положительные числа.
- В случае удаления объекта ссылки внешнего ключа операцию удаления ссылочных кортежей запретить.
- Значения статуса поставщика должно целым числом в диапазоне от 0 до 100.
- Допустимыми городами являются:
- Смоленск
- Владимир
- Рязань
- Тверь
- Тула
- Калуга
- Ярославль
- Допустимыми цветами деталей являются:
- Красный
- Зеленый
- Синий
- Вес детали должен быть положительным вещественным числом или нулем.
- Количество деталей в поставке должно быть положительным целым числом или нулем.
- Все красные детали должны весить не менее 50 Г.
- В любой момент в Ярославле может находиться не более одного поставщика.
- Ни одна поставка по количеству деталей не может превышать удвоенное среднее значение количества для всех поставок.
- Поставщик с наибольшим статусом не может находиться в одном городе с поставщиком с наименьшим статусом.
- Должна существовать, по крайней мере, одна красная деталь.
- Среднее значение статуса поставщика должно быть больше 18.
- Каждый поставщик в Смоленске должен поставлять деталь под номером 2.
- Хотя бы одна красная деталь должна весить меньше 50 Г.
- Поставщики в Смоленске должны поставлять больше видов деталей, чем поставщики во Владимире.
- Поставщики в Смоленске должны в сумме поставлять больше деталей, чем поставщики во Владимире.
- Ни одна поставка не может быть сокращена (за одно обновление) более чем вдвое по сравнению с текущим значением.
- Поставщики из Ярославля могут переехать только в Смоленск или Владимир, а поставщики из Смоленска – только во Владимир.
Сценарий № 1: Создание базы данных и базовых таблиц (сохраняем в файле, например, в SQLQuery1.sql)
/****** Начинаем работать в контексте системной базы данных [master] ******/
USE [master]
GO
-- Если база данных [dbSPJ] уже существует, уничтожаем ее
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'dbSPJ')
DROP DATABASE [dbSPJ]
GO
/****** Создаем базу данных [dbSPJ] ******/
CREATE DATABASE [dbSPJ]
GO
/****** Переходим в контекст созданной базы данных [dbSPJ] ******/
USE [dbSPJ]
GO
/****** Создаем таблицу поставщиков [S] ******/
CREATE TABLE [dbo].[S](
[Sno] [int] IDENTITY(1,1) NOT NULL,
[Sname] [varchar](20) NOT NULL,
[Status] [smallint] NULL,
[City] [varchar](15) NULL
)
GO
/****** Создаем таблицу деталей [P] ******/
CREATE TABLE [dbo].[P](
[Pno] [int] IDENTITY(1,1) NOT NULL,
[Pname] [varchar](20) NOT NULL,
[Color] [char](10) NULL,
[Weight] [real] NULL,
[City] [varchar](15) NULL
)
GO
CREATE TABLE [dbo].[J](
[Jno] [int] IDENTITY(1,1) NOT NULL,
[Jname] [varchar](20) NOT NULL,
[City] [varchar](15) NULL
)
GO
CREATE TABLE [dbo].[SPJ](
[Sno] [int] NOT NULL,
[Pno] [int] NOT NULL,
[Jno] [int] NOT NULL,
[Qty] [int] NULL
)
GO
Сценарий № 2: Изменение определений таблиц путем добавления ограничений (сохраняем в файле, например, в SQLQuery2.sql)
/****** Начинаем работать в контексте созданной базы данных [dbSPJ] ******/
USE [dbSPJ]
GO
/****** Изменяем определение таблицы поставщиков [S] путем добавления ограничений первичного ключа и ключа уникальности ******/
ALTER TABLE [dbo].[S] ADD
CONSTRAINT [PK_S] PRIMARY KEY ([Sno]),
CONSTRAINT [UK_S] UNIQUE ([Sname])
GO
/****** Изменяем определение таблицы деталей [P] путем добавления ограничения первичного ключа ******/
ALTER TABLE [dbo].[P] ADD
CONSTRAINT [PK_P] PRIMARY KEY ([Pno])
GO
/****** Изменяем определение таблицы проектов [J] путем добавления ограничений ограничений первичного ключа и ключа уникальности ******/
ALTER TABLE [dbo].[J] ADD
CONSTRAINT [PK_J] PRIMARY KEY ([Jno]),
CONSTRAINT [UK_J] UNIQUE ([Jname])
GO
/****** Изменяем определение таблицы поставок [SPJ] путем добавления ограничений первичного ключа и внешних ключей ******/
ALTER TABLE [dbo].[SPJ] ADD
CONSTRAINT [PK_SP] PRIMARY KEY ( [Sno], [Pno], [Jno] ),
CONSTRAINT [FK_SP_J] FOREIGN KEY([Jno]) REFERENCES [dbo].[J] ([Jno]) ,
CONSTRAINT [FK_SP_P] FOREIGN KEY([Pno]) REFERENCES [dbo].[P] ([Pno]) ,
CONSTRAINT [FK_SP_S] FOREIGN KEY([Sno]) REFERENCES [dbo].[S] ([Sno])
GO
/****** Изменяем определения таблиц [S], [P] и [SPJ] путем добавления ограничений CHECK ******/
ALTER TABLE [dbo].[S] ADD
CONSTRAINT [Status_chk] CHECK ([Status] BETWEEN 0 AND 100)
GO
ALTER TABLE [dbo].[P] ADD
CONSTRAINT [Weight_chk] CHECK ([Weight] >= 0)
GO
ALTER TABLE [dbo].[P] ADD
CONSTRAINT [Color_chk] CHECK (([Color]='Красный' OR [Color]='Зеленый' OR [Color]='Синий'))
GO
ALTER TABLE [dbo].[SPJ] ADD
CONSTRAINT [Qty_chk] CHECK ([Qty] >= 0)
GO
/****** Создаем правило для City и привязываем правило к полям City таблиц [S], [P] и [J] ******/
CREATE RULE [dbo].[City_rule]
AS
@city IN ('Смоленск', 'Владимир', 'Рязань', 'Тверь', 'Тула', 'Калуга', 'Ярославль')
GO
EXEC sp_bindrule 'City_rule', 'dbo.S.City'
EXEC sp_bindrule 'City_rule', 'dbo.P.City'
EXEC sp_bindrule 'City_rule', 'dbo.J.City'
GO
Сценарий № 3: Массированное копирование данных в базу данных (сохраняем в файле, например, в SQLQuery3.sql)
BULK INSERT [dbSPJ].[dbo].[S]
FROM 'F:\dbSPJ\S.txt'
WITH (CODEPAGE = 'ACP', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', ROWTERMINATOR = '\n');
GO
BULK INSERT [dbSPJ].[dbo].[P]
FROM 'F:\dbSPJ\P.txt'
WITH (CODEPAGE = 'ACP', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', ROWTERMINATOR = '\n');
GO
BULK INSERT [dbSPJ].[dbo].[J]
FROM 'F:\dbSPJ\J.txt'
WITH (CODEPAGE = 'ACP', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', ROWTERMINATOR = '\n');
GO
BULK INSERT [dbSPJ].[dbo].[SPJ]
FROM 'F:\dbSPJ\SPJ.txt'
WITH (CODEPAGE = 'ACP', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', ROWTERMINATOR = '\n');
GO