кодесурса
«MySQL

Триггеры MySQL

script1adsense2code
script1adsense3code

Введение в триггеры

Триггер - это набор действий, которые запускаются автоматически, когда указанная операция изменения (оператор SQL INSERT, UPDATE или DELETE) выполняется над указанной таблицей. Триггеры полезны для таких задач, как обеспечение соблюдения бизнес-правил, проверка входных данных и ведение контрольного журнала.

Содержание:

Использует для триггеров:

  • Применять бизнес-правила
  • Проверьте входные данные
  • Создайте уникальное значение для вновь вставленной строки в другом файле.
  • Записывать в другие файлы для целей аудита
  • Запрос из других файлов для перекрестных ссылок
  • Доступ к системным функциям
  • Репликация данных в разные файлы для обеспечения согласованности данных

Преимущества использования триггеров в бизнесе:

  • Ускоренная разработка приложений. Поскольку база данных хранит триггеры, вам не нужно кодировать действия триггера в каждом приложении базы данных.
  • Глобальное обеспечение соблюдения бизнес-правил. Определите триггер один раз, а затем повторно используйте его для любого приложения, которое использует базу данных.
  • Более простое обслуживание. Если бизнес-политика меняется, вам нужно изменить только соответствующую триггерную программу вместо каждой прикладной программы.
  • Улучшить производительность в среде клиент / сервер. Все правила запускаются на сервере до возврата результата.

Реализация триггеров SQL основана на стандарте SQL. Он поддерживает конструкции, которые являются общими для большинства языков программирования. Он поддерживает объявление локальных переменных, операторы для управления потоком процедуры, присвоение результатов выражений переменным и обработку ошибок.

Триггеры MySQL

Мы предполагаем, что вы привыкли к «хранимым процедурам MySQL», в противном случае вы можете прочитать наше руководство по процедурам MySQL . Вы можете использовать следующие операторы процедуры MySQL в триггерах:

Как создать триггеры MySQL?

Триггер - это именованный объект базы данных, связанный с таблицей, и он активируется, когда для таблицы происходит определенное событие (например, вставка, обновление или удаление). Оператор CREATE TRIGGER создает новый триггер в MySQL. Вот синтаксис:

Синтаксис:

 СОЗДАЙТЕ     
[DEFINER = {пользователь | ТЕКУЩИЙ ПОЛЬЗОВАТЕЛЬ }]     
Триггер триггерное имя     
trigger_time trigger_event     
ON tbl_name ДЛЯ КАЖДОГО РЯДА     
trigger_body
trigger_time: {BEFORE | ПОСЛЕ } 
trigger_event: {INSERT | ОБНОВЛЕНИЕ | УДАЛЯТЬ }

Объяснение:

Предложение DEFINER. Предложение DEFINER указывает учетную запись MySQL, которая будет использоваться при проверке прав доступа во время активации триггера. Если задано пользовательское значение, это должна быть учетная запись MySQL, указанная как 'user_name' @ 'host_name' (тот же формат, который используется в операторе GRANT), CURRENT_USER или CURRENT_USER ().
Значением DEFINER по умолчанию является пользователь, который выполняет инструкцию CREATE TRIGGER. Это то же самое, что и явное указание DEFINER = CURRENT_USER.
Если вы укажете предложение DEFINER, эти правила определяют допустимые значения пользователя DEFINER:

  • Если у вас нет привилегии SUPER, единственным допустимым значением пользователя является ваша собственная учетная запись, указанная буквально или с помощью CURRENT_USER. Вы не можете установить определитель для какой-либо другой учетной записи.
  • Если у вас есть привилегия SUPER, вы можете указать любое синтаксически допустимое имя учетной записи. Если учетная запись на самом деле не существует, генерируется предупреждение.
  • Хотя можно создать триггер с несуществующей учетной записью DEFINER, не рекомендуется активировать такие триггеры до тех пор, пока эта учетная запись на самом деле не существует. В противном случае поведение в отношении проверки привилегий не определено.

