Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
moya_zapiska.doc
Скачиваний:
7
Добавлен:
14.08.2019
Размер:
1.67 Mб
Скачать

2.3 Верификация спроектированной логической модели

Результаты верификации спроектированной логической модели представлен в Приложении А.

3 Реализация системы

3.1 T-SQL-определения регламентированных представлений

Физически представление реализовано в виде SQL-запроса, на основе которого производится выборка данных из одной или нескольких таблиц или представлений. Ниже приведен исходный текст представлений, использующихся в данной базе данных.

Вывод ограниченной информации о клиентах, фамилия которых оканчивается на «ова».

CREATE VIEW infoklient /*Указываем имя представления*/

AS

SELECT /*Указываем, какие поля будут выведены*/

Marina.Клиенты.Имя, Marina.Клиенты.Фамилия, Marina.Клиенты.телефон

FROM Marina.Клиенты /*Из какой таблицы*/

WHERE Marina.Клиенты.Фамилия LIKE '%ова'

Вывод ограниченной информации о сотрудниках, фамилия которых оканчивается на «ов».

CREATE VIEW infosotr /*Указываем имя представления*/

AS

SELECT /*Указываем, какие поля будут выведены*/

Marina.Персонал.Имя,Marina.Персонал.Фамилия, Marina.Персонал.должность

FROM Marina.Персонал /*Из какой таблицы*/

WHERE Marina.Персонал.Фамилия LIKE '%ов'

Вывод ограниченной информации о сотрудниках, отчество которых оканчивается на «а».

CREATE VIEW infosA /*Указываем имя представления*/

AS

SELECT /*Указываем, какие поля будут выведены*/

Marina.Персонал.Имя,Marina.Персонал.Фамилия,

Marina.Персонал.Отчество, Marina.Персонал.должность

FROM Marina.Персонал /*Из какой таблицы*/

WHERE Marina.Персонал.Отчество LIKE '%а'

Вывод ограниченной информации о клиентах, отчество которых оканчивается на «о».

CREATE VIEW infokl /*Указываем имя представления*/

AS

SELECT /*Указываем, какие поля будут выведены*/

Marina.Клиенты.Имя,Marina.Клиенты.Фамилия,Marina.Клиенты.Отчество, Marina.Клиенты.телефон

FROM Marina.Клиенты /*Из какой таблицы*/

WHERE Marina.Клиенты.Отчество LIKE '%о'

Вывод ограниченной информации о клиентах, имена которых оканчиваются на «а».

CREATE VIEW infoimyakl /*Указываем имя представления*/

AS

SELECT /*Указываем, какие поля будут выведены*/

Marina.Клиенты.Имя,Marina.Клиенты.Фамилия,Marina.Клиенты.Отчество, Marina.Клиенты.телефон

FROM Marina.Клиенты /*Из какой таблицы*/

WHERE Marina.Клиенты.Имя LIKE '%а'

Вывод ограниченной информации о сотрудниках, имена которых оканчиваются на «я».

CREATE VIEW infosotrimya /*Указываем имя представления*/

AS

SELECT /*Указываем, какие поля будут выведены*/

Marina.Персонал.Имя,Marina.Персонал.Фамилия,

Marina.Персонал.должность

FROM Marina.Персонал /*Из какой таблицы*/

WHERE Marina.Персонал.Имя LIKE '%я'

Вывод информации об отделах, номера которых находятся между 1-3

CREATE VIEW Otdeli /*Указываем имя представления*/

AS

SELECT /*Указываем какие поля будут выбраны*/

Marina.Отделы.Номер_отдела,Marina.Отделы.название_отдела, Marina.Персонал.Фамилия,

Marina.Персонал.Имя,Marina.Персонал.Отчество

FROM /*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

Marina.Отделы INNER JOIN Marina.Персонал ON Marina.Отделы.Номер_отдела = Marina.Персонал.Номер_отдела

WHERE Marina.Отделы.номер_отдела BETWEEN 1 AND 3 /*Выбираются отделы, номер которых находится между 10 и 13*/

Вывод информации о записи клиентов, номера которых равны от 1 до 10

CREATE VIEW zapis

AS

SELECT /*Указываем какие поля будут выбраны*/

Marina.Клиенты.Имя,Marina.Клиенты.Фамилия, Marina.Клиенты.Отчество,

Marina.запись.номер_клиента,Marina.запись.Число_записи

