
- •Министерство образования и науки рф
- •Рязанский государственный радиотехнический университет
- •Разработка программ по сопровождению базы данных ис автоматизации деятельности фитнес клуба
- •Описание предметной области
- •Описание структуры базы данных
- •4. Скрипт по созданию модифицированной бд
- •5 . Скрипт по созданию триггеров
- •6. Скрипт по созданию хранимых процедур
- •7. Скрипт по созданию ролей и присвоению им прав
- •Список используемых источников
5 . Скрипт по созданию триггеров
Разработать триггер, который автоматически вычисляет поля “Первоначальная сумма”(”First_Summa”) и “Окончательная сумма”( ”Final_summa”) в таблице “Абонементы“ (“Abonements “) при добавлении, изменении и удалении в таблице “Услуги клиента”(“Services_Abonement“). Триггер производит обновление в таблице “Абонементы“ только для тех записей, код абонемента ( ID_Abonement) которого использовался при изменении таблицы “Услуги клиента”.
/*Создание триггера для рассчета начальной и окончательной суммы*/
CREATE TRIGGER Summa FOR Services_abonement
/*Триггер создаетя после вставки или обновления или удаления
значений из таблицы "Услуги клиента"("Services_abonement")*/
ACTIVE AFTER INSERT OR UPDATE OR DELETE
AS
DECLARE VARIABLE kod INTEGER;
BEGIN
/*Если происходит триггер для события вставка или обновление, то в переменную kod заносится значение нового кода абонемента, а если удаление-то старый код абонемента*/
IF (INSERTING OR UPDATING ) THEN kod=NEW.ID_Abonement;
ELSE kod=OLD.ID_Abonement;
/*Обновление таблицы "Абонементы"("Abonements")*/
UPDATE Abonements A
SET
/*Рассчет начальной суммы(First_Summa) путем суммирования всех произведения числа купленных занятий(number) на цену этого занятия(price) относящихся к коду абонементу, для которого происходит это событие*/
A.First_Summa=(SELECT SUM(S.number*(SELECT P.price FROM
price_list P
WHERE P.id_worker=(SELECT T.id_worker FROM timetable T
WHERE T.id_hall=S.id_hall AND
T.id_itime=S.id_itime)
AND
P.id_service=(SELECT W.id_service FROM timetable W
WHERE W.id_hall=S.id_hall AND
W.id_itime=S.id_itime)))
FROM services_abonement S
WHERE S.id_abonement=A.id_abonement
GROUP BY S.id_abonement),
/*Рассчет окончательной суммы(Final_summa) путем произведения начальной суммы (First_Summa) на скидку, которая берется из таблицы "Система скидок"("Discounts") по коду скидки (id_discount)*/
A.Final_summa=IIF(A.id_discount IS NOT NULL,
(A.First_summa-(A.First_summa*(SELECT D.discount FROM
Discounts D
WHERE A.id_discount=D.id_discount)/100)),A.First_summa)
/*Обновление происходит только для кода абонемента, с которых происходит событие*/
WHERE A.ID_Abonement=:kod;
END;
Разработать триггер, проверяющий то, что в таблице “Прейскурант”(“Price_list“) должны присутствовать только те сотрудники, которые могут проводить занятия. Чтобы проверить дано условие, следует для этого сотрудника по его должности значение поля “Флаг услуги”. Если это поле равно1, то значит данный сотрудник может проводить занятия, если 0, то не может.
/*Создание нового исключения "Price_list_Insert" при срабатывании триггера*/
CREATE EXCEPTION Price_list_Insert 'Error insert ID_Worker into Price_list';
SET TERM !! ;
/*Создание триггера "Price_list_Insert" для таблицы "Price_list"*/
CREATE TRIGGER Price_list_Insert FOR Price_list
ACTIVE BEFORE INSERT
AS
DECLARE VARIABLE kod INTEGER;
DECLARE VARIABLE flag INTEGER;
BEGIN
/*В переменные kod, usluga заносятся построчно поля "Код сотрудника" и "Флаг услуги"*/
FOR SELECT W.id_worker,
(SELECT J.flag_usluga FROM Jobs J WHERE W.id_job=J.id_job) FROM
Workers W
INTO kod, flag
DO
BEGIN
/*Если kod равен новому коду сотрудника и у этого сотрудника flag равен 0, то возникает исключение*/
IF (kod=NEW.ID_Worker AND flag=0) THEN EXCEPTION Price_list_Insert;
END
END!!
SET TERM ; !!