多租户数据库存储过程语法错误:动态查询多库用户表失败
解决多租户数据库动态合并users表的语法错误
问题根源在于你的租户数据库名称包含连字符(如tenantxxxx-e6ca-4fe6-ae67-f88860cea33a),MySQL中这类含特殊字符的标识符必须用反引号(`)包裹,否则会被误解析为语法运算符,导致报错。
只需修改存储过程中拼接SQL的语句,给动态获取的数据库名添加反引号包裹即可解决。修改后的完整存储过程代码如下:
CREATE DEFINER=`root`@`%` PROCEDURE `getAllUsers`() DETERMINISTIC COMMENT 'test' BEGIN DECLARE queryString TEXT DEFAULT ''; DECLARE tenant_db_id VARCHAR(255) DEFAULT ''; DECLARE done INTEGER DEFAULT 0; DECLARE tenant_cursor CURSOR FOR SELECT DISTINCT (table_schema) FROM information_schema.tables WHERE table_schema LIKE 'tenant%'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN tenant_cursor; read_loop: LOOP FETCH tenant_cursor INTO tenant_db_id; IF done = 1 THEN LEAVE read_loop; END IF; IF queryString != '' THEN SET queryString = CONCAT(queryString, ' UNION ALL '); END IF; -- 给数据库名添加反引号包裹,处理含特殊字符的名称 SET queryString = CONCAT(queryString, ' SELECT * FROM `', tenant_db_id, '`.users'); END LOOP; CLOSE tenant_cursor; SET @qStr = queryString; PREPARE stmt FROM @qStr; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @qStr = NULL; END
执行修改后的存储过程,就能正确解析带连字符的租户数据库名,动态生成并执行UNION ALL语句,合并所有租户的users表数据。
内容的提问来源于stack exchange,提问作者alithedeveloper
相关产品推荐
相关产品推荐

