У меня есть пользовательская таблица, в которой есть дочерние и родительские учетные записи.
Дочерние учетные записи обозначаются родительским идентификатором
Я создал хранимую процедуру, которая берет всю необходимую информацию и может успешно обновлять поля пользователя при запуске вручную, и для обновления указан конкретный идентификатор
Тогда у меня есть триггер, который может успешно получить дочерних пользователей, которых нужно обновить.
Проблема, однако, заключается в том, что когда я пытаюсь вызвать триггер, я получаю сообщение об ошибке
"Невозможно обновить таблицу 'userinfos' в сохраненной функции / триггере, поскольку она уже используется оператором, который вызвал эту сохраненную функцию / триггер"
Ниже приведен мой код, в котором я проверяю перед запуском хранимой процедуры, что запущенное ею обновление было сделано для родителя, а не для ребенка. Это означает, что если он запускается при дочернем обновлении, он не будет запускать хранимую процедуру и, следовательно, никогда не сможет застрять в цикле. (Обратите внимание, что ДО и ПОСЛЕ не работают)
CREATE TRIGGER `update_child_users` BEFORE UPDATE ON `abcd_virtuemart_userinfos`
FOR EACH ROW BEGIN
IF OLD.`primary_user_id` = NEW.`primary_user_id` AND (NEW.`primary_user_id` = 0 OR NEW.`primary_user_id` = '' OR NEW.`primary_user_id` IS NULL)
THEN
CALL sys.`update_child_user`(NEW.`company`, NEW.`last_name`, NEW.`first_name`, NEW.`middle_name`, NEW.`phone_1`, NEW.`phone_2`, NEW.`fax`, NEW.`address_1`, NEW.`address_2`, NEW.`city`, NEW.`virtuemart_state_id`, NEW.`virtuemart_country_id`, NEW.`zip`, NEW.`billing_email_address`, NEW.`virtuemart_user_id`);
END IF;
END
И хранимая процедура
DELIMITER $$
CREATE DEFINER=`~DEFINER HERE~`
PROCEDURE `update_child_user`(IN `n_company` VARCHAR(64), IN `n_last_name` VARCHAR(48), IN `n_first_name` VARCHAR(48), IN `n_middle_name` VARCHAR(48), IN `n_phone_1` VARCHAR(32), IN `n_phone_2` VARCHAR(32), IN `n_fax` VARCHAR(32), IN `n_address_1` VARCHAR(64), IN `n_address_2` VARCHAR(64), IN `n_city` VARCHAR(64), IN `n_virtuemart_state_id` SMALLINT(1), IN `n_virtuemart_country_id` VARCHAR(255), IN `n_zip` VARCHAR(32), IN `n_billing_email_address` VARCHAR(255), IN `n_virtuemart_user_id` INT(1))
MODIFIES SQL DATA
UPDATE `userinfos`
SET `company` = `n_company` ,
`last_name` = `n_last_name` ,
`first_name` = `n_first_name` ,
`middle_name` = `n_middle_name` ,
`phone_1` = `n_phone_1` ,
`phone_2` = `n_phone_2` ,
`fax` = `n_fax` ,
`address_1` = `n_address_1` ,
`address_2` = `n_address_2` ,
`city` = `n_city` ,
`virtuemart_state_id` = `n_virtuemart_state_id` ,
`virtuemart_country_id` = `n_virtuemart_country_id` ,
`zip` = `n_zip` ,
`billing_email_address` = `n_billing_email_address`
WHERE `primary_user_id` = `n_virtuemart_user_id`
$$ delimiter ;
Так как же мне позволить, чтобы этот триггер был запущен рекурсивно, как есть другие, которые у меня нет, или я могу каким-то образом изменить свой синтаксис, который не вызывает триггер рекурсивной блокировки?