Добавил:
t.me Инфо для ГУАП студентов от меня: https://kafaka.notion.site/99e6d9b70ca74f7baef3daea17839e5a Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чурилов / 4 курс / Базы_данных_Чурилов_Z9411_КР(2).docx
Скачиваний:
6
Добавлен:
10.11.2024
Размер:
539.36 Кб
Скачать

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 – Список триггеров