FROM /*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

Marina.Клиенты INNER JOIN Marina.запись ON Marina.Клиенты.номер_клиента = Marina.Клиенты.номер_клиента

WHERE Marina.Клиенты.номер_клиента BETWEEN 1 AND 10 /*Выбираются клиенты, номер которых находится между 1 и 10*/

Вывод информации о персонале, номера которых равны от 10 до 20

CREATE VIEW pers

AS

SELECT /*Указываем какие поля будут выбраны*/

Marina.запись.Табельный_номер,Marina.запись.Число_записи, Marina.Персонал.Фамилия,

Marina.Персонал.Имя,Marina.Персонал.Отчество

FROM /*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

Marina.запись INNER JOIN Marina.Персонал ON Marina.запись.Табельный_номер = Marina.Персонал.Табельный_номер

WHERE Marina.Персонал.Табельный_номер BETWEEN 10 AND 20 /*Выбираются сотрудники, номера которых находится между 10 и 20*/

Вывод информации о персонале, с номерами от 1 до 20, которые заказывали оборудование.

CREATE VIEW personal

AS

SELECT /*Указываем какие поля будут выбраны*/

Оборудование_и_аксессуары.Табельный_номер, Оборудование_и_аксессуары.наименование_аксессуара,Персонал.Фамилия,

Персонал.Имя,Персонал.Отчество

FROM /*Указываем таблицу, и связанные с ней таблицы, из которых выбираются связанные данные.*/

Оборудование_и_аксессуары INNER JOIN Персонал ON Оборудование_и_аксессуары.Табельный_номер = Персонал.Табельный_номер

WHERE Персонал.Табельный_номер BETWEEN 1 AND 20 /*Выбираются сотрудники, номера которых находится между 1 и 20*/

Вывод ограниченной информации о клиентах, фамилия которых начинается на «К».

CREATE VIEW infoklientFIO /*Указываем имя представления*/

AS

SELECT /*Указываем, какие поля будут выведены*/

Marina.Клиенты.Имя, Marina.Клиенты.Фамилия, Marina.Клиенты.телефон

FROM Marina.Клиенты /*Из какой таблицы*/

WHERE Marina.Клиенты.Фамилия LIKE 'К%'

Вывод ограниченной информации о сотрудниках, фамилия которых начинается на «Р».

CREATE VIEW infosotrFIO /*Указываем имя представления*/

AS

SELECT /*Указываем, какие поля будут выведены*/

Marina.Персонал.Имя,Marina.Персонал.Фамилия, Marina.Персонал.должность

FROM Marina.Персонал /*Из какой таблицы*/

WHERE Marina.Персонал.Фамилия LIKE 'Р%'

Вывод информации о клиенте, номер которого = 8.

CREATE VIEW infoklientNOMER /*Указываем имя представления*/

AS

SELECT /*Указываем, какие поля будут выведены*/

Marina.Клиенты.Имя, Marina.Клиенты.Фамилия, Marina.Клиенты.телефон

FROM Marina.Клиенты /*Из какой таблицы*/

WHERE Marina.Клиенты.номер_клиента LIKE '8%'

Вывод информации о сотруднике, номер которого = 11.

CREATE VIEW infosotrNomer /*Указываем имя представления*/

AS

SELECT /*Указываем, какие поля будут выведены*/

Marina.Персонал.Имя,Marina.Персонал.Фамилия,

Marina.Персонал.должность

FROM Marina.Персонал /*Из какой таблицы*/

WHERE Marina.Персонал.Табельный_номер LIKE '11%'

3.2 T-SQL-определения триггеров

Существует три типа триггеров в зависимости от команд, на которые они реагируют: триггеры на вставку, триггеры на обновление и триггеры на удаление.

Триггер на удаление записей из таблицы «Клиенты», который запрещает удаление, если пользователь не владелец базы данных:

CREATE TRIGGER udalenie_klienta /*Обьявляем имя триггера*/

ON Клиенты /*Указываем имя таблицы, с которой будет связан триггер*/

FOR DELETE /*Указываем операцию, на кот. будет срабатывать триггер (здесь на удаление)*/

AS

IF ( SELECT count(*) /*проверяет*/

from Клиенты /*записи из таблицы «Клиенты»*/

where Клиенты.номер_клиента is not null)>0 /*условие проверяет наличие записи в поле «номер клиента».

AND (CURRENT_USER <> 'dbo') /*вызывается функция определения имени текущего пользователя и проверяется, владелец ли он*/

BEGIN

