Главная страница
Навигация по странице:

  • CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt; Оператор создает триггер с именем trigger_name

  • DROP TRIGGER trigger_name; Практическая часть

  • CREATE TABLE `blog` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `title` text, `content` text

  • ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT=Blog posts;

  • CREATE TABLE `audit` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `blog_id` mediumint(8) unsigned NOT NULL

  • KEY `ix_blog_id` (`blog_id`), KEY `ix_changetype` (`changetype`), KEY `ix_changetime` (`changetime`)

  • DELIMITER $$ CREATE TRIGGER `blog_after_insert` AFTER INSERT ON `blog` FOR EACH ROW BEGIN

  • INSERT INTO audit (blog_id, changetype) VALUES (NEW.id, @changetype); END$$ DELIMITER ;

  • DELIMITER $$ CREATE TRIGGER `blog_after_update` AFTER UPDATE ON `blog` FOR EACH ROW BEGIN

  • INSERT INTO blog (title, content) VALUES ( Первая запись , Текст записи );​

  • UPDATE blog SET content = Изменения текста WHERE id = 1;

  • UPDATE blog SET deleted = 1 WHERE id = 1; 8. Посмотрите, что произошло с таблицей audit. Задание 2

  • Дополнительное задание (1). Задание 1 Теоретические сведения Триггер


    Скачать 24.36 Kb.
    НазваниеЗадание 1 Теоретические сведения Триггер
    Дата16.05.2022
    Размер24.36 Kb.
    Формат файлаdocx
    Имя файлаДополнительное задание (1).docx
    ТипДокументы
    #532076

    Работать на локальном сервере (созданном при установке MySQL Workbench).

    Задание 1

    Теоретические сведения

    Триггер – эта та же хранимая процедура, но привязанная к событию изменения со­держимого конкретной таблицы.

    Возможны три события, связанных с изменением содержимого таблицы, к которым можно привязать триггер:

    • insert – вставка новых данных в таблицу;

    • delete – удаление данных из таблицы;

    • Update – обновление данных в таблице.

    Например, при оформлении нового заказа, т.е. при добавлении новой записи в таблицу orders, можно создать триггер, автоматически вычитающий число заказанных товарных позиций в таблице books.

    Создать новый триггер позволяет оператор:

    CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt;

    Оператор создает триггер с именем trigger_name, привязанный к таблице tbl_name. Не допускается привязка триггера к временной таблице или представлению. Конструкция trigger_time указывает момент выполнения триггера и может прини­мать два значения:

    • before – действия триггера производятся до выполнения операции изменения таблицы;

    • after – действия триггера производятся после выполнения операции изменения таблицы.


    Конструкция trigger_event показывает, на какое событие должен реагировать триггер, и может принимать три значения:


    Для таблицы tbl_name может быть создан только один триггер для каждого из со­бытий trigger_event и момента trigger_time. Таким образом, для каждой из таблиц мо­жет быть создано всего шесть триггеров.

    Конструкция trigger_stmt представляет тело триггера – оператор, который необ­ходимо выполнить при возникновении события trigger_event в таблице tbl_name.

    Удаление триггеров. Удалить существующий триггер позволяет оператор

    DROP TRIGGER trigger_name;

    Практическая часть

    1. Создадим для примера базу данных для блога. Нам понадобится две таблицы:

    • `blog`: хранит уникальный идентификатор поста, заголовок, содержимое и флаг того, считается ли запись удаленной (на деле запись блога удаляться никогда не будет, а будет помечаться флагом, что запись считается удаленной или не удаленной).

    • `audit`: хранит базовый набор исторических изменений с идентификатором записи, идентификатором сообщения блога, типом изменения (NEW, EDIT или DELETE) и датой/временем этого изменения.

    2. Создадим таблицу `blog`:

    CREATE TABLE `blog` (

    `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,

    `title` text,

    `content` text,

    `deleted` tinyint(1) unsigned NOT NULL DEFAULT '0',

    PRIMARY KEY (`id`),

    KEY `ix_deleted` (`deleted`)

    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='Blog posts';

    3. Далее напишем sql код для создания таблицы `audit`. Нужно назначить для всех полей индексы и определить внешний ключ 
    как audit.blog_id который ссылается на поле id из таблицы `blog`.

    Привязка по внешнему ключу позволит делать следующее: когда мы удаляем запись в блоге, также удаляется полная история аудита советующего поля по blog_id.

    CREATE TABLE `audit` (

    `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,

    `blog_id` mediumint(8) unsigned NOT NULL,

    `changetype` enum('NEW','EDIT','DELETE') NOT NULL,

    `changetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

    PRIMARY KEY (`id`),

    KEY `ix_blog_id` (`blog_id`),

    KEY `ix_changetype` (`changetype`),

    KEY `ix_changetime` (`changetime`),

    CONSTRAINT `FK_audit_blog_id` FOREIGN KEY (`blog_id`) REFERENCES `blog` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

    4. Теперь создаем два триггера:

    Первый - когда новая запись создается в таблице `blog`, создаем для нее запись в таблице `audit` c `blog_id` соответствующей id новой записи блога и типом 'NEW' из набора enum('NEW','EDIT','DELETE').

    Второй - когда запись в блоге обновляется, то добавляем запись в `audit` с типом 'EDIT' из набора enum('NEW','EDIT','DELETE'). Время при этом устанавливается автоматически, в момент создания записи.

    Создаем AFTER INSERT триггер. Тут мы вводим переменную @changetyp, которая будет хранить значение из enum('NEW','EDIT','DELETE') в зависимости от условия, какое значение установлено в blog.deleted:

    DELIMITER $$

    CREATE

    TRIGGER `blog_after_insert` AFTER INSERT

    ON `blog`

    FOR EACH ROW BEGIN

    IF NEW.deleted THEN

    SET @changetype = 'DELETE';

    ELSE

    SET @changetype = 'NEW';

    END IF;

    INSERT INTO audit (blog_id, changetype) VALUES (NEW.id, @changetype);

    END$$

    DELIMITER ;

    На столбцы таблицы, к которой привязан триггер (в данном случае `blog`) можно ссылаться с помощью псевдонимов OLD и NEW.

    NEW - это вновь созданная таблица. Поэтому NEW.deleted содержит значение этого столбца при создании записи в `blog`.

    OLD.col_name - указывает на данные стрлбца до удаления или изменения данных при соответствующих событиях триггеров UPDATE/DELETE.

    Триггер AFTER UPDATE:

    DELIMITER $$

    CREATE

    TRIGGER `blog_after_update` AFTER UPDATE

    ON `blog`

    FOR EACH ROW BEGIN

    IF NEW.deleted THEN

    SET @changetype = 'DELETE';

    ELSE

    SET @changetype = 'EDIT';

    END IF;

    INSERT INTO audit (blog_id, changetype) VALUES (NEW.id, @changetype);

    END$$

    DELIMITER ;

    5. Проверка работы триггера:

    Посмотрим, что произойдет, когда мы добавим новый столбец в нашу таблицу блога:

    INSERT INTO blog (title, content) VALUES ('Первая запись', 'Текст записи');​

    6. Проверим появилась ли запись в таблицах.

    Обновим наш текст в блоге:

    UPDATE blog SET content = 'Изменения текста' WHERE id = 1;

    7. После обновления просмотрите таблицу audit. Что там изменилось?

    Отметим пост как удаленный:

    UPDATE blog SET deleted = 1 WHERE id = 1;

    8. Посмотрите, что произошло с таблицей audit.

    Задание 2

    1. Изучить теоретические сведения в презентации (лежит в папке с этим файлом).

    2. Открыть консоль MySQL Workbench.

    3. Средствами языка SQL создайте две таблицы (на свой выбор).

    4. Во всех таблицах создайте первичный ключ и свяжите их с помощью внешнего ключа.


    написать администратору сайта