mysql - 如何在同一表中的父更新上触发更新子记录
问题描述
我有一个用户表,其中包含子用户帐户和父用户帐户。子帐户由父 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 ;
那么我如何才能让这个触发器能够递归运行,因为还有其他我没有,或者我可以以某种方式更改我的语法,不会触发递归阻塞触发器?
解决方案
推荐阅读
- typescript - 为什么这个打字稿重载示例不起作用
- java - 有什么比从 modbus 串口读取数据、关闭或保持连接打开更好的方法
- bash - 在匹配字典中包含的值的模式后检索整个字典的脚本
- database - PowerBI (DAX) - Countif 包含列值(千行)
- javascript - 我想在 id=twork 中显示添加文本框 id=ttlpw 和 id=tplpw。但它不起作用
- java - 在没有运行 JBoss 实例的情况下使用 Weld 模拟类
- android - 如何将 java 客户端连接到在 android 中运行的 gRPC 服务器?
- .net - 如何使用已经转义的路径段指定新的 Uri 实例?
- stripe-payments - 更新订阅时的 SCA 身份验证
- optimization - 如何有效地优化折叠方法中的其他指标?