首页 > 解决方案 > 如何在同一表中的父更新上触发更新子记录

问题描述

我有一个用户表,其中包含子用户帐户和父用户帐户。子帐户由父 ID 字段指示

我创建了一个存储过程,它获取所有必要的信息,并且可以在手动运行时成功更新用户的字段并给出特定的 ID 进行更新

然后我有一个触发器,可以成功获取它需要更新的子用户。但是,问题是当我尝试让触发器调用该过程时,我得到了错误

“无法更新存储函数/触发器中的表‘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 ;

那么我如何才能让这个触发器能够递归运行,因为还有其他我没有,或者我可以以某种方式更改我的语法,不会触发递归阻塞触发器?

标签: mysqlstored-procedurestriggerssql-update

解决方案


推荐阅读