запуск хранимой процедуры внутри триггера SQL - PullRequest
1 голос
/ 15 мая 2010

бизнес-логика в моем приложении требует, чтобы я вставлял строку в таблицу X, когда строка вставляется в таблицу Y. Кроме того, она должна делать это только в определенные моменты времени (для чего мне нужно запросить другую таблицу). Я решил запустить скрипт каждые 5 минут или около того, чтобы проверить это, но наткнулся на триггеры и подумал, что это может быть лучшим способом сделать это.

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

CREATE TRIGGER reservation_auto_reply
AFTER INSERT ON reservation
FOR EACH ROW
BEGIN
 IF NEW.sent_type = 1 /* In-App */
 THEN INSERT INTO `messagehistory` (`trip`, `fk`, `sent_time`, `status`, `message_type`, `message`) 
 VALUES (NEW.trip, NEW.psk, 'NOW()', 'submitted', 4, 'This is an automated reply to reservation');
END;

Я получаю сообщение об ошибке в части VALUES statmenet, но я не уверен, где. Мне все еще нужно запросить в другой таблице информацию, которая мне нужна, но я даже не могу пройти эту часть. Любая помощь приветствуется, включая ссылки на многие примеры. Спасибо

1 Ответ

2 голосов
/ 15 мая 2010

Я не знаю, что вы определили для типа данных reservation.sent_time, но я заметил, что вы помещаете функцию NOW() в кавычки, превращая ее в буквальную строку 'NOW()' вместо вызова функциичтобы получить текущее время.


Хорошо, вот еще две проблемы:

Во-первых, оператор IF в языке триггера MySQL требует END IF; после блока.

Во-вторых, вы используете DELIMITER?Например:

DELIMITER //

CREATE TRIGGER reservation_auto_reply
AFTER INSERT ON reservation
FOR EACH ROW
BEGIN
 IF NEW.sent_type = 1 /* In-App */
 THEN 
  INSERT INTO `messagehistory` (`trip`, `fk`, `sent_time`, `status`, `message_type`, `message`) 
  VALUES (NEW.trip, NEW.psk, NOW(), 'submitted', 4, 'This is an automated reply to reservation');
 END IF;
END//

DELIMITER ;

Это необходимо, поскольку клиент mysql позволяет запускать несколько операторов в интерактивном режиме или в сценарии SQL.Но это как-то глупо - он обрабатывает ввод как один оператор SQL, пока не достигнет терминатора оператора.Обычно терминатором является точка с запятой (;).

Но в вашем триггерном теле есть буквальная точка с запятой!Если клиент mysql останавливается на первой точке с запятой, он попытается определить ваш триггер с помощью неполного оператора.

Решение в клиенте mysql состоит в том, чтобы временно изменить терминатор оператора на другой символ или последовательность символов не появляется в вашем теле триггера.Например: //.

(Обратите внимание, что команда DELIMITER является встроенным клиентом mysql. Она не распознается, если вы выполняете динамические операторы SQL из своего приложения.)

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