
- •Введение
- •1 Анализ предметной области
- •2 Составление требуемых запросов к базе данных
- •3 Анализ разрешений и запретов на операции с табличными данными для различных пользователей
- •4 Проектирование пользовательского интерфейса
- •5 Обработка и визуализация данных
- •Заключение
- •Список использованных источников
3 Анализ разрешений и запретов на операции с табличными данными для различных пользователей
Было создано 4 пользователя: заказчик, руководитель (директор), агент, администратор. Листинг создания пользователей представлен в листинге 12.
Листинг 12 – Создание пользователей
create user 'administrator' identified by '1';
create user 'agent_of_company' identified by '2';
create user 'customer' identified by '3';
create user 'director_of_company' identified by '4';
Описание пользователей
Заказчик: может просмотреть рейтинг передачи;
Руководитель (директор): отслеживает расчеты, связанные с прохождением рекламы в телеэфире; назначает стоимость минуты рекламы;
Агент: заключает договора (сделки) с заказчиками; отслеживают и обновляют рейтинги передач.
Администратор БД: имеет полное право доступа к БД, отвечает за её работу.
Листинг 13 – Назначение привилегий
grant select, update, delete, insert on ad.tv_show to 'agent_of_company';
grant select, update, delete, insert on ad.contract to 'agent_of_company';
grant select on ad.tv_show to 'customer';
grant select, update, delete, insert on ad.tv_show to 'director_of_company';
grant all on *.* to 'administrator';
4 Проектирование пользовательского интерфейса
Все запросы были реализованы через вызовы хранимых процедур. Реализация запроса 1, вывод суммарной продолжительности показа роликов заданного рекламодателя, в процедуру pr1 представлена в листинге 14. Примеры вызова процедуры представлены на рисунке 18 с параметром «3» и ошибкой на рисунке 19.
Листинг 14 – Реализация запроса 1 в процедуру 1
delimiter //
create procedure pr1 (inout i int)
begin
if (i not in (select customer_id from customer)) then
select 'Такого заказчика нет';
else
select count(contract.ad_id)*ad.ad_duration as Showing from ad, contract, customer where contract.ad_id = ad.ad_id and customer.customer_id = i and contract.customer_id = customer.customer_id group by customer.customer_id;
end if;
end //
Рисунок 18 – Пример вызова процедуры 1 для переменной «3»
Рисунок 19 – Пример вызова процедуры 1 для переменной «2»
Реализация запроса 2, вывод суммы договор, который заключил заданный агент, в процедуру pr2 представлена в листинге 15. Пример вызова процедуры представлен на рисунке 20 с параметром «Черных» и «Белый» на рисунке 21.
Листинг 15 – Реализация запроса 2 в процедуру 2
create procedure pr2(inout i char(15))
begin
if (i not in (select agent_lastname from agent)) then
select 'Такого агента не существует';
else
select sum(contract.contract_price) as Sum from contract, agent where agent.agent_id = (select agent_id from agent where agent_lastname = i) and contract.agent_id = agent.agent_id;
end if;
end//
Рисунок 20 – Пример вызова процедуры 2 для переменной «Черных»
Рисунок 21 – Пример вызова процедуры 2 для переменной «Белый»
Реализация запроса 3, вывод информации о количестве договоров на заданный рекламный ролик, в процедуру pr3 представлена в листинге 16. Пример вызова процедуры представлен на рисунке 22 с параметром «1» и параметром «5» на рисунке 23.
Листинг 16 – Реализация запроса 3 в процедуру 3
create procedure pr3(inout i int)
begin
if (i not in (select ad_id from ad)) then
select 'Такую рекламу еще не сняли';
else
select count(contract.ad_id) as Count from contract, ad where ad.ad_id = i and contract.ad_id = ad.ad_id;
end if;
end//
Рисунок 22 – Пример вызова процедуры 3 для переменной «1»
Рисунок 23 – Пример вызова процедуры 3 для переменной «5»
Реализация запроса 4, вывод зарплаты заданного агента, в процедуру pr4 представлена в листинге 17. Пример вызова процедуры представлен на рисунке 24 с параметром «Романов» и параметром «Кириллов» на рисунке 25.
Листинг 17 – Реализация запроса 4 в процедуру 4
create procedure pr4(inout i int)
begin
if (i not in (select agent_lastname from agent)) then
select 'Такого агента не существует';
else
select i as AgentName, sum(contract.contract_price*agent.agent_percent/100) as Salary from contract, agent where agent.agent_id = (select agent_id from agent where agent_lastname = i) and contract.agent_id = agent.agent_id;
end if;
end//
Рисунок 24 – Пример вызова процедуры 4 для переменной «Романов»
Рисунок 25 – Пример вызова процедуры 4 для переменной «Кириллов»
Реализация запроса 5, вывод информации о заказанных рекламах заданного заказчика, в процедуру pr5 представлена в листинге 18. Пример вызова процедуры представлен на рисунке 26 с параметром «34» и параметром «35» на рисунке 27.
Листинг 18 – Реализация запроса 5 в процедуру 5
create procedure pr5(inout i int)
begin
if (i not in (select customer_id from customer)) then
select 'Такого заказчика не существует';
else
select customer.customer_contactperson as CustomerCP, contract.contract_price as Price, tv_show.tv_rating as Rating from customer, contract, tv_show where customer.customer_id = i and contract.tv_id = tv_show.tv_id and customer.customer_id = contract.customer_id;
end if;
end//
Рисунок 26 – Пример вызова процедуры 5 для переменной «34»
Рисунок 27 – Пример вызова процедуры 5 для переменной «35»
Реализация запроса 6, подсчет количества заключенных договоров определенной организации, в процедуру pr6 представлена в листинге 19. Пример вызова процедуры представлен на рисунке 28 с параметром «» и параметром «» на рисунке 29.
Листинг 19 – Реализация запроса 6 в процедуру 6
create procedure pr6(inout i varchar(20))
begin
if (i not in (select customer_id from customer)) then
select 'Такого заказчика не существует';
else
select customer.customer_contactperson as ContactPerson, count(contract.customer_id) as Counter from contract, customer where customer.customer_id = contract.customer_id and customer.customer_id = i;
end if;
end//
Рисунок 28 – Пример вызова процедуры 6 для переменной «11»
Рисунок 29 – Пример вызова процедуры 6 для переменной «111»
Реализация запроса 7, вывод средней выручки определенного агента, в процедуру pr7 представлена в листинге 20. Пример вызова процедуры представлен на рисунке 30 с параметром «Одинцов» и параметром «Мешков» на рисунке 31.
Листинг 20 – Реализация запроса 7 в процедуру 7
create procedure pr7 (inout i char(15))
begin
if (i not in (select agent_lastname from agent)) then
select 'Такого агента не существует';
else
select i as AgentName, sum(contract.contract_price*agent.agent_percent/100)/count(contract.agent_id) as Average from contract, agent where agent.agent_id = (select agent_id from agent where agent_lastname = i) and contract.agent_id = agent.agent_id;
end if;
end//
Рисунок 30 – Пример вызова процедуры 7 для переменной «Одинцов»
Рисунок 31 – Пример вызова процедуры 7 для переменной «Мешков»
Реализация запроса 8, вывод суммарных трат заданного заказчика на рекламу, в процедуру pr8 представлена в листинге 21. Пример вызова процедуры представлен на рисунке 32 с параметром «75» и параметром «12» на рисунке 33.
Листинг 21 – Реализация запроса 8 в процедуру 8
create procedure pr8 (inout i int)
begin
if (i not in (select customer_id from customer)) then
select 'Такого заказчика не существует';
else
select customer.customer_contactperson as ContactPerson, sum(contract.contract_price)/count(contract.contract_price) as Average from customer, contract where customer.customer_id = i and contract.customer_id = customer.customer_id;
end if;
end//
Рисунок 32 – Пример вызова процедуры 8 для переменной «75»
Рисунок 33 – Пример вызова процедуры 8 для переменной «12»
Реализация запроса 9, вывод количества рекламных записей у передач, имеющий рейтинг больше заданного, в процедуру pr9 представлена в листинге 22. Пример вызова процедуры представлен на рисунке 34 с параметром «4.61» и параметром «6» на рисунке 35.
Листинг 22 – Реализация запроса 9 в процедуру 9
create procedure pr9 (inout i float)
begin
if (i > 5) then
select 'Максимальный рейтинг 5';
else
select tv_show.tv_rating as Rating, count(contract.tv_id) as Counter from tv_show, contract where tv_show.tv_rating > i and contract.tv_id = tv_show.tv_id group by tv_show.tv_rating;
end if;
end//
Рисунок 34 – Пример вызова процедуры 9 для переменной «4.61»
Рисунок 35 – Пример вызова процедуры 9 для переменной «6»
Реализация запроса 10, вывод информации о количестве заключенных договоров заданного заказчика, в процедуру pr10 представлена в листинге 23. Пример вызова процедуры представлен на рисунках 36-38 с параметрами «Кузина», «Морозов» и «Морозова».
Листинг 23 – Реализация запроса 10 в процедуру 10
create procedure pr10 (inout i char(15))
begin
if (i not in (select customer_contactperson from customer)) then
select 'Такого заказчика нет';
else
if (i not in (select customer.customer_contactperson from contract, customer where contract.customer_id = customer.customer_id and customer.customer_id = (select customer.customer_id from customer where customer.customer_contactperson = i))) then
select 'Заказчик еще не оформлял договор';
else
select customer.customer_contactperson as ContactPerson, count(contract.contract_id) as CountOfContracts from contract, customer where contract.customer_id = customer.customer_id and customer.customer_id = (select customer.customer_id from customer where customer.customer_contactperson = i);
end if;
end if;
end//
Рисунок 36 – Пример вызова процедуры 10 для переменной «Кузина»
Рисунок 37 – Пример вызова процедуры 10 для переменной «Морозов»
Рисунок 38 – Пример вызова процедуры 10 для переменной «Морозова»
Были составлены процедуры для выдачи требуемых разрешений (привилегий) пользователям.
Реализация выдачи привилегий для пользователя Администратор в процедуру представлена в листинге 24.
Листинг 24 – Процедура выдачи привилегий для пользователя Администратор
create procedure pr_priv_administator ()
begin
grant all privileges on *.* to 'administrator';
end //
Реализация выдачи привилегий для пользователя Агент в процедуру представлена в листинге 25.
Листинг 25 – Процедура выдачи привилегий для пользователя Агент
create procedure pr_priv_agent ()
begin
grant select, update, delete, insert on ad.tv_show to 'agent_of_company';
grant select, update, delete, insert on ad.contract to 'agent_of_company';
end //
Реализация выдачи привилегий для пользователя Руководитель в процедуру представлена в листинге 26.
Листинг 26 – Процедура выдачи привилегий для пользователя Руководитель
create procedure pr_priv_director_of_company ()
begin
grant select, update, delete, insert on ad.tv_show to 'director_of_company';
end //
Реализация выдачи привилегий для пользователя Заказчик в процедуру представлена в листинге 27.
Листинг 27 – Процедура выдачи привилегий для пользователя Заказчик
create procedure pr_priv_customer ()
begin
grant select on ad.tv_show to 'customer';
end //
Были реализованы триггеры для проверки вводимых значений в таблицу. Триггер на добавление данных в таблицу ad представлен в листинге 28. Триггер проверяет уникальность введённого id. При неправильном вводе id ему присваивается значения максимума id, увеличенного на 1. Результат работы триггера отображен на рисунке 39. Введенный id уже был использован, поэтому в таблице запись о клиенте имеет новый id.
Листинг 28 – Триггер insert_ad
create trigger insert_ad before insert on ad
for each row
begin
if (new.ad_id in (select ad_id from ad)) then
set new.ad_id = (select max(ad_id) from ad) + 1;
end if;
end//
Рисунок 39 – Результат работы триггера insert_ad
Триггер на обновление данных в таблице ad представлен в листинге 29. Триггер проверяет уникальность введенного id. При неверном вводе данных значения остаются прежними.
Листинг 29 – Триггер update_ad
create trigger update_ad before update on ad
for each row
begin
if (new.ad_id in (select ad_id from ad)) then
set new.ad_id = old.ad_id;
end if;
end//
Триггер на удаление данных в таблице ad представлен в листинге 30. Все упоминания о данных из удаленной строки удаляются также из таблицы Contract. Пример работы триггера представлен на рисунках 40-41.
Листинг 30 – Триггер delete_ad
create trigger delete_ad before delete on ad
for each row
begin
delete from contract where ad_id = old.ad_id;
end//
Рисунок 40 – Таблица ad до удаления данных
Рисунок 41 – Таблица ad после удаления данных
Триггер на добавление данных в таблицу agent представлен в листинге 31. Триггер проверяет уникальность введённого id. При неправильном вводе id ему присваивается значения максимума id, увеличенного на 1. Триггер работает по аналогии с триггером insert_ad.
Листинг 31 – Триггер insert_agent
create trigger insert_agent before insert on agent
for each row
begin
if (new.agent_id in (select agent_id from agent)) then
set new.agent_id = (select max(agent_id) from agent) + 1;
end if;
end//
Триггер на обновление данных в таблице agent представлен в листинге 32. Триггер проверяет уникальность введенного id. При неверном вводе данных значения остаются прежними.
Листинг 32 – Триггер update_agent
create trigger update_agent before update on agent
for each row
begin
if (new.agent_id in (select agent_id from agent)) then
set new.agent_id = old.agent_id;
end if;
end//
Триггер на удаление данных в таблице agent представлен в листинге 33. Все упоминания о данных из удаленной строки удаляются также из таблицы Contract. Триггер работает по аналогии с триггером delete_ad.
Листинг 33 – Триггер delete_agent
create trigger delete_agent before delete on agent
for each row
begin
delete from contract where agent_id = old.agent_id;
end//
Триггер на добавление данных в таблицу Customer представлен в листинге 34. Триггер проверяет уникальность введённого id. При неправильном вводе id ему присваивается значения максимума id, увеличенного на 1. Триггер работает по аналогии с триггером insert_ad.
Листинг 34 – Триггер insert_customer
create trigger insert_customer before insert on customer
for each row
begin
if (new.customer_id in (select customer_id from home)) then
set new.customer_id = (select max(customer_id) from customer_id) + 1;
end if;
end//
Триггер на обновление данных в таблице customer представлен в листинге 35. Триггер проверяет уникальность введенного id. При неверном вводе данных значения остаются прежними.
Листинг 35 – Триггер update_customer
create trigger update_customer before update on customer
for each row
begin
if (new.customer_id in (select customer_id from customer)) then
set new.customer_id = old.customer_id;
end if;
end//
Триггер на удаление данных в таблице customer представлен в листинге 36. Все упоминания о данных из удаленной строки удаляются также из таблицы contract. Триггер работает по аналогии с триггером delete_ad.
Листинг 36 – Триггер delete_customer
create trigger delete_customer before delete on customer
for each row
begin
delete from contract where customer_id = old.customer_id;
end//
Триггер на добавление данных в таблицу tv_show представлен в листинге 37. Триггер проверяет уникальность введённого id. При неправильном вводе id ему присваивается значения максимума id, увеличенного на 1. Триггер работает по аналогии с триггером insert_tv
Листинг 37 – Триггер insert_tv
create trigger insert_tv before insert on tv_show
for each row
begin
if (new.tv_id in (select tv_id from tv_show)) then
set new.tv_id = (select max(tv_id) from tv_show) + 1;
end if;
end//
Триггер на обновление данных в таблице tv_show представлен в листинге 38. Триггер проверяет уникальность введенного id. При неверном вводе данных значения остаются прежними.
Листинг 38 – Триггер update_tv
create trigger update_tv before update on tv_show
for each row
begin
if (new.tv_id in (select tv_id from tv_show)) then
set new.tv_id = old.tv_id;
end if;
end//
Триггер на удаление данных в таблице tv_show представлен в листинге 39. Все упоминания о данных из удаленной строки удаляются также из таблицы contract. Триггер работает по аналогии с триггером delete_ad.
Листинг 39 – Триггер delete_tv
create trigger delete_tv before delete on tv_show
for each row
begin
delete from contract where tv_id = old.tv_id;
end//
Триггер на добавление данных в таблицу contract представлен в листинге 40. Триггер проверяет уникальность введённого id. При неправильном вводе id ему присваивается значения максимума id, увеличенного на 1. Триггер работает по аналогии с триггером insert_ad.
Листинг 40 – Триггер insert_contract
create trigger insert_contract before insert on contract
for each row
begin
if (new.contract_id in (select contract_id from contract)) then
set new.contract_id = (select max(contract_id) from contract) + 1;
end if;
end//
Триггер на обновление данных в таблице contract представлен в листинге 41. Триггер проверяет уникальность введенного id. При неверном вводе данных значения остаются прежними.
Листинг 41 – Триггер update_contract
create trigger update_contract before update on contract
for each row
begin
if (new.contract_id in (select contract_id from contract)) then
set new.contract_id = old.contract_id;
end if;
end//
Список всех созданных процедур представлен на рисунке 42, триггеров – на рисунке 43.
Рисунок 42 – Список процедур
Рисунок 43 – Список триггеров