PRINT 'у вас нет прав на удаление этой записи' /*выдача сообщения о неудаче операции*/

ROLLBACK TRANSACTION /*откат (отмена) транзакции*/

END

Триггер на добавление в таблицу «Клиенты», который записывает данные:

CREATE TRIGGER dobavlenie_klienta

ON Клиенты

FOR INSERT

AS

DECLARE @@f int /*Объявляем переменную*/

Set @@f=01 /*Присваиваем ей значение*/

IF NOT EXISTS (SELECT * FROM Клиетны, inserted

WHERE Клиенты.номер_клиента = inserted.номер_клиента)

Set @@f=0

IF EXISTS (SELECT * FROM Клиенты, inserted

WHERE inserted.номер_клиента>33 OR inserted.Номер_клиента<01) /*Если номер отдела не >14 или <10, то такой отдел не существует*/

Set @@f=0 /*Меняем значение переменной*/

If @@f=0 /*если f=0, значит были ошибки*/

BEGIN

PRINT 'Неверно введены данные'

ROLLBACK TRANSACTION /*откат (отмена) транзакции*/

END

Триггер на обновление таблицы «Клиенты»:

CREATE TABLE UpdatedKlients

(

[номер_клиента] [int] NOT NULL ,

[Фамилия] [varchar] (25) NULL ,

[Имя] [varchar] (25) NULL ,

[Отчество] [varchar] (25) NULL ,

[телефон] [int] NULL ,

[Имя_пользователя] [varchar] (50) NULL ,

[Дата_добавления] [datetime] NULL

) ON [PRIMARY]

CREATE TRIGGER infoUpdateKlient

ON Клиенты /*Связываем с таблицей*/

FOR UPDATE

AS

INSERT INTO infoUpdateKlient (номер_клиента, /*указываем, какие поля нужно вставить*/

Фамилия,Имя,Отчество,телефон,Имя_пользователя,Дата_добавления)

SELECT номер_клиента,Фамилия,Имя,Отчество,телефон, /*указываем откуда*/

SYSTEM_USER, /*функция определяет текущего пользователя*/

getdate()/*функция возвращает текущую дату*/

FROM updated/*updated – временная таблица, куда заносятся данные*/

Триггер на удаление записей из таблицы «Персонал»:

CREATE TRIGGER udalenie_personala/*Обьявляем имя триггера*/

ON Персонал /*Указываем имя таблицы, с которой будет связан триггер*/

FOR DELETE /*Указываем операцию, на кот. будет срабатывать триггер (здесь на удаление)*/

AS

IF exists( select*from персонал where

CURRENT_USER <> 'Marina') /*вызывается функция определения имени текущего пользователя и проверяется, владелец ли он*/

BEGIN

PRINT 'у вас нет прав на удаление этой записи' /*выдача сообщения о неудаче операции*/

ROLLBACK TRANSACTION /*откат (отмена) транзакции*/

END

Триггер на добавление записей в таблицу «Персонал»:

CREATE TRIGGER dobavlenie_personala

ON Персонал

FOR INSERT

AS

DECLARE @@f int /*Объявляем переменную*/

Set @@f=10 /*Присваиваем ей значение*/

IF NOT EXISTS (SELECT * FROM Персонал, inserted

WHERE Персонал.Табельный_номер = inserted.Табельный_номер)

Set @@f=0

IF EXISTS (SELECT * FROM Персонал, inserted

WHERE inserted.Табельный_номер>30 OR inserted.Табельный_номер<10) /*условие вставки*/

Set @@f=0 /*Меняем значение переменной*/

If @@f=0 /*если f=0, значит были ошибки*/

BEGIN

PRINT 'Неверно введены данные'

ROLLBACK TRANSACTION /*откат (отмена) транзакции*/

END

Триггер на удаление записей из таблицы «Отделы»:

CREATE TABLE UpdatedOtdeli

(

[Номер_отдела] [int] NOT NULL ,

[Фамилия_начальника] [varchar] (25) NULL ,

[Название_отдела] [varchar] (25) NULL ,

[Имя_пользователя] [varchar] (50) NULL ,

[Дата_добавления] [datetime] NULL

) ON [PRIMARY]

CREATE TRIGGER infoUpdateOtdel

ON Отделы/*Связываем с таблицей*/

FOR UPDATE

AS

INSERT INTO UpdatedOtdeli (Номер_отдела, /*указываем, какие поля нужно вставить*/

Название_отдела, Фамилия_начальника, Имя_пользователя,

Дата_добавления)

