
- •Введение
- •Анализ предметной области
- •Анализ сущностей и связей между ними
- •Составление запросов к базе данных и их инкапсуляция
- •Реализация пользователей и предоставление им прав
- •Реализация триггеров
- •Реализация пользовательского интерфейса
- •Заключение
- •Список использованных источников
- •Приложение а. Скриншоты заполненных таблиц
- •Приложение б. Код для создания базы данных
- •Приложение в. Код для создания графического интерфейса
Реализация пользователей и предоставление им прав
Для более безопасной работы БД рекламной компании создаются пользователи. Привилегии пользователям должны быть предоставлены строго только те, что действительно необходимы. Пользователи и описание их прав приведены в таблице 9.
Таблица 9 – Пользователи и их права
Пользователи |
Права |
Заказчик (customer) |
Просмотр таблицы shows |
Руководитель (director) |
Просмотр и редактирование таблицы shows Полный доступ к таблицам display_schedule и advertisements Полный доступ ко всем процедурам |
Агент (agent) |
Полный доступ к таблице deals Просмотр таблицы shows Редактирование rating в таблице shows Доступ к процедурам, связанным со сделками и заказчиками |
Администратор (administrator) |
Все |
Код для создания пользователей и предоставления им прав представлен в листинге 11.
Листинг 11 – Создание пользователей и предоставление им прав
-- Создание пользователя Customer
CREATE USER 'customer'@'%' IDENTIFIED BY 'customer';
GRANT SELECT ON tv_advertising_company.shows TO 'customer'@'%';
-- Создание пользователя Director
CREATE USER 'director'@'%' IDENTIFIED BY 'director';
GRANT SELECT, UPDATE ON tv_advertising_company.shows TO 'director'@'%';
GRANT SELECT, INSERT, UPDATE, DELETE ON tv_advertising_company.display_schedule TO 'director'@'%';
GRANT SELECT, INSERT, UPDATE, DELETE ON tv_advertising_company.advertisements TO 'director'@'%';
GRANT EXECUTE ON tv_advertising_company.* TO 'director'@'%';
-- Создание пользователя Agent
CREATE USER 'agent'@'%' IDENTIFIED BY 'agent';
GRANT SELECT, INSERT, UPDATE ON tv_advertising_company.deals TO 'agent'@'%';
GRANT SELECT ON tv_advertising_company.shows TO 'agent'@'%';
GRANT UPDATE (rating) ON tv_advertising_company.shows TO 'agent'@'%';
GRANT EXECUTE ON PROCEDURE tv_advertising_company.get_total_ad_duration_by_customer TO 'agent'@'%';
GRANT EXECUTE ON PROCEDURE tv_advertising_company.get_ad_count_weekday TO 'agent'@'%';
GRANT EXECUTE ON PROCEDURE tv_advertising_company.get_customer_count_for_top_shows TO 'agent'@'%';
GRANT EXECUTE ON PROCEDURE tv_advertising_company.get_customer_with_most_deals TO 'agent'@'%';
GRANT EXECUTE ON PROCEDURE tv_advertising_company.get_ad_info_for_high_rating_shows TO 'agent'@'%';
-- Создание пользователя Administrator
CREATE USER 'administrator'@'%' IDENTIFIED BY 'administrator';
GRANT ALL PRIVILEGES ON tv_advertising_company.* TO 'administrator'@'%';
GRANT EXECUTE ON tv_advertising_company.* TO 'administrator'@'%';
-- Применение привилегий
FLUSH PRIVILEGES;
Реализация триггеров
Для обеспечения корректной работы пользоваетелей с базой данных были разработаны триггеры.
Триггер 1: перед вставкой в таблицу shows проверяется значение rating, если оно меньше нуля или больше 10 выводится сообщение “ Rating must be between 0 and 10”.
Код представлен в листинге 12.
Результат работы триггера представлен на рисунке 53.
Листинг 12 – Триггер 1
DELIMITER $$
CREATE TRIGGER before_shows_insert_rating
BEFORE INSERT ON shows
FOR EACH ROW
BEGIN
IF NEW.rating < 0 OR NEW.rating > 10 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Rating must be between 0 and 10';
END IF;
END$$
DELIMITER ;
Рисунок 53 – Работа триггера 1
Триггер 2: перед вставкой в таблицу deals проверяется существование указанного agent_id в таблице agents, если агент не существует, выводится сообщение “Agent does not exist”
Код представлен в листинге 13.
Результат работы триггера представлен на рисунке 54.
Листинг 13 – Триггер 2
DELIMITER $$
CREATE TRIGGER before_deals_insert_agent_check
BEFORE INSERT ON deals
FOR EACH ROW
BEGIN
DECLARE agent_exists INT;
SET agent_exists = (SELECT COUNT(*) FROM agents WHERE agent_id = NEW.agent_id);
IF agent_exists = 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Agent does not exist';
END IF;
END$$
DELIMITER ;
Рисунок 54 – Работа триггера 2
Триггер 3: перед вставкой в таблицу deals если поля deal_date и deal_time пустые, то в них заносятся значения текущей даты и времени.
Код представлен в листинге 14.
Результат работы триггера представлен на рисунке 55.
Листинг 14 – Триггер 3
DELIMITER $$
CREATE TRIGGER before_deals_insert_date_time
BEFORE INSERT ON deals
FOR EACH ROW
BEGIN
IF NEW.deal_date IS NULL THEN
SET NEW.deal_date = CURDATE();
END IF;
IF NEW.deal_time IS NULL THEN
SET NEW.deal_time = CURTIME();
END IF;
END$$
DELIMITER ;
Рисунок 55 – Работа триггера 3
Триггер 4: перед вставкой в таблицу display_schedule првоеряется существаование рекламного ролика в указнном шоу в указанное время, если такая запись существует, выводится сообщение “This show at this time already has an ad”.
Код представлен в листинге 15.
Результат работы триггера представлен на рисунке 56.
Листинг 15 – Триггер 4
DELIMITER $$
CREATE TRIGGER before_display_schedule_insert_show_and_time
BEFORE INSERT ON display_schedule
FOR EACH ROW
BEGIN
DECLARE count INT;
-- Проверка наличия записи с таким же show_id и display_time
SELECT COUNT(*) INTO count
FROM display_schedule
WHERE show_id = NEW.show_id
AND display_time = NEW.display_time;
IF count > 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'This show at this time already has an ad';
END IF;
END$$
DELIMITER ;
Рисунок 56 – Работа триггера 4
Триггер 5: перед вставкой в таблицу customers проверяется существование указанного номера телефона в этой же таблице, если такой номер телефона уже существует, выводится сообщение “Phone number must be unique”.
Код представлен в листинге 16.
Результат работы триггера представлен на рисунке 57.
Листинг 16 – Триггер 5
DELIMITER $$
CREATE TRIGGER before_customers_insert_number
BEFORE INSERT ON customers
FOR EACH ROW
BEGIN
DECLARE phone_exists INT;
SET phone_exists = (SELECT COUNT(*) FROM customers WHERE phone_number = NEW.phone_number);
IF phone_exists > 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Phone number must be unique';
END IF;
END$$
DELIMITER ;
Рисунок 57 – Работа триггера 5