бд. бд БАНК_ЗАДАНИЙ. Удаленный доступ к базе с любого хоста
Скачать 0.91 Mb.
|
РАБОТА 25.О «Создание триггеров»
Время выполнения задания – 180 минут. Уровень сложности работы – 3 Необходимое оборудование, материалы, документация: ПК, МУ по выполнению практических работ. КРИТЕРИИ ОЦЕНИВАНИЯ РАБОТЫ КРИТЕРИИ ВЫСТАВЛЕНИЯ ОЦЕНКИ
СОДЕРЖАНИЕ РАБОТЫ Создание триггеров. 25.Т ТИПОВОЕ ЗАДАНИЕ Создан простой триггер. Создан триггер с использованием оператора IFили циклов. ХОД ВЫПОЛНЕНИЯ ТИПОВОГО ЗАДАНИЯ 25.Т Создадим триггер, в котором в таблице orders до добавления новой записи поле number будет установлено в единицу. DELIMITER// CREATE TRIGGER restrict_count BEFORE INSERTorders FOR EACH ROW BEGIN SETNEW.namber=1; END// DELIMITER; Проверимработутриггера. INSERT INTO orders VALUES (1, NOW(), 2, 10); SELECT * FROM orders WHERE id_order = LAST_INSERT_ID();
Допустим, при появлении нового студента в группе, ему сразу необходимо назначить консультацию с преподавателем. Тогда событие ‒ это INSERT, время вызова − AFTER, а таблица student. DELIMITER $$ CREATE TRIGGER add_cons AFTER INSERT ON student FOR EACH ROW BEGIN DECLARE last_id INT DEFAULT 0; SELECT id INTO last_id FROM student ORDER BY id DESC LIMIT 1; INSERT INTO student_teacher_consultation VALUES (null, last_id, 1, NOW() + INTERVAL 1 DAY); END $$ DELIMITER ; Проверим теперь, действительно ли это работает. Добавляем студента, и далее смотрим, что получилось в таблицах студентов и консультаций: INSERT INTO student VALUES (null, 'Hank', 23, '231-14-33', 1); student
student_teacher_consultation (расписаниеконсультаций)
Создадим триггер, в котором в таблице orders до добавления новой записи поле number будет установлено в единицу. DELIMITER// CREATE TRIGGER restrict_count BEFORE INSERTorders FOR EACH ROW BEGIN SETNEW.namber=1; END// DELIMITER; INSERT INTO orders VALUES (1, NOW(), 2, 10); SELECT * FROM orders WHERE id_order = LAST_INSERT_ID();-- последнийID
Создадим триггер на добавление данных в таблицу. Если при добавлении данных окажется, что новое значение даты NULL, то установить текущую дату. Create table tblname(id int, str varchar(45), dt date) DELIMITER $$ CREATE TRIGGER tgins_tblname BEFORE INSERT ON tablname FOR EACH ROW BEGIN IFNEW.dt IS NULL THEN SETNEW.dt = current_date(); END IF END $$ DELIMITER; Проверкаработытриггера INSERT INTO tblname VALUES(1, ‘text3’, NULL); SELECT * FROM tblname; tablname
Создадим триггер на добавление данных нового покупателя. При добавлении нового покупателя надо преобразовать имена и отчества покупателей в инициалы. DELIMITER // CREATE TRIGGER restrict_user BEFORE INSERTON user FOR EACH ROW BEGIN SET NEW.name = LEFT(NEW.name, 1); SET NEW.patronymic = LEFT(NEW.patronimic, 1); END // DELIMITER; Проверяемработутриггера INSERT INTO users (surname, patronymic, name) VALUES(‘Ремезов’, ‘Алексеевич’, ‘Сергей’); Выведемпоследнююзапись. SELECT surname, patronymic, name FROM users WHERE id_user = LAST_INSERT_ID();
Триггер на обновление таблицы. В таблицу LogsName в поле ValueCh будет занесена информация в виде объединения нового значения со старым.
DELIMITER // CREATE TRIGGER myTrigger1BEFORE UPDATE ON table1 FOR EACH ROW BEGIN INSERT INTO LogsName (ValueCh, DateChange) VALUES (CONCAT(NEW.`FirstName`,'-', OLD.`FirstName`), NOW()) ; END// DELIMITER; Проверкараработытриггера UPDATE table1 SET FirstName=‘Александр’ WHERE FirstName=‘Дмитрий’; LogsName Рассмотримдветаблицыsotr(ids, fio) иproekt(idp, ids). Реализуем триггер, который при удалении данных из таблицы sotr автоматически удаляет данные из таблицы proekt для обеспечения целостности (каскадное удаление). Sort proekt DELIMITER// CREATE TRIGGER BEFOREe_delete_sotr BEFORE DELETE ONsortFOR EACH ROW BEGIN DELETE FROM proektWHERE ids = OLD.ids; END// DELIMITER; Проверяем работу триггера: DELETE FROM sotr WHERE fio=‘Колпаков’; Sortproekt Таблица proekt(idp, name, cost, price), содержит код проекта, название, стоимость, наценку. Создадим триггер, который ко вводимой стоимости устанавливает наценку в 25% и помещает новую стоимость в поле price. DELIMITER// CREATE TRIGGER BEFOREe_update_cost BEFOREE UPDATE ON proekt FOR EACH ROW BEGIN SETNew.price = New.cost * 1.25; END// DELIMITER; Проверкаработытриггера INSERT INTO proekt values(“Проект 3”, 300);
|