trigger_name: все триггеры должны иметь уникальные имена в схеме. Триггеры в разных схемах могут иметь одинаковые имена.

trigger_time: trigger_time - время действия триггера. Это может быть ДО или ПОСЛЕ, чтобы указать, что триггер активируется до или после каждой строки, подлежащей изменению.

trigger_event: trigger_event указывает тип операции, которая активирует триггер. Эти значения trigger_event разрешены:

  • Триггер активируется всякий раз, когда в таблицу вставляется новая строка; например, через операторы INSERT, LOAD DATA и REPLACE.
  • Триггер активируется всякий раз, когда строка изменяется; например, с помощью операторов UPDATE.
  • Триггер активируется всякий раз, когда строка удаляется из таблицы; например, через операторы DELETE и REPLACE. Операторы DROP TABLE и TRUNCATE TABLE в таблице не активируют этот триггер, поскольку они не используют DELETE. Удаление раздела также не активирует триггеры DELETE.

tbl_name: триггер становится связанным с таблицей с именем tbl_name, которая должна ссылаться на постоянную таблицу. Вы не можете связать триггер с таблицей TEMPORARY или представлением.

trigger_body: trigger_body - это оператор, который выполняется при активации триггера. Для выполнения нескольких операторов используйте конструкцию составного оператора BEGIN ... END. Это также позволяет вам использовать те же операторы, которые допустимы в хранимых подпрограммах.

Вот простой пример:

 mysql> CREATE TRIGGER ins_sum ДО ВСТАВКИ НА УЧЕТНУЮ
    -> ДЛЯ КАЖДОЙ СТРОКИ SET @sum = @sum + NEW.amount;
Запрос в порядке, затронуто 0 строк (0,06 с)

В приведенном выше примере есть новое ключевое слово « NEW », которое является расширением MySQL для триггеров. Существует два расширения MySQL для триггеров « OLD » и « NEW ». СТАРЫЙ и НОВЫЙ не чувствительны к регистру.

  • В теле триггера ключевые слова OLD и NEW позволяют получить доступ к столбцам в строках, затронутых триггером.
  • В триггере INSERT можно использовать только NEW.col_name.
  • В триггере UPDATE вы можете использовать OLD.col_name для ссылки на столбцы строки перед ее обновлением и NEW.col_name для ссылки на столбцы строки после ее обновления.
  • В триггере DELETE может использоваться только OLD.col_name; нового ряда нет

Столбец с именем OLD доступен только для чтения. Вы можете ссылаться на него (если у вас есть привилегия SELECT), но не можете изменять его. Вы можете ссылаться на столбец с именем NEW, если у вас есть привилегия SELECT для него. В триггере BEFORE вы также можете изменить его значение с помощью SET NEW.col_name = value, если у вас есть привилегия UPDATE для него. Это означает, что вы можете использовать триггер для изменения значений, которые будут вставлены в новую строку или использованы для обновления строки. (Такой оператор SET не действует в триггере AFTER, поскольку изменение строки уже произошло.)

Пример базы данных, таблица, структура таблицы, записи таблицы для различных примеров

Название базы данных: час
Имя хоста: localhost
Пользователь базы данных: root
Пароль : ' '

Структура таблицы: emp_details


Записи таблицы (по некоторым полям): emp_details

 mysql> ВЫБРАТЬ EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, SALARY, COMMISSION_PCT FROM emp_details; 
+ ------------- + ------------ + ----------- + --------- + ---------- + ---------------- + | EMPLOYEE_ID | FIRST_NAME | LAST_NAME | JOB_ID | Заработная плата | COMMISSION_PCT | + ------------- + ------------ + ----------- + --------- + ---------- + ---------------- + | 100 | Стивен | Король | AD_PRES | 24000,00 | 0.10 | | 101 | Нина | Коххар | AD_VP | 17000,00 | 0,50 | | 102 | Лекс | Де Хаан | AD_VP | 17000,00 | 0,50 | | 103 | Александр | Hunold | IT_PROG | 9000,00 | 0,25 | | 104 | Брюс | Эрнст | IT_PROG | 6000,00 | 0,25 | | 105 | Дэвид | Остин | IT_PROG | 4800,00 | 0,25 | + ------------- + ------------ + ----------- + --------- + ---------- + ---------------- +
6 рядов в наборе (0,00 сек)

