Добавил:
rushevamar@mail.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD_Laboratornyi_774_praktikum.doc
Скачиваний:
28
Добавлен:
17.06.2021
Размер:
921.09 Кб
Скачать

Лабораторная работа №4. Создание базы данных и ее объектов с помощью команд языка Transact-sql

Цель работы

  1. Ознакомиться с процессом создания базы данных и ее объектов

  2. Освоить способы управления пользователями и правами доступа к данным.

Задачи

  1. Создание новой базы данных.

  2. Создание правил, умолчаний, пользовательских типов данных.

  3. Создание таблиц базы данных, индексов и представлений.

  4. Ввод данных в таблицы базы данных.

  5. Предоставление доступа к серверу учетным записям Windows.

  6. Создание новых пользователей и пользовательских ролей.

  7. Предоставление привилегий доступа к объектам базы данных.

Методические указания и задания к выполнению

Раздел 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. Создание индекса таблицы. Синтаксис команды (см. [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 с помощью команды меню FileSave 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.