伙伴云客服论坛»论坛 S区 S产品资讯 查看内容

0 评论

0 收藏

分享

将saas库信息同步到中心库

在公司借调到另一个saas产品组,发现中心库和saas库中数据设计反复,且数据内容不一致,bug上来了。此时,开端同步saas库中的内容到中心库吧。
数据库使用的mysql,只要写存储过程了。
同步内容:商户的Logo信息。
同步逻辑:对每个saas库生成一条update语句,然后复制出来,在中心库中执行。

delimiter $$
drop PROCEDURE if EXISTS SyncStoreLogo;
CREATE PROCEDURE SyncStoreLogo()
BEGIN
DECLARE t_sql text; --更新中心库的sql语句很长,使用text类型
DECLARE ts VARCHAR(100);
DECLARE SLogo VARCHAR(100);
DECLARE SCode VARCHAR(100);
DECLARE SCount int;
DECLARE l_sql VARCHAR(4000);
--根据saas库名的规则,找到所有相关库,使用游标逐个库生成更新语句
declare done int default false;
DECLARE tcur CURSOR for SELECT table_schema from information_schema.`TABLES` where table_name ='e_store' and table_schema like 'entERPrisedb%';

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
SELECT '' into t_sql;
open tcur;
read_loop:loop
FETCH tcur into ts;
--因为saas库中的数据存在历史错误,假设商户表中没有数据,就不更新
set l_sql=CONCAT('select count(1) into @SCount from ',ts,'.e_store;');
SET @sql=l_sql;
PREPARE s1 FROM @sql;
EXECUTE s1;
DEALLOCATE PREPARE s1;

if @SCount>0 then
SET l_sql=CONCAT('select Logo,Code into @SLogo,@SCode from ',ts,'.e_store;');--要更新的Logo字段值
SET @sql=l_sql;

PREPARE s1 FROM @sql;
EXECUTE s1;
DEALLOCATE PREPARE s1;
--生成更新语句
if @SLogo is not null then
SELECT CONCAT(t_sql,"update c_store set Logo=\'",@SLogo,"\' where  (Logo='' or Logo is null) and Code=",@SCode,';') into t_sql;
end if;
end if;

IF done THEN
leave read_loop;
END IF;
END LOOP;

CLOSE tcur;

SELECT t_sql;
END$$

call SyncStoreLogo();

回复

举报 使用道具

相关帖子
全部回复
暂无回帖,快来参与回复吧
本版积分规则 高级模式
B Color Image Link Quote Code Smilies

心事死在
注册会员
主题 22
回复 17
粉丝 0
|网站地图
快速回复 返回顶部 返回列表