Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
19
Добавлен:
03.06.2024
Размер:
2.14 Mб
Скачать
  1. Реализация пользователей и предоставление им прав

Для более безопасной работы БД рекламной компании создаются пользователи. Привилегии пользователям должны быть предоставлены строго только те, что действительно необходимы. Пользователи и описание их прав приведены в таблице 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. Реализация триггеров

Для обеспечения корректной работы пользоваетелей с базой данных были разработаны триггеры.

Триггер 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