SELECT Номер_отдела, Название_отдела,Фамилия_начальника, /*указываем откуда*/

SYSTEM_USER, /*функция определяет текущего пользователя*/

getdate()

FROM deleted /*updated – временная таблица, куда заносятся данные*/

3.3 T-SQL-определения хранимых процедур

Процедура выводящая количество должностей сотрудников.

CREATE PROCEDURE KolDolgn /*название прцедуры*/

AS SELECT COUNT (DISTINCT Персонал.должность) /*поля которые будут выведены в результате*/

FROM Персонал /*таблица из которой выбирается запись*/

Процедура выводящая фамилию, имя клиента с номером=27.

Create procedure vybor /*название прцедуры*/

as select Клиенты.Фамилия, Клиенты.имя /*поля которые будут выведены в результате*/

From Клиенты /*таблица из которой выбирается запись*/

Where Клиенты.номер_клиента=27 /*условие отбора*/

Процедура добавляет запись в таблицу Клиенты.

CREATE PROCEDURE NewKlient

@Nomer int,

@F varchar(20),

@I varchar(20),

@O varchar(20), /*Объявляем необходимые переменные*/

@Tel int

AS /*Проверяем, есть ли запись в таблице «Заказы» с такими же значениями ключевых полей, как у новой записи*/

IF EXISTS (SELECT * FROM Клиенты WHERE номер_клиента=@Nomer)

RETURN 0 /*Если есть, завершаем выполнение процедуры*/

INSERT INTO Клиенты /*Указываем таблицу, куда вставляем запись*/

VALUES ( @Nomer,@F,@I,@O,@Tel) /*Указываем какие значения*/

Процедура осуществляет запись в таблицу Персонал.

CREATE PROCEDURE NewPersonal

@TABNomer int,

@F varchar(20),

@I varchar(20),

@O varchar(20),

@D varchar(20), /*Объявляем необходимые переменные*/

@nomOT int

AS

IF EXISTS (SELECT * FROM Персонал WHERE Табельный_номер=@TABNomer)

RETURN 0 /*Если есть, завершаем выполнение процедуры*/

INSERT INTO Персонал /*Указываем таблицу, куда вставляем запись*/

VALUES ( @TABNomer,@F,@I,@O,@D,@nomOT) /*Указываем какие значения*/

Процедура удаляющая запись из таблицы Клиенты.

CREATE PROCEDURE Udalenieklienta

@nom int /*Объявляем необходимые переменные*/

AS /*Проверяем, если ссылающиеся записи, если записей нет, разрешается удаление.*/

IF not EXISTS (SELECT * FROM запись WHERE номер_клиента=@nom)

DELETE /*Оператор удаления*/

FROM Клиенты /*Имя таблицы, откуда нужно удалить*/

WHERE /*Условие удаления – удаляем строку, для которой значение поля Читательский_номер совпадает с нужным*/

номер_клиента=@nom

Процедура удаляющая запись из таблицы Персонал.

CREATE PROCEDURE UdaleniePersonala

@nom int /*Объявляем необходимые переменные*/

AS /*Проверяем, если ссылающиеся записи, если записей нет, разрешается удаление.*/

IF EXISTS (SELECT * FROM услуги WHERE Табельный_номер<>@nom)

DELETE /*Оператор удаления*/

FROM Персонал /*Имя таблицы, откуда нужно удалить*/

WHERE /*Условие удаления – удаляем строку, для которой значение поля Читательский_номер совпадает с нужным*/

Табельный_номер=@nom

Процедура добавляющая данные об отделах.

CREATE PROCEDURE NewOtdel

@Nomer int,

@Naz varchar(20),

@FIO varchar(20) /*Объявляем необходимые переменные*/

AS

IF EXISTS (SELECT * FROM отделы WHERE Номер_отдела=@Nomer)

RETURN 0 /*Если есть, завершаем выполнение процедуры*/

INSERT INTO отделы /*Указываем таблицу, куда вставляем запись*/

VALUES ( @Nomer,@Naz,@FIO) /*Указываем какие значения*/

Процедура, удаляющая данные из таблицы отделы.

CREATE PROCEDURE UdalenieOtdela

@nom int /*Объявляем необходимые переменные*/

AS /*Проверяем, если ссылающиеся записи, если записей нет, разрешается удаление.*/

IF not EXISTS (SELECT * FROM Персонал WHERE Номер_отдела=@nom)

