- •Кафедра экономической информатики
- •Базы данных
- •Содержание
- •Введение
- •Лабораторная работа №1. Логические и физические модели данных
- •Методические указания
- •Задание к работе
- •Раздел I. Создание сущностей в eRwin
- •Раздел II. Создание связей между сущностями, подмножеств модели и хранимых отображений. Переход к физической модели данных
- •Раздел III. Выполнение операции прямого проектирования
- •Раздел IV. Выполнение операции обратного проектирования
- •Лабораторная работа №2. Усложненные диаграммы «сущность-связь»
- •Методические указания
- •Задание к работе
- •Раздел I. Создание сущностей логической модели
- •Раздел II. Создание связей между сущностями и иерархии наследования
- •Раздел III. Выполнение вариантов трансформы категориальной связи
- •Раздел IV. Выполнение методов синхронизации системного каталога базы данных и текущей модели
- •Лабораторная работа №3. Работа в среде субд «ms sql Server 2005»
- •Методические указания
- •Задание к работе
- •Раздел I. Создание базы данных и ее объектов
- •Раздел II. Управление пользователями и правами доступа к данным
- •Лабораторная работа №4. Создание базы данных и ее объектов с помощью команд языка Transact-sql
- •Методические указания и задания к выполнению
- •Раздел I. Создание базы данных и ее объектов
- •Раздел II. Ввод данных в таблицы базы данных
- •Insert into Заказ (КодКлиента, КодТовара, Количество)
- •Inner join Поставщик
- •Inner join Товар
- •Раздел III. Управление пользователями и правами доступа к данным.
- •Раздел IV. Анализ полученных результатов
- •Лабораторная работа №5. Манипулирование данными с помощью команд языка Transact-sql
- •Методические указания
- •Раздел I. Выборка данных из таблиц и представлений.
- •Раздел II. Обновление данных в таблицах и представлениях.
- •Раздел III. Удаление данных из таблиц и представлений.
- •Раздел IV. Изменение структуры таблицы.
- •Раздел V. Удаление таблицы из базы данных.
- •Задание к работе
- •Лабораторная работа №6. Программирование на языке Transact-sql
- •Методические указания
- •Раздел I. Основы программирования на языке Transact-sql.
- •Раздел II. Создание и работа с хранимыми (на сервере) процедурами.
- •If @Страна is not null
- •If @Город is not null
- •If @Город is not null
- •Insert into Валюта
- •Values(@Код, @Имя, @Шаг, @Курс)
- •If @Страна is not null
- •If @Город is not null
- •Into ##Регион
- •Раздел III. Создание и работа с определяемыми пользователем функциями.
- •Insert @rowset (КодРегиона, Страна, Область, Город)
- •Задание к работе
- •Лабораторная работа №7. Курсоры и триггеры в языке Transact-sql
- •Методические указания
- •Раздел I. Использование курсоров в языке Transact-sql
- •If @НачалоИнтервала is null
- •If @КонецИнтервала is null
- •Раздел II. Создание триггеров в языке Transact-sql.
- •If update(ДатаЗаказа)
- •If update(Цена)
- •If update(Цена)
- •Inserted.Цена * Валюта.КурсВалюты
- •Задание к работе
- •Литература Основная
- •Базы данных
- •220013, Минск, п. Бровки, 6.
Лабораторная работа №4. Создание базы данных и ее объектов с помощью команд языка Transact-sql
Цель работы
Ознакомиться с процессом создания базы данных и ее объектов
Освоить способы управления пользователями и правами доступа к данным.
Задачи
Создание новой базы данных.
Создание правил, умолчаний, пользовательских типов данных.
Создание таблиц базы данных, индексов и представлений.
Ввод данных в таблицы базы данных.
Предоставление доступа к серверу учетным записям Windows.
Создание новых пользователей и пользовательских ролей.
Предоставление привилегий доступа к объектам базы данных.
Методические указания и задания к выполнению
Раздел I. Создание базы данных и ее объектов
Предварительно при помощи пользовательского меню Windows запустите утилиту SQL Server Management Studio, после чего на панели Object Explorer в древовидной структуре раскройте папку Databases.
Далее на панели инструментов нажмите кнопку New Query, что вызовет появление на экране окна создания запросов к базе данных. Это окно, называемое окном Query, мы будем использовать для последовательного формирования в нем сценария (скрипта), который далее сохраним в файле на диске. Сценарий представляет из себя последовательность команд языка Transact-SQL, с помощью которых можно будет впоследствии автоматически сгенерировать базу данных со всеми ее объектами, а также наполнить ее таблицы данными и выполнить ряд других действий. С помощью сценария мы будем создавать такую же базу данных, что была создана средствами графического интерфейса утилиты в лабораторной работе 3.
Создание сценария заключается в том, что каждый раз мы будем добавлять в окно Query очередную команду языка Transact-SQL (или группу команд, образующих пакет), проверять ее синтаксис и затем выполнять, нажимая на панели инструментов кнопку Execute (или клавишу F5). При этом необходимо, чтобы данная команда (или пакет) была выделена подсветкой, иначе будут выполнены все без исключения команды, содержащиеся в окне Query. Если очередная команда (или пакет) будет успешно выполнена, то в окно Query можно дописать новую команду (или пакет), выделить подсветкой и далее повторить процесс, описанный выше. В конечном итоге, путем поочередного выполнения команд, будет создана база данных со всеми ее объектами и параллельно в окне Query будет сформирован сценарий, который можно сохранить в файле на диске. Теперь с помощью этого сценария можно на любом компьютере, где установлен MS SQL Server, выполнить процедуру создания базы данных.
Примечание. Готовые к выполнению команды языка Transact-SQL, с помощью которых будет создаваться база данных, и из которых будет формироваться сценарий, выделены ниже при помощи стрелок и .
1. Создание новой базы данных. Синтаксис команды (в нотации Бэкуса-Наура):
CREATE DATABASE database_name [ ON [ < filespec > [ ,...n ] ] [ , < filegroup > [ ,...n ] ] ] [ LOG ON { < filespec > [ ,...n ] } ] [ COLLATE collation_name ] [ FOR LOAD | FOR ATTACH ]
< filespec > ::=
[ PRIMARY ] ( [ NAME = logical_file_name , ] FILENAME = 'os_file_name' [ , SIZE = size ] [ , MAXSIZE = { max_size | UNLIMITED } ] [ , FILEGROWTH = growth_increment ] ) [ ,...n ]
< filegroup > ::=
FILEGROUP filegroup_name < filespec > [ ,...n ]
На русском языке подробное разъяснение синтаксических конструкций этой команды приведено в [1], стр. 892.
Конкретная команда создания базы данных Склад_ХХХ, которую нужно вставить в окно Query, имеет следующий вид:
CREATE DATABASE Склад_ХХХ -- Вместо ХХХ подставьте свою комбинацию цифр
ON PRIMARY -- Путь D:\Work\X7230XXX\ к файлам
( NAME = Склад_data, -- базы данных уже должен существовать
FILENAME = 'D:\Work\X7230XXX\Склад_XXX_data.mdf',
SIZE = 5MB,
MAXSIZE = 75MB,
FILEGROWTH = 3MB ),
FILEGROUP Secondary
( NAME = Склад2_data,
FILENAME = 'D:\Work\X7230XXX\Склад_XXX_data2.ndf',
SIZE = 3MB,
MAXSIZE = 50MB,
FILEGROWTH = 15% ),
( NAME = Склад3_data,
FILENAME = 'D:\Work\X7230XXX\Склад_XXX_data3.ndf',
SIZE = 4MB,
FILEGROWTH = 4MB )
LOG ON
( NAME = Склад_log,
FILENAME = 'D:\Work\X7230XXX\Склад_XXX_log.ldf',
SIZE = 1MB,
MAXSIZE = 10MB,
FILEGROWTH = 20% ),
( NAME = Склад2_log,
FILENAME = 'D:\Work\X7230XXX\Склад_XXX_log2.ldf',
SIZE = 512KB,
MAXSIZE = 15MB,
FILEGROWTH = 10% )
GO
Примечание. Команда GO используется для указания конца пакета (см. [1], стр. 1087). Команды, образующие пакет, обрабатываются сервером за один раз, после чего он возвращает клиенту (в нашем случае – пользователю SQL Server Management Studio) результат. После этого клиент может отправить следующий пакет и т.д. В данном случае пакет содержит всего одну команду, предназначенную для создания базы данных.
2. Подключение к базе данных. Синтаксис команды (см. [1], стр. 1086):
USE { database }
USE Склад_ХХХ
GO
Примечание. При обращении к объектам текущей базы данных (т.е. выбранной с помощью команды USE) не требуется указание ее имени. Но когда работа ведется в контексте иной базы данных, то необходимо указывать также имя базы данных.
3. Создание правила. Синтаксис команды (см. [1], стр. 836):
CREATE RULE rule AS condition_expression
CREATE RULE Logical_rule AS @value IN ('Нет', 'Да')
GO
4. Создание умолчания. Синтаксис команды (см. [1], стр. 828):
CREATE DEFAULT default AS constant_expression
CREATE DEFAULT Logical_default AS 'Нет'
GO
5. Создание пользовательского типа данных. Синтаксис системной хранимой процедуры (см. [1], стр. 840):
sp_addtype [ @typename = ] type, [ @phystype = ] system_data_type [ , [ @nulltype = ] 'null_type' ] [ , [ @owner = ] 'owner_name' ]
EXEC sp_addtype Logical, 'char(3)', 'NOT NULL'
GO
Примечание. Для выполнения (запуска) хранимой процедуры используется команда, имеющая следующий синтаксис:
[ [ EXEC [ UTE ] ] { [ @return_status = ] { procedure_name [ ;number ] | @procedure_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] ] [ ,...n ] [ WITH RECOMPILE ]
6. Связывание правила с пользовательским типом данных. Синтаксис системной хранимой процедуры (см. [1], стр. 837):
sp_bindrule [ @rulename = ] 'rule' , [ @objname = ] 'object_name' [ , [ @futureonly = ] 'futureonly_flag' ]
EXEC sp_bindrule 'Logical_rule', 'Logical'
GO
7. Связывание умолчания с пользовательским типом данных. Синтаксис системной хранимой процедуры (см. [1], стр. 829):
sp_bindefault [ @defname = ] 'default' , [ @objname = ] 'object_name' [ , [ @futureonly = ] 'futureonly_flag' ]
EXEC sp_bindefault 'Logical_default', 'Logical'
GO
Примечание. Последние три пакета можно было бы объединить в один пакет (с единственной командой GO в конце) и выполнить за один раз. Необходимо отметить, что не всякие пакеты можно объединять с другими пакетами в единый пакет. С другой стороны команды, составляющие любой пакет, всегда можно выполнить по отдельности, дополняя каждую из них командой GO.
8. Создание таблицы базы данных. Синтаксис команды (см. [1], стр. 958):
CREATE TABLE [ database_name. [ owner ] . | owner. ] table_name ( { < column_definition > | column_name AS computed_column_expression | < table_constraint > ::= [ CONSTRAINT constraint_name ] }
| [ { PRIMARY KEY | UNIQUE } [ ,...n ] ) [ ON { filegroup | DEFAULT } ] [ TEXTIMAGE_ON { filegroup | DEFAULT } ] < column_definition > ::= { column_name data_type } [ COLLATE < collation_name > ] [ [ DEFAULT constant_expression ] | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ] ] [ ROWGUIDCOL] [ < column_constraint > ] [ ...n ] < column_constraint > ::= [ CONSTRAINT constraint_name ] { [ NULL | NOT NULL ] | [ { PRIMARY KEY | UNIQUE } [ CLUSTERED | NONCLUSTERED ] [ WITH FILLFACTOR = fillfactor ] [ON {filegroup | DEFAULT} ] ] ] | [ [ FOREIGN KEY ] REFERENCES ref_table [ ( ref_column ) ] [ ON DELETE { CASCADE | NO ACTION } ] [ ON UPDATE { CASCADE | NO ACTION } ] [ NOT FOR REPLICATION ] ] | CHECK [ NOT FOR REPLICATION ] ( logical_expression ) }
< table_constraint > ::= [ CONSTRAINT constraint_name ] { [ { PRIMARY KEY | UNIQUE } [ CLUSTERED | NONCLUSTERED ] { ( column [ ASC | DESC ] [ ,...n ] ) } [ WITH FILLFACTOR = fillfactor ] [ ON { filegroup | DEFAULT } ] ] | FOREIGN KEY [ ( column [ ,...n ] ) ] REFERENCES ref_table [ ( ref_column [ ,...n ] ) ] [ ON DELETE { CASCADE | NO ACTION } ] [ ON UPDATE { CASCADE | NO ACTION } ] [ NOT FOR REPLICATION ] | CHECK [ NOT FOR REPLICATION ] ( search_conditions ) }
/* Регион */
CREATE TABLE Регион ( /* первая команда пакета */
КодРегиона INT PRIMARY KEY,
Страна VARCHAR(20) DEFAULT 'Беларусь' NOT NULL,
Область VARCHAR(20) NOT NULL,
Город VARCHAR(20) NOT NULL,
Адрес VARCHAR(50) NOT NULL,
Телефон CHAR(15) NULL,
Факс CHAR(15) NOT NULL CONSTRAINT CIX_Регион2
UNIQUE ON Secondary,
CONSTRAINT CIX_Регион UNIQUE (Страна, Область, Город, Адрес)
ON Secondary )
/* Поставщик */
CREATE TABLE Поставщик ( /* вторая команда пакета */
КодПоставщика INT PRIMARY KEY,
ИмяПоставщика VARCHAR(40) NOT NULL,
УсловияОплаты VARCHAR(30) DEFAULT 'Предоплата' NULL,
КодРегиона INT NULL,
Заметки VARCHAR(MAX) NULL,
CONSTRAINT FK_Поставщик_Регион FOREIGN KEY (КодРегиона)
REFERENCES Регион ON UPDATE CASCADE
)
/* Клиент */
CREATE TABLE Клиент ( /* третья команда пакета */
КодКлиента INT IDENTITY(1,1) PRIMARY KEY,
ИмяКлиента VARCHAR(40) NOT NULL,
ФИОРуководителя VARCHAR(60) NULL,
КодРегиона INT NULL,
CONSTRAINT FK_Клиент_Регион FOREIGN KEY (КодРегиона)
REFERENCES Регион ON UPDATE CASCADE
)
/* Валюта */
CREATE TABLE Валюта ( /* четвертая команда пакета */
КодВалюты CHAR(3) PRIMARY KEY,
ИмяВалюты VARCHAR(30) NOT NULL,
ШагОкругления NUMERIC(10, 4) DEFAULT 0.01 NULL
CHECK (ШагОкругления IN (50, 1, 0.01)),
КурсВалюты SMALLMONEY NOT NULL CHECK (КурсВалюты > 0)
)
/* Товар */
CREATE TABLE Товар ( /* пятая команда пакета */
КодТовара INT PRIMARY KEY,
Наименование VARCHAR(50) NOT NULL,
ЕдиницаИзм CHAR(10) DEFAULT 'штука' NULL,
Цена MONEY NULL CHECK (Цена > 0),
КодВалюты CHAR(3) DEFAULT 'BYR' NULL,
Расфасован LOGICAL NOT NULL,
CONSTRAINT FK_Товар_Валюта FOREIGN KEY (КодВалюты)
REFERENCES Валюта ON UPDATE CASCADE
)
/* Заказ */
CREATE TABLE Заказ ( /* шестая команда пакета */
КодЗаказа INT IDENTITY(1,1) NOT NULL,
КодКлиента INT NOT NULL,
КодТовара INT NOT NULL,
Количество NUMERIC(12, 3) NULL CHECK (Количество > 0),
ДатаЗаказа DATETIME DEFAULT getdate() NULL,
СрокПоставки DATETIME DEFAULT getdate() + 14 NULL,
КодПоставщика INT NULL,
PRIMARY KEY (КодЗаказа, КодКлиента, КодТовара),
CONSTRAINT FK_Заказ_Товар FOREIGN KEY (КодТовара)
REFERENCES Товар ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT FK_Заказ_Клиент FOREIGN KEY (КодКлиента)
REFERENCES Клиент ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT FK_Заказ_Поставщик FOREIGN KEY (КодПоставщика)
REFERENCES Поставщик
)
GO
Создание индекса таблицы. Синтаксис команды (см. [1], стр. 1030):
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) [ WITH < index_option > [ ,...n] ] [ ON filegroup ]
< index_option > :: = { PAD_INDEX | FILLFACTOR = fillfactor | IGNORE_DUP_KEY | DROP_EXISTING | STATISTICS_NORECOMPUTE | SORT_IN_TEMPDB }
CREATE UNIQUE INDEX UIX_Поставщик ON Поставщик (ИмяПоставщика)
ON Secondary
CREATE UNIQUE INDEX UIX_Клиент ON Клиент (ИмяКлиента)
ON Secondary
CREATE UNIQUE INDEX UIX_Валюта ON Валюта (ИмяВалюты)
ON Secondary
CREATE UNIQUE INDEX UIX_Товар ON Товар (Наименование)
ON Secondary
CREATE INDEX IX_Регион ON Регион (Страна, Город) ON Secondary
CREATE INDEX IX_Товар ON Товар (ЕдиницаИзм, Наименование)
ON Secondary
CREATE INDEX IX_Заказ ON Заказ (ДатаЗаказа) ON Secondary
GO
10. Сохраните текущий сценарий в файле D:\Work\X7230ХХХ\script.sql с помощью команды меню File►Save as …
11. Обновите данные на панели Object Explorer. Для этого в ней нужно выделить папку Databases и в ее контекстном меню выбрать команду Refresh (или нажать соответствующую кнопку в верхней части этой панели). В результате база данных Склад_ХХХ станет видимой на панели Object Explorer.
12. Переключитесь на другую базу данных, например Master. Для этого нужно сделать активным окно Query и далее выбрать базу данных Master в выпадающем списке, расположенном на панели инструментов. Другой вариант – набрать в окне Query две команды (USE Master и GO), выделить их и выполнить.
13. Удалите созданную базу данных Склад_ХХХ, поскольку теперь мы ее всегда можем сгенерировать с помощью сценария script.sql. Для этого на панели Object Explorer выберите базу данных Склад_ХХХ и в ее контекстном меню выполните команду Delete.
Примечание. Базу данных невозможно удалить, если предварительно не закрыть существующее соединение или не переключиться на другую базу данных, что и было сделано в предыдущем пункте. Можно, однако, обойтись без выполнения предыдущего пункта и сразу удалить активную базу данных Склад_ХХХ, но в этом случае после появления на экране окна Delete Object нужно в нижней его части установить флажок Close Existing Connections.
14. Закройте утилиту SQL Server Management Studio.