Инструмент для создания триггеров MySQL

Вы можете написать процедуру в инструменте командной строки MySQL или использовать MySQL Workbench, который является отличным интерфейсным инструментом (здесь мы использовали версию 5.3 CE).

Инструмент командной строки MySQL: -

Выберите команду MySQL Client из меню «Пуск»:

«MySQL

При выборе командной строки MySQL появится следующий экран:

«mysql5.6

После успешного входа в систему вы можете получить доступ к командной строке MySQL:

«mysql5.6

Теперь вы можете написать свой собственный триггер для конкретной таблицы, см. Следующий пример:

«MySQL

MySQL верстак (5.3 CE): -

Выберите MySQL верстак из меню Пуск:

«MySQL

После выбора MySQL верстак появится следующий экран входа в систему:

«MySQL

Теперь введите данные для входа:

«MySQL

После успешного входа в систему появится новый экран и на панели браузера объектов выберите базу данных:

«MySQL

После выбора базы данных выберите таблицы:

«MySQL

Теперь щелкните правой кнопкой мыши emp_details, когда появится всплывающее окно, нажмите Alter Table :

«MySQL

При нажатии на «Изменить таблицу » появятся подробности emp_details:

«MySQL

Теперь нажмите на вкладку « Триггер » в предыдущем разделе, затем выберите «Время / событие». Это может быть ПОСЛЕ УДАЛИТЬ, ПОСЛЕ ВСТАВКИ, ПОСЛЕ ОБНОВЛЕНИЯ или ПЕРЕД УДАЛИТЬ, ПЕРЕД ВСТАВКОЙ ИЛИ ПЕРЕД ОБНОВЛЕНИЕМ. Давайте выберем AFTER INSERT, вы также заметите, что есть кнопка Add Trigger .

«MySQL

Нажав на кнопку « Добавить триггер», вы получите код по умолчанию для триггера в зависимости от выбора времени / события:

«MySQL

Название триггера: emp_details_AINS
Детали кода запуска по умолчанию:

 ИСПОЛЬЗУЙТЕ `hr`;
DELIMITER 
$$
CREATE TRIGGER `emp_details_AINS` 
ПОСЛЕ ВСТАВКИ 
ON emp_details ДЛЯ КАЖДОГО РЯДА
- Изменить код тела триггера под этой строкой. Не редактируйте строки выше этой 

После заполнения кода нажмите кнопку «Применить».

Примечание. Новый текст « Удалить триггер » появился в кнопке « Добавить триггер» . Нажав на это, вы можете удалить триггер.

Наконец, вы можете еще раз просмотреть скрипт, так как ошибки нет, нажмите кнопку « Применить» :

«MySQL

Это последнее окно перед финишем. Позвольте нажать на кнопку Готово .

«mysq

Если вы посмотрите на схему, вы увидите триггер emp_details_AINS под таблицей emp_details следующим образом:

«MySQL

Триггер MySQL: пример ПОСЛЕ ВСТАВКИ

В следующем примере у нас есть две таблицы: emp_details и log_emp_details. Чтобы вставить некоторую информацию в таблицу log_ emp_details (в которой есть три поля идентификатор сотрудника, зарплата и время редактирования) каждый раз, когда в таблицу emp_details входит INSERT, мы использовали следующий триггер:

 DELIMITER 