DELETE /*Оператор удаления*/

FROM Отделы /*Имя таблицы, откуда нужно удалить*/

WHERE /*Условие удаления – удаляем строку, для которой значение поля Читательский_номер совпадает с нужным*/

Номер_отдела=@nom

Процедура редактирования данных о клиенте.

CREATE PROCEDURE RedaktirowanieKlienta

@Nomer int, /*Объявляем необходимые переменные*/

@Tel varchar(20)

AS

IF EXISTS (SELECT * FROM Клиенты /*Проверяем, существуют ли студенты,*/

WHERE номер_клиента = @Nomer) /*читательский номер которых равен искомому*/

UPDATE Клиенты /*Если такие есть обновляем «Студенты»*/

SET Телефон = @Tel

WHERE номер_клиента = @Nomer /*если читательский номер записи равен искомому*/

Процедура редактирования данных об отделах.

CREATE PROCEDURE RedaktirowanieOtela

@Nomer int,

@Naz varchar (20) /*Объявляем необходимые переменные*/

AS

IF EXISTS (SELECT * FROM отделы /*Проверяем, существуют ли студенты*/

WHERE Номер_отдела = @Nomer) /*читательский номер которых равен искомому*/

UPDATE отделы /*Если такие есть обновляем «Студенты»*/

SET название_отдела = @Naz

WHERE Номер_отдела = @Nomer /*если читательский номер записи равен искомому*/

Процедура, определяющая по табельному номеру сотрудника, предоставляющие им услуги.

CREATE PROCEDURE yslygi

@a int,

AS

SELECT /*Перечисляем поля, которые будут выведены в результате запроса */

услуги.наименование,услуги.стоимость,Персонал.Фамилия,Персонал.Имя

FROM /*указываем имя таблицы из которых выбираются записи*/

услуги,Персонал

WHERE /*задаем условие отбора*/

(Персонал.Табельный_номер=@a)

Процедура, выводящая фамилию и имя сотрудника с таб. номером = 19.

Create procedure vyborpersonala /*имя процедуры*/

as select Персонал.Фамилия, Персонал.Имя /*Перечисляем поля, которые будут выведены в результате запроса */

From Персонал /*указываем имя таблицы из которых выбираются записи*/

Where Персонал.Табельный_номер=19 /*условие поиска*/

Процедура, определяющая по номеру клиента, число записи на прием.

CREATE PROCEDURE klient

@a int,

AS

SELECT /*Перечисляем поля, которые будут выведены в результате запроса */

запись.число_записи, Клиенты.Фамилия, Клиенты.Имя, Клиенты.Отчество

FROM /*указываем имя таблицы из которых выбираются записи*/

запись, Клиенты

WHERE /*задаем условие отбора*/

(запись.номер_клиента=@a) and (Клиенты.номер_клиента=@a)

Процедура, определяющая по номеру клиента предоставляемые ему услуги.

CREATE PROCEDURE yslygiklienta

@a int

AS

SELECT /*Перечисляем поля, которые будут выведены в результате запроса */

услуги.наименование,услуги.Код_услуги,Клиенты.Фамилия,Клиенты.Имя

FROM /*указываем имя таблицы из которых выбираются записи*/

услуги,Клиенты

WHERE (Клиенты.номер_клиента=@a) /*задаем условие отбора*/

Процедура, определяющая по стоимости услуги мастера, оказывающего данную услугу.

CREATE PROCEDURE stoimostmaster

@a int

AS

SELECT /*Перечисляем поля, которые будут выведены в результате запроса */

услуги.наименование, услуги.стоимость, услуги.Табельный_номер, Персонал.Фамилия, Персонал.Имя, Персонал.Табельный_номер

FROM /*указываем имя таблицы из которых выбираются записи*/

услуги, Персонал

WHERE /*задаем условие отбора*/

(услуги.стоимость=@a)

Процедура, определяющая по коду услуги информацию о сотруднике и оказываемой им услуге.

CREATE PROCEDURE parikmaxer

@a int

AS

SELECT /*Перечисляем поля, которые будут выведены в результате запроса */

услуги.наименование, услуги.Табельный_номер, Персонал.Фамилия, Персонал.Имя

FROM /*указываем имя таблицы из которых выбираются записи*/

услуги, Персонал

WHERE /*задаем условие отбора*/

(услуи.Код_услуги=@a)and(услуги.Табельный_номер= Персонал. табельный_номер)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]