- •1 Техническое задание
- •Анализ предметной области
- •1.2 Постановка задачи
- •2 Проектирование логической модели системы
- •2.1 Функциональная модель
- •2.2 Информационная модель
- •2.3 Верификация спроектированной логической модели
- •3 Реализация системы
- •3.4 Описание клиентских приложений
- •4 Функциональное и общее тестирование системы
- •5 Энерго- и ресурсосбережения
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(услуги.Табельный_номер= Персонал. табельный_номер)
