бд. бд БАНК_ЗАДАНИЙ. Удаленный доступ к базе с любого хоста
Скачать 0.91 Mb.
|
Определим, чтобы новая стоимость определялась в зависимости от величины старой, а именно если цена меньше 100, то пусть будет 100, если же цена больше 100, но меньше 200, то пусть будет 200.
Для этого используем выражение IF, с учетом которого триггер BEFOREe_update_cost принимает вид: DELIMITER// CREATE TRIGGER BEFOREe_update_cost BEFORE UPDATE ON proekt FOR EACH ROW BEGIN IF NEW.cost < 100 then SET NEW.price = 100; elseIF NEW.cost > 100 AND NEW.cost <= 300 then SET NEW.price = 250 ; endIF END// DELIMITER; Проверкаработытриггера UPDATE proekt SET cost=300 WHERE cost=150;
Вывод сообщения об ошибоке в триггере delimiter // use test// create table trigger_test(id int not null); drop trigger if exists trg_trigger_test_ins; create trigger trg_trigger_test_ins BEFORE insert on trigger_test for each row begin declare msg varchar(128); if new.id < 0 then set msg = concat('MyTriggerError: Trying to insert a negative value in trigger_test: ', cast(new.id as char)); signal sqlstate '45000' set message_text = msg; end if; end// delimiter ; Проверка работы триггера insert into trigger_test values (1), (-1), (2); -- everything fails asone row is bad (всеневерно) select * from trigger_test; insert into trigger_test values (1); -- succeeds as expected (успешно) insert into trigger_test values (-1); -- fails as expected (не так, как ожидалось) select * from trigger_test; Естьтаблица readers состолбцами (number, name, date_of_born, address, telephone, date_registration). Нужно написать триггер чтоб было условие: при вставке данных в столбец date_registration вычиталось 16 YEAR и эта дата ('date_registration' - 16) была меньше вставляемой даты в столбец date_of_born. В противном случае разрешить вставку данных.Если условие выполняется - то запретить вставку. DELIMITER // CREATE TRIGGER do BEFOREE INSERT ON readers FOR EACH ROW BEGIN IF DATE_SUB(NEW.date_registration, interval 16 year) > NEW.date_of_born THENsetmsg = ('MyTriggerError: новаядатарегистрациибольшеднярождения'); signal sqlstate '45000' set message_text = msg; END IF; END // DELIMITER; Проверкаработытриггера INSERT INTO readers(number, name, date_of_born, address, telephone, date_registration) VALUES(3, “Виктор”, “1993-08-01”, “СПб, ул.Садовая, 59, 3 ”, “1993-08-11”) Mysql>MyTriggerError: новая дата регистрации больше дня рождения В таблице Заказчик добавить поле сумма заказов, при добавлении нового заказа для данного заказчика, обновлять это поле с учетом нового заказа. Внесем необходимые изменения в таблицу Заказчик. ALTER TABLE clientADD Total INT DEFAULT '0' AFTER Phone; DELIMITER $$ CREATE TRIGGER `update_total` AFTER INSERT ON `order-product` FOR EACH ROW BEGIN declare order_total int(10); declare clientID int(10); SELECT product.Price * order-product.Amount into order_total FROM order-product, product WHERE order-product.Product_ID = product.ID_prod AND order-product.Order_ID = new.Order_ID AND order-product.Product_ID = new.Product_ID; SELECT ID_client into clientID FROM order a WHERE a.ID_order = new.Order_ID; UPDATE client SET Total = Total + order_total WHERE ID_client = clientID; END; && DELIMITER; Можно записать тело по-другому, без объявления переменных, в одну команду. CREATE TRIGGER update_total AFTER INSERT ON order-product FOR EACH ROW BEGIN UPDATE client SET Total =Total+ (SELECT product.Price * order-product.Amount FROM order-product, product WHERE order-product.Product_ID = product.ID_prod AND order-product.Order_ID = new.Order_ID AND order-product.Product_ID = new.Product_ID) WHERE ID_client = (SELECT ID_clientFROM order a WHERE a.ID_order = new.Order_ID); END; Теперь проиллюстрируем работу созданного триггера. Покажем вид таблицы Заказчик до изменений. SELECT * FROM client WHERE ID_client = 6; Таблица Client после работы триггера. ЗАДАНИЕ 25.1.О Нарисать триггеры в сооьветствии со своим вариантом.
РАБОТА 26.О «Выполнение и отмена транзакций»
Время выполнения задания – 90 минут. Уровень сложности работы – 2 Необходимое оборудование, материалы, документация: ПК, МУ по выполнению практических работ. КРИТЕРИИ ОЦЕНИВАНИЯ РАБОТЫ КРИТЕРИИ ВЫСТАВЛЕНИЯ ОЦЕНКИ
СОДЕРЖАНИЕ РАБОТЫ Создание триггеров. 26.Т ТИПОВОЕ ЗАДАНИЕ Отключить режим автоматического завершения. Изменить данные. Осуществить проверку изменения данных. Осуществить откат транзакции. Воспроизвести транзакция. Сохраниить действия по изменению данных. ХОД ВЫПОЛНЕНИЯ ТИПОВОГО ЗАДАНИЯ 26.Т Отключаем режим автоматического завершения, добавляем новые записи и проверяем, добавились записи или нет. mysql>SET AUTOCOMMIT=0; mysql>INSERT INTO catalogs VALUES(NULL,'Аппаратура' ); mysql>INSERT INTO catalogs VALUES(NULL,'Безопасность') mysql>SELECT * FROM catalogs;
Откатываем транзакцию оператором ROLLBACK (изменения не сохранились). mysql>ROLLBACK; mysql>SELECT * FROM catalogs;
Воспроизведем транзакцию и сохраним действия оператором COMMIT. mysql>INSERT INTO catalogs VALUES(NULL,'Аппаратура' ); mysql>INSERT INTO catalogs VALUES(NULL,'Безопасность') mysql>SELECT * FROM catalogs;
mysql>COMMIT; mysql> SELECT * FROM catalogs;
ЗАДАНИЕ 26.1.О Cоздать транзакцию, произвести ее откат и фиксацию. Показать, что данные существовали до отката, удалились после отката, снова были добавлены, и затем были успешно зафиксированы. |