SQL Server触发器更新链接MySQL表数据问题求助
问题描述
本地SQL Server存在表tableA,包含字段userId、userNo(均为nvchar类型);通过链接服务器访问的MySQL存在表tableB,包含字段userid、userno(均为nvchar类型)。需求如下:
- 当
userId与userid匹配时,将tableB的userno更新为tableA的userNo - 在
tableA中创建触发器,实现当有数据新增时自动同步更新tableB
尝试多条SQL语句时,要么出现语法错误,要么无报错但执行后显示Affected Rows: 0,已确认两边对应字段数据完全一致,寻求解决办法。
初始尝试代码
SELECT userId FROM tableA AS a SELECT * FROM OPENQUERY(MYSQL_LINKED,'SELECT userid FROM tableB') AS b UPDATE OPENQUERY(MYSQL_LINKED, 'select userno from tableB') SET userno = userNo WHERE a = b
经@Patrick Hurst建议修改后的代码
UPDATE a SET a.userno = s._userNo FROM OPENQUERY(MYSQL_LINKED, 'SELECT * FROM gameacc.logintable WHERE userid = ''s._userId''') a INNER JOIN WORLDDB.GAME.USERINFO s ON a.userid = s._userId;
解决方案
1. 全量同步更新(解决0行影响问题)
修改后的代码失效原因是:OPENQUERY的远程子查询中直接引用了本地表的字段s._userId,远程MySQL无法识别该本地变量,导致筛选逻辑失效。正确的写法是将关联逻辑放在外部,不在远程查询中提前筛选:
UPDATE remote_b SET remote_b.userno = local_a.userNo FROM OPENQUERY(MYSQL_LINKED, 'SELECT userid, userno FROM tableB') AS remote_b INNER JOIN tableA AS local_a ON remote_b.userid = local_a.userId;
执行此语句即可完成匹配数据的全量同步。
2. 创建新增同步触发器
为tableA创建触发器,当有新数据插入时自动同步到tableB:
CREATE TRIGGER Trigger_SyncTableB_AfterInsert ON tableA AFTER INSERT AS BEGIN SET NOCOUNT ON; UPDATE remote_b SET remote_b.userno = inserted.userNo FROM OPENQUERY(MYSQL_LINKED, 'SELECT userid, userno FROM tableB') AS remote_b INNER JOIN inserted ON remote_b.userid = inserted.userId; END;
关键注意点
- 确认链接服务器
MYSQL_LINKED配置正确,拥有MySQL中tableB的读写权限 - 检查字段大小写:MySQL默认区分大小写,需确保
tableA.userId与tableB.userid的存储大小写完全一致,避免因大小写不匹配导致关联失败 - 先执行全量同步,再启用触发器,避免新增数据与历史数据出现同步断层
内容的提问来源于stack exchange,提问作者Chloe
相关产品推荐
相关产品推荐