$$
USE `hr`
$$
СОЗДАЙТЕ 
DEFINER = `root` @` 127.0.0.1` 
TRIGGER `hr``emp_details_AINS` 
ПОСЛЕ ВСТАВКИ НА `hr` .emp_details`
ДЛЯ КАЖДОГО РЯДА
- Изменить код тела триггера под этой строкой. Не редактируйте строки выше этой
НАЧАТЬ 
INSERT INTO log_emp_details 
VALUES (NEW.employee_id, NEW.salary, NOW ());
END $$ 

Записи таблицы (по некоторым столбцам): emp_details

 mysql> ВЫБРАТЬ EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, SALARY, COMMISSION_PCT FROM emp_details;
+ ------------- + ------------ + ----------- + --------- + ---------- + ---------------- +
| EMPLOYEE_ID | FIRST_NAME | LAST_NAME | JOB_ID | Заработная плата | COMMISSION_PCT |
+ ------------- + ------------ + ----------- + --------- + ---------- + ---------------- +
| 100 | Стивен | Король | AD_PRES | 24000,00 | 0.10 |
| 101 | Нина | Коххар | AD_VP | 17000,00 | 0,50 |
| 102 | Лекс | Де Хаан | AD_VP | 17000,00 | 0,50 |
| 103 | Александр | Hunold | IT_PROG | 9000,00 | 0,25 |
| 104 | Брюс | Эрнст | IT_PROG | 6000,00 | 0,25 |
| 105 | Дэвид | Остин | IT_PROG | 4800,00 | 0,25 |
+ ------------- + ------------ + ----------- + --------- + ---------- + ---------------- +
6 рядов в наборе (0,00 сек) 

Записи таблицы (все столбцы): log_emp_details

 mysql> SELECT * FROM log_emp_details;
+ ------------- + ---------- + --------------------- +
| emp_details | Заработная плата | EDTTIME |
+ ------------- + ---------- + --------------------- +
| 100 | 24000,00 | 2011-01-15 00:00:00 |
| 101 | 17000,00 | 2010-01-12 00:00:00 |
| 102 | 17000,00 | 2010-09-22 00:00:00 |
| 103 | 9000,00 | 2011-06-21 00:00:00 |
| 104 | 6000,00 | 2012-07-05 00:00:00 |
| 105 | 4800,00 | 2011-06-21 00:00:00 |
+ ------------- + ---------- + --------------------- +
6 рядов в наборе (0,02 сек) 

Теперь вставьте одну запись в таблицу emp_details, посмотрите записи в таблицах emp_details и log_emp_details:

 mysql> INSERT INTO emp_details VALUES (236, 'RABI', 'CHANDRA', 'RABI', '590.423.45700', '2013-01-12', 'AD_VP', 15000, .5);
Запрос в порядке, затрагивается 1 строка (0,07 сек)
 mysql> ВЫБРАТЬ EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, SALARY, COMMISSION_PCT FROM emp_details;
+ ------------- + ------------ + ----------- + --------- + ---------- + ---------------- +
| EMPLOYEE_ID | FIRST_NAME | LAST_NAME | JOB_ID | Заработная плата | COMMISSION_PCT |
+ ------------- + ------------ + ----------- + --------- + ---------- + ---------------- +
| 100 | Стивен | Король | AD_PRES | 24000,00 | 0.10 |
| 101 | Нина | Коххар | AD_VP | 17000,00 | 0,50 |
| 102 | Лекс | Де Хаан | AD_VP | 17000,00 | 0,50 |
| 103 | Александр | Hunold | IT_PROG | 9000,00 | 0,25 |
| 104 | Брюс | Эрнст | IT_PROG | 6000,00 | 0,25 |
| 105 | Дэвид | Остин | IT_PROG | 4800,00 | 0,25 |
| 236 | РАБИ | ЧАНДРА | AD_VP | 15000,00 | 0,50 |
+ ------------- + ------------ + ----------- + --------- + ---------- + ---------------- +
7 рядов в наборе (0,00 сек)
 mysql> SELECT * FROM log_emp_details;
+ ------------- + ---------- + --------------------- +
| emp_details | Заработная плата | EDTTIME |
+ ------------- + ---------- + --------------------- +
| 100 | 24000,00 | 2011-01-15 00:00:00 |
| 101 | 17000,00 | 2010-01-12 00:00:00 |
| 102 | 17000,00 | 2010-09-22 00:00:00 |
| 103 | 9000,00 | 2011-06-21 00:00:00 |
| 104 | 6000,00 | 2012-07-05 00:00:00 |
| 105 | 4800,00 | 2011-06-21 00:00:00 |
| 236 | 15000,00 | 2013-07-15 16:52:24 |
+ ------------- + ---------- + --------------------- +
7 рядов в наборе (0,00 сек) 

MySQL Trigger: пример перед вставкой

В следующем примере перед вставкой новой записи в таблицу emp_details триггер проверяет значение столбца FIRST_NAME, LAST_NAME, JOB_ID и
- Если есть пробелы перед или после FIRST_NAME, функция LAST_NAME, TRIM () удалит их.
- Значение JOB_ID будет преобразовано в верхний регистр функцией UPPER ().

Вот код триггера:

 ИСПОЛЬЗУЙТЕ `hr`;
DELIMITER 
$$
CREATE TRIGGER `emp_details_BINS` 
ДО ВСТАВКИ 
ON emp_details ДЛЯ КАЖДОГО РЯДА
- Изменить код тела триггера под этой строкой. Не редактируйте строки выше этой
НАЧАТЬ
SET NEW.FIRST_NAME = TRIM (NEW.FIRST_NAME);
SET NEW.LAST_NAME = TRIM (NEW.LAST_NAME);
SET NEW.JOB_ID = UPPER (NEW.JOB_ID); END;
$$ 
Теперь вставьте строку в таблицу emp_details (проверьте столбцы FIRST_NAME, LAST_NAME, JOB_ID):
 mysql> INSERT INTO emp_details VALUES (334, 'Ana', 'King', 'ANA', '690.432.45701', '2013-02-05', 'it_prog', 17000, .50); 
Запрос в порядке, затрагивается 1 строка (0,04 сек)

Теперь перечислите следующие поля emp_details:

 mysql> ВЫБРАТЬ EMPLOYEE_ID, FIRST_NAME, LAST_NAME, JOB_ID, SALARY, COMMISSION_PCT FROM emp_details;
+ ------------- + ------------ + ----------- + --------- + ---------- + ---------------- +
| EMPLOYEE_ID | FIRST_NAME | LAST_NAME | JOB_ID | Заработная плата | COMMISSION_PCT |
+ ------------- + ------------ + ----------- + --------- + ---------- + ---------------- +
| 100 | Стивен | Король | AD_PRES | 24000,00 | 0.10 |
| 101 | Нина | Коххар | AD_VP | 17000,00 | 0,50 |
| 102 | Лекс | Де Хаан | AD_VP | 17000,00 | 0,50 |
| 103 | Александр | Hunold | IT_PROG | 9000,00 | 0,25 |
| 104 | Брюс | Эрнст | IT_PROG | 6000,00 | 0,25 |
| 105 | Дэвид | Остин | IT_PROG | 4800,00 | 0,25 |
| 236 | РАБИ | ЧАНДРА | AD_VP | 15000,00 | 0,50 |
| 334 | Ана | Король | IT_PROG | 17000,00 | 0,50 |
+ ------------- + ------------ + ----------- + --------- + ---------- + ---------------- +
8 рядов в наборе (0,00 сек) 

Смотрите последний ряд:

FIRST_NAME -> «Ана» заменена на «Ана»
LAST_NAME -> «Король» изменен на «Король»
JOB_ID -> 'it_prog' изменено на 'IT_PROG'

MySQL Trigger: пример ПОСЛЕ ОБНОВЛЕНИЯ

У нас есть две таблицы student_mast и stu_log. student_mast имеет три столбца: STUDENT_ID, NAME, ST_CLASS. Таблица stu_log имеет два столбца user_id и описание.

 mysql> SELECT * FROM STUDENT_MAST;
+ ------------ + ------------------ + ---------- +
| STUDENT_ID | ИМЯ | ST_CLASS |
+ ------------ + ------------------ + ---------- +
| 1 | Стивен Кинг | 7 |
| 2 | Нина Кочхар | 8 |
| 3 | Лекс Де Хаан | 8 |
| 4 | Александр Хунольд | 10 |
+ ------------ + ------------------ + ---------- +
4 ряда в наборе (0,00 сек) 

Пусть мы продвинем всех учеников в следующем классе, т.е. 7 будет 8, 8 будет 9 и так далее. После обновления одной строки в таблице student_mast в таблицу stu_log будет вставлена новая строка, в которой мы будем хранить текущий идентификатор пользователя и небольшое описание текущего обновления. Вот код триггера:

 - Полный триггер 
Заявления DDL
- Примечание: разрешены только операторы CREATE TRIGGER
DELIMITER 
$$
ИСПОЛЬЗОВАНИЕ `test`
$$
СОЗДАЙТЕ 
DEFINER = `root` @` 127.0.0.1`
TRIGGER `test``student_mast_AUPD`
ПОСЛЕ ОБНОВЛЕНИЯ 
ON `test``student_mast`FOR EACH ROW
- Изменить код тела триггера под этой строкой. Не редактируйте строки выше этой
НАЧАТЬ
ВСТАВИТЬ в stu_log VALUES (user (), CONCAT ('Обновить запись ученика'),
         OLD.NAME, «Предыдущий класс:», OLD.ST_CLASS, «Настоящий класс»,
         NEW.st_class));
КОНЕЦ
$$ 

После обновления таблицы STUDENT_MAST:

 mysql> ОБНОВЛЕНИЕ STUDENT_MAST SET ST_CLASS = ST_CLASS + 1;
Запрос в порядке, 4 строки затронуты (0,20 с)
Строк совпало: 4  
Изменено: 4  
Предупреждения: 0 

Триггер покажет вам обновленные записи в «stu_log». Вот последняя позиция таблиц STUDENT_MAST и STU_LOG:

 mysql> SELECT * FROM STUDENT_MAST;
+ ------------ + ------------------ + ---------- +
| STUDENT_ID | ИМЯ | ST_CLASS |
+ ------------ + ------------------ + ---------- +
| 1 | Стивен Кинг | 8 |
| 2 | Нина Кочхар | 9 |
| 3 | Лекс Де Хаан | 9 |
| 4 | Александр Хунольд | 11 |
+ ------------ + ------------------ + ---------- +
4 строки в наборе (0,00 с) mysql> SELECT * FROM STU_LOG;
+ ---------------- + -------------------------------- ------------------------------------------- +
| user_id | описание |
+ ---------------- + -------------------------------- ------------------------------------------- +
| [электронная почта защищена] | Обновление студенческих записей Стивена Кинга Предыдущий класс: 7 Настоящий класс 8 |
| [электронная почта защищена] | Обновить студенческие записи Neena Kochhar Предыдущий класс: 8 Текущий класс 9 |
| [электронная почта защищена] | Обновить студенческие записи Lex De Haan Предыдущий класс: 8 Текущий класс 9 |
| [электронная почта защищена] | Обновить студенческие записи Александра Хунольда Предыдущий класс: 10 Настоящий класс 11 |
+ ---------------- + -------------------------------- ------------------------------------------- +
4 ряда в наборе (0,00 сек) 

MySQL Trigger: пример перед обновлением

У нас есть таблица student_marks с 10 столбцами и 4 строками. Данные есть только в столбцах STUDENT_ID и NAME.

 mysql> SELECT * FROM STUDENT_MARKS;
+ ------------ + ------------------ + ------ + ------ + --- --- + ------ + ------ + ------- + ----------- + ------- +
| STUDENT_ID | ИМЯ | SUB1 | SUB2 | SUB3 | SUB4 | SUB5 | ИТОГО | PER_MARKS | СОРТ |
+ ------------ + ------------------ + ------ + ------ + --- --- + ------ + ------ + ------- + ----------- + ------- +
| 1 | Стивен Кинг | 0 | 0 | 0 | 0 | 0 | 0 | 0,00 | |
| 2 | Нина Кочхар | 0 | 0 | 0 | 0 | 0 | 0 | 0,00 | |
| 3 | Лекс Де Хаан | 0 | 0 | 0 | 0 | 0 | 0 | 0,00 | |
| 4 | Александр Хунольд | 0 | 0 | 0 | 0 | 0 | 0 | 0,00 | |
+ ------------ + ------------------ + ------ + ------ + --- --- + ------ + ------ + ------- + ----------- + ------- +
4 ряда в наборе (0,00 сек) 

Теперь экзамен закончен, и мы получили все предметные оценки, теперь мы обновим таблицу, итоговые оценки по всем предметам, процент от общих оценок и оценки будет автоматически рассчитан. Для этого примера расчета принимаются следующие условия:

Общее количество баллов (будет храниться в столбце ВСЕГО): ВСЕГО = SUB1 + SUB2 + SUB3 + SUB4 + SUB5

Процент меток (будет храниться в столбце PER_MARKS): PER_MARKS = (TOTAL) / 5

Оценка (будет храниться столбец GRADE):
- Если PER_MARKS> = 90 -> «ОТЛИЧНО»
- Если PER_MARKS> = 75 И PER_MARKS <90 -> 'ОЧЕНЬ ХОРОШО'
- Если PER_MARKS> = 60 И PER_MARKS <75 -> «ХОРОШО»
- Если PER_MARKS> = 40 И PER_MARKS <60 -> «СРЕДНИЙ»
- Если PER_MARKS <40-> «НЕ РЕКЛАМНО»

Вот код:

 mysql> UPDATE STUDENT_MARKS SET SUB1 = 54, SUB2 = 69, SUB3 = 89, SUB4 = 87, SUB5 = 59, где STUDENT_ID = 1;
Запрос в порядке, затрагивается 1 строка (0,05 с)
Строк соответствует: 1  
Изменено: 1  
Предупреждения: 0 

Позвольте обновить оценки ученика:

 ИСПОЛЬЗУЙТЕ `test`;
DELIMITER 
$$
CREATE TRIGGER `student_marks_BUPD` 
ДО ОБНОВЛЕНИЯ 
ON student_marks ДЛЯ КАЖДОГО РЯДА
- Изменить код тела триггера под этой строкой. Не редактируйте строки выше этой
НАЧАТЬ 
SET NEW.TOTAL = NEW.SUB1 + NEW.SUB2 + NEW.SUB3 + NEW.SUB4 + NEW.SUB5; 
SET NEW.PER_MARKS = NEW.TOTAL/5;
ЕСЛИ NEW.PER_MARKS> = 90 ТО
SET NEW.GRADE = 'ОТЛИЧНО';
ELSEIF NEW.PER_MARKS> = 75 И NEW.PER_MARKS <90 затем
set new.grade = 'ОЧЕНЬ ХОРОШО'> = 60 И NEW.PER_MARKS <75 тогда
set new.grade = 'GOOD'> = 40 AND NEW.PER_MARKS <60 затем
set new.grade = 'AVERAGE'>

Теперь проверьте таблицу STUDENT_MARKS с обновленными данными. Триггер покажет вам обновленные записи в «stu_log».

 mysql> SELECT * FROM STUDENT_MARKS;
+ ------------ + ------------------ + ------ + ------ + --- --- + ------ + ------ + ------- + ----------- + ------- +
| STUDENT_ID | НАЗВАНИЕ
| SUB1 | SUB2 | SUB3 | SUB4 | SUB5 | ИТОГО | PER_MARKS | СОРТ | + ------------ + ------------------ + ------ + ------ + --- --- + ------ + ------ + ------- + ----------- + ------- + | 1 | Стивен Кинг | 54 | 69 | 89 | 87 | 59 | 358 | 71.60 | ХОРОШО | | 2 | Нина Кочхар | 0 | 0 | 0 | 0 | 0 | 0 | 0,00 | | | 3 | Лекс Де Хаан | 0 | 0 | 0 | 0 | 0 | 0 | 0,00 | | | 4 | Александр Хунольд | 0 | 0 | 0 | 0 | 0 | 0 | 0,00 | | + ------------ + ------------------ + ------ + ------ + --- --- + ------ + ------ + ------- + ----------- + ------- + 4 строки в наборе (0,00 сек) 

Триггер MySQL: пример ПОСЛЕ УДАЛЕНИЯ

В нашем примере «AFTER UPDATE» у нас было две таблицы student_mast и stu_log. student_mast состоит из трех столбцов STUDENT_ID, NAME, ST_CLASS и таблица stu_log имеет два столбца user_id и description. Мы хотим сохранить некоторую информацию в таблице stu_log после того, как в таблице student_mast произошла операция удаления. Вот триггер:

 ИСПОЛЬЗУЙТЕ `test`;
DELIMITER 
$$
CREATE TRIGGER `student_mast_ADEL` 
ПОСЛЕ УДАЛЕНИЯ НА student_mast ДЛЯ КАЖДОГО РЯДА
- Изменить код тела триггера под этой строкой. Не редактируйте строки выше этой
НАЧАТЬ
ВСТАВИТЬ в stu_log VALUES (user (), CONCAT ('Обновить запись ученика'),
         OLD.NAME, 'Clas:', OLD.ST_CLASS, '-> удалено', NOW ()));
КОНЕЦ;
$$ 

Позвольте удалить студента из STUDENT_MAST.

 mysql> DELETE FROM STUDENT_MAST WHERE STUDENT_ID = 1;
Запрос в порядке, затрагивается 1 строка (0,06 с) 

Вот последняя позиция таблиц STUDENT_MAST, STU_LOG:

 mysql> SELECT * FROM STUDENT_MAST;
+ ------------ + ------------------ + ---------- +
| STUDENT_ID | ИМЯ | ST_CLASS |
+ ------------ + ------------------ + ---------- +
| 2 | Нина Кочхар | 9 |
| 3 | Лекс Де Хаан | 9 |
| 4 | Александр Хунольд | 11 |
+ ------------ + ------------------ + ---------- +
3 ряда в наборе (0,00 сек)
mysql> SELECT * FROM STU_LOG;
+ ---------------- + -------------------------------- --------------------------------------------- +
| user_id | описание |
+ ---------------- + -------------------------------- --------------------------------------------- +
| [электронная почта защищена] | Обновить студенческий рекордСтевен Кинг Предыдущий класс: 7 Настоящий класс 8 |
| [электронная почта защищена] | Обновить студенческие записиНина Коххар Предыдущий класс: 8 Настоящий класс 9 |
| [электронная почта защищена] | Обновить студенческий рекордLex De Haan Предыдущий класс: 8 Настоящий класс 9 |
| [электронная почта защищена] | Обновить студенческие записиАлександр Хунольд Предыдущий класс: 10 Подарок 11 класс |
| [электронная почта защищена] | Обновление студенческого рекорда Стивена Кинга: 8-> Удалено 2013-07-16 15:35:30 |
+ ---------------- + -------------------------------- --------------------------------------------- +
5 рядов в наборе (0,00 сек) 

Как MySQL обрабатывает ошибки во время выполнения триггера?

  • В случае сбоя триггера BEFORE операция над соответствующей строкой не выполняется.
  • Триггер BEFORE активируется при попытке вставить или изменить строку независимо от того, была ли попытка впоследствии успешной.
  • Триггер AFTER выполняется только в том случае, если триггеры BEFORE выполнены и операция строки выполнена успешно.
  • Ошибка во время триггера BEFORE или AFTER приводит к сбою всего оператора, вызвавшего вызов триггера.
  • Для транзакционных таблиц сбой оператора должен вызывать откат всех изменений, выполненных оператором.

Удалить триггер MySQL

Чтобы удалить или уничтожить триггер, используйте оператор DROP TRIGGER. Вы должны указать имя схемы, если триггер не находится в схеме по умолчанию (текущей):

 DROP TRIGGER [ЕСЛИ СУЩЕСТВУЕТ ] [ имя_схемы .] Trigger_nam 

если вы удаляете таблицу, все триггеры для таблицы также удаляются.

Ссылка: руководство по MySQL 5.6

Предыдущая: Процедура MySQL
Далее: Транзакция MySQL

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code