Триггер MySQL для проверки после вставки, если нет дубликатов, затем запустите sys_exec udf

Версия MySQL: 5.1.73 Версия клиента базы данных: libmysql - 5.1.73

Я пытаюсь проверить, существует ли NEW.src за последний час, и если нет, то выполнить sys_exec udf.

У меня есть следующий триггер в mysql. Поскольку это триггер после вставки, мое условие IF проверяет, есть ли только одно значение за последний час, а затем переходит к оператору sys_exec.

BEGIN
SET @numofcalls = (SELECT count(src) FROM `cdr` WHERE calldate >= DATE_SUB(NOW(),INTERVAL 1 HOUR) AND src = NEW.src);
IF (numofcalls = 1) then
SET @missed_call = sys_exec(CONCAT('/usr/bin/php /var/lib/asterisk/agi-bin/api_pbx/call_api.php ', NEW.src));
END IF;
END

Я не получаю синтаксической ошибки при сохранении триггера. Когда вставляется новая запись, оператор sys_exec не запускается и выходит из условия IF.

Может кто-нибудь предложить, что я делаю неправильно здесь.


person Vinod Chandrasekar    schedule 25.09.2017    source источник
comment
Если за последний час не было дубликатов для NEW.src, значит, вы используете sys_exec udf. поэтому ваше условие if должно быть numofcalls = 0 вместо numofcalls = 1. Также вам нужно проверить, присутствует ли ваш udf или нет, используя приведенный ниже запрос SELECT name FROM mysql.proc WHERE name = 'my_name'.   -  person Bhushan    schedule 25.09.2017
comment
Во-первых, поскольку это триггер после вставки, данные уже должны быть там. Следовательно, значение условия if равно 1. Во-вторых, udf работает без условия if или запроса на выборку, работая непосредственно с триггером после вставки.   -  person Vinod Chandrasekar    schedule 28.09.2017
comment
В Вашем условии если условие IF (количество вызовов = 1), тогда. Я думаю, что это должно быть IF (@numofcalls = 1). Тогда я думаю, что ваш код в порядке.   -  person Bhushan    schedule 28.09.2017


Ответы (1)


Я рекомендую вам не запускать php-программы из триггера MySQL.

Причины:

  • При запуске триггера (даже после триггера) вставка не была зафиксирована в базе данных. Если ваш PHP-скрипт попытается запросить базу данных, он не сможет увидеть незафиксированные данные. Кроме того, вставку можно откатить, а телефонный звонок откатить нельзя.
  • Вы не можете проверить ошибки или выйти из PHP-скрипта. Трудно отладить, был ли PHP-скрипт успешным или нет.

Вместо этого я рекомендую вам не использовать триггер, а вставить данные и зафиксировать транзакцию, а ЗАТЕМ использовать код приложения, чтобы проверить, следует ли запускать вызов, а затем выполнять его из вашего приложения. Другими словами, не выполняйте код, действие которого находится за пределами базы данных.

person Bill Karwin    schedule 25.09.2017
comment
Я не делаю никаких транзакций с базой данных mysql из моего php-скрипта во всем потоке. - person Vinod Chandrasekar; 28.09.2017
comment
Вы всегда выполняете транзакцию, даже если это автофиксация. Тем не менее, если вы запустите внешнюю программу из триггера, и эта программа попытается запросить строку, вставка которой породила триггер, эта строка не будет видна. Попробуй. - person Bill Karwin; 28.09.2017