первый триггер mysql не работает - PullRequest
0 голосов
/ 04 мая 2009

Хорошо, я начал писать свой первый триггер в mysql, он не выдает ошибок, но и не работает ...

DELIMITER $$

DROP TRIGGER `cc`.`update_expires_date_trig`$$
CREATE TRIGGER `update_expires_date_trig` BEFORE INSERT ON `credit_test_acc` 
 FOR EACH ROW BEGIN
    UPDATE credit_test_acc SET date_expires_acc = DATE_ADD(CURDATE(), INTERVAL 6 MONTH) WHERE type_acc = 'init'
END;
$$
DELIMITER ;

У меня 2 проблемы:

  1. Невозможно обновить таблицу 'credit_test_acc' в сохраненной функции / триггере, поскольку она уже используется оператором, который вызвал эту сохраненную функцию / триггер.

  2. Является ли триггер, как определено, обновлять ПРОСТО ПРОСТО вставленную строку или КАЖДУЮ строку в базе данных?

Ответы [ 2 ]

1 голос
/ 04 мая 2009

Насколько я знаю, это должно быть переписано так, чтобы работать так, как вы ожидаете, что оно будет работать:

DELIMITER $$

DROP TRIGGER `cc`.`update_expires_date_trig`$$
CREATE TRIGGER `update_expires_date_trig` BEFORE INSERT ON `credit_test_acc` 
FOR EACH ROW BEGIN
   SET NEW.date_expires_acc = DATE_ADD(CURDATE(), INTERVAL 6 MONTH)
END;
$$
DELIMITER ;

Где NEW относится к строке, которая должна быть вставлена ​​в таблицу. Вы не дали никакого объяснения относительно того, какую роль может сыграть здесь type_acc (я могу придумать более чем один способ его интерпретации), поэтому я не учел этого. Если это то, что я думаю, вы можете применить это так:

IF NEW.type_acc = 'init' THEN # do whatever you want here
0 голосов
/ 15 апреля 2011

Триггер не может изменить таблицу, которая его сработала.
Прямо или косвенно.

Вы можете изменять значения в триггере BEFORE только на SET new.field = newvalue.
И это может повлиять только на «текущий» ряд, который нажал на курок (так сказать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...