Как вызвать обновление дочерних записей при родительском обновлении в той же таблице - PullRequest
0 голосов
/ 01 мая 2018

У меня есть пользовательская таблица, в которой есть дочерние и родительские учетные записи. Дочерние учетные записи обозначаются родительским идентификатором

Я создал хранимую процедуру, которая берет всю необходимую информацию и может успешно обновлять поля пользователя при запуске вручную, и для обновления указан конкретный идентификатор

Тогда у меня есть триггер, который может успешно получить дочерних пользователей, которых нужно обновить. Проблема, однако, заключается в том, что когда я пытаюсь вызвать триггер, я получаю сообщение об ошибке

"Невозможно обновить таблицу '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 ;

Так как же мне позволить, чтобы этот триггер был запущен рекурсивно, как есть другие, которые у меня нет, или я могу каким-то образом изменить свой синтаксис, который не вызывает триггер рекурсивной блокировки?

...