2015-12-15 4 views
0

В книге «Библия администратора MySQL» авторы описывают некоторые ограничения в отношении сочетания событий, времени и ключевых слов NEW и OLD в триггерах. Что они скажут:Ограничения относительно NEW и OLD в MySQL триггерах

-BREEN INSERT: NEW поддерживается ПЕРЕД ВСТАВКОЙ. BEFORE не поддерживает OLD.

-AFTER INSERT: ПОСЛЕ не поддерживает NEW. Не имеет смысла использовать OLD с AFTER INSERT.

-BREEN UPDATE: NEW поддерживается ПЕРЕД ОБНОВЛЕНИЕМ. BEFORE не поддерживает OLD.

-AFTER ОБНОВЛЕНИЕ: ПОСЛЕ не поддерживает NEW. ПОСЛЕ ОБНОВЛЕНИЯ поддерживает OLD.

-УДАЧАТЬ: Не имеет смысла использовать NEW с ПРЕЖДЕ ЧЕМ УДАЛИТЬ. BEFORE не поддерживает OLD.

-AFTER DELETE: ПОСЛЕ не поддерживает NEW. OLD поддерживается AFTER DELETE.

То есть, согласно книге, например, я не могу использовать NEW, когда использую ПОСЛЕ. Однако в следующем триггере это именно то, что я делаю. Если какой-либо новый сотрудник вставлен, я сохраняю этого сотрудника в резервной таблице, называемой employee_history.

CREATE TRIGGER insert_emplyee_history 
AFTER INSERT ON EMPLOYEE 
FOR EACH ROW 
INSERT INTO EMPLOYEE_HISTORY VALUES (NEW.NOME,NEW.SSN,NEW.SALARIO,NEW.DNO); 

Этот триггер работает как ожидается в MySQL 5.7.

Является ли книга неправильной? Возможно, эти ограничения были изменены в последних версиях (5.7).

Я хотел бы знать, какие ограничения связаны с комбинациями событий, времени и OLD и NEW.

+0

Учитывая, какие инструменты используются для многих, это не имеет смысла. Я думаю, что после раздела вставки есть опечатка, хотя они говорят о том, как она не поддерживает и старое. Это имеет смысл только для того, чтобы иметь новые значения, потому что те, которые вы вкладываете, и не будет старых значений, потому что запись является новой.Триггеры обновлений должны иметь как старые, так и новые, потому что иногда вам нужно записывать оба набора значений для целей аудита. Удалить может иметь только старые значения, потому что это существующая запись, которая отбрасывается, поэтому нет новой информации, кроме нулей/ – HLGEM

+0

Благодарим вас за комментарии. – Zaratruta

ответ

2

Несколько пунктов упоминается в документации:

19.3.1 Trigger Syntax and Examples

  • В триггер INSERT, только NEW.col_name могут быть использованы; нет старого ряда.

  • (Такое SET утверждение не имеет никакого эффекта в ПОСЛЕ триггера, так как изменение строки будет иметь уже произошло.)

Это вполне допустимо использовать NEW в AFTER , но недействительно SET NEW... := ...;

DELIMITER // 

CREATE TRIGGER `insert_emplyee_history` AFTER INSERT ON `EMPLOYEE` 
FOR EACH ROW 
BEGIN 
    INSERT INTO `EMPLOYEE_HISTORY` 
    VALUES 
    (NEW.`NOME`, NEW.`SSN`, NEW.`SALARIO`, NEW.`DNO`); 
    -- SET NEW.`NOME` := 'NOME' -- NOT VALID IN AFTER 
END// 

DELIMITER ; 

SQL Fiddle demo

+0

Да ... Действительно. Ты прав. Спасибо за уточнение. – Zaratruta

Смежные вопросы