阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

SQL Server实时同步更新远程数据库遇到的问题

367次阅读
没有评论

共计 3668 个字符,预计需要花费 10 分钟才能阅读完成。

工作中遇到这样的情况,需要在更新表 TableA(位于服务器 ServerA 172.16.8.100 中的库 DatabaseA)同时更新 TableB(位于服务器 ServerB 172.16.8.101 中的库 DatabaseB)。

TableA 与 TableB 结构相同,但数据数量不一定相同,应为有可能 TableC 也在更新 TableB。由于数据更新不频繁,为简单起见想到使用了触发器 Tirgger。记录一下遇到的一些问题:

1. 访问异地数据库

在 ServerA 中创建指向 ServerB 的链接服务器,并做好账号映射。addlinkedserver 存储过程创建一个链接服务器,参数详情参见官方文档。第 1 个参数 LNK_ServerA 是自定义的名称;第 2 参数产品名称,如果是 SQL Server 不用提供;第 3 个参数是驱动类型;第 4 个参数是数据源,这里写 SQL Server 服务器地址

exec sp_addlinkedserver 'LNK_ServerB_DatabaseB','','SQLNCLI','172.16.8.101'

配置链接服务器后,默认使用同一本地账号登陆远程数据库,如果账号有不同,还需要进行账号映射。sp_addlinkedsrvlogin 参数详情参见官方文档。第 1 个参数同上;第 2 个参数 false 即使用后面参数提供的用户密码登陆;第 3 个参数 null 使所有本地账号都可以使用后面的用户密码来登陆链接服务器,如果第 3 个参数设置为一个本地 SQL Server 登陆用户名,那么只有这个用户才可以使用远程账号登陆链接服务器;最后两个是登录远程服务器的用户和密码。

exec sp_addlinkedsrvlogin 'LNK_ServerB_DatabaseB','false',null,'user','password'

如果要删除以上配置可以如下

exec sp_droplinkedsrvlogin 'LNK_ServerB_DatabaseB',null
exec sp_dropserver 'LNK_ServerB_DatabaseB','droplogins'

上面的配置在 SQL Server Management Studio 管理器里 Server Objects 下 LinkedServers 可以查询到,如果一切链接正常,可以直接打开链接服务器上的库表

SQL Server 实时同步更新远程数据库遇到的问题

值得注意的是以上两个存储过程不能出现在触发器代码中,而是事先在服务器 ServerA 中运行完成配置,否则触发器隐式事务的要求会报错“The procedure ‘sys.sp_addlinkedserver’ cannot be executed within a transaction.”

2. 配置分布式事务

SQL Server 的触发器是隐式使用事务的,链接服务器是远程服务器,需要在本地服务器和远程服务器之间开启分布式事务处理,否则会报“The partner transaction manager has disabled its support for remote/network transactions”的错误。我在 ServerA 和 ServerB 中都开启分布式事务协调器,并进行适当配置,以支持分布式事务。ServerA 和 ServerB 都是 Windows Server 2012 R2,其他版本服务器类似。

(1)首先在 Services.msc 中确认 Distributed Transaction Coordinator 已经开启,其他版本的服务器不一定默认安装,需要安装 windows features 的方式先进行该特性的安装。

SQL Server 实时同步更新远程数据库遇到的问题

(2)在服务器管理工具 Administrative Tools 中找到 Component Services,在 Local DTC 中属性 Security 选项卡中配置如下,打开相关安全设置,完成后会重启服务,也有文档称需要重启服务器,但是至少 2012 R2 不用。

SQL Server 实时同步更新远程数据库遇到的问题

(3)配置防火墙,Inbound 和 Outbound 都打开

SQL Server 实时同步更新远程数据库遇到的问题

3. 数据库字段 text, ntext 的处理

业务中表 TableA 中有一个 Content 字段是 ntext 类型,同步到 TableB 时需要对内容做一些替换处理。对于 text 和 ntext 类型是一个过时的类型,微软官方建议用 (N)VARCHAR(MAX) 替换,可查阅这里。今后设计时可以考虑,这里我们考虑对 ntext 进行处理。

但是在触发器中,inserted 和 deleted 表都是不允许对 text/ntext/image 类型进行处理的,这里我们采用一个曲线救国的办法,从数据库中把记录读取到临时表中,然后通过 textptr 和 patindex 函数和 updatetext 命令完成字符串替换处理

if exists(select * from tempdb..sysobjects where id=object_id(tempdb..#temp_tablea))
   
drop table #temp_tablea
select * into #temp_tablea from TableA where ID = @ID
declare @s varchar(200),@d varchar(200)
select @s=/_target/,@d=/_replacement/
declare @p varbinary(16),@postion int,@l int
select @p=textptr(Content),@l=len(@s),@postion=patindex(%+@s+%,Content)1 from #temp_tablea
while @postion>0
begin
    updatetext #temp_tablea.Content @p @postion @l @d
    select @postion=patindex(%+@s+%,Content)1 from #temp_tablea
end

特别注意以上代码对于 text 类型处理中文时会出问题,由于 text 存储 non-unicode 的数据,patindex 会将中文字符解释为 1 个字符,而 updatetext 命令却将中文字符解释为 2 个字符。SQL Server 2005 以上版本可以这样做替换:

update #temp_tablea set Content=cast(replace(cast(Content as nvarchar(max)),@s,@d) as text)

4. 执行远程数据库操作

当配置链接服务器时,我们可以直接访问远程数据库表了,如下

insert into LNK_ServerB_DatabaseB.DatabaseB.dbo.TableB ...
update LNK_ServerB_DatabaseB.DatabaseB.dbo.TableB set ...

但简陋的 SQL 编辑器往往会对语法报错,另外为方便编程,我们希望通过 exec sp_executesql 的方式获得更多的灵活性。其实 exec 就可以直接执行 sql 语句,但如果有返回值就比较困难了。如下,从远程服务器上通过 ID 查询表 TableB 后返回 Name,sp_executesql 存储过程可以使用 output 关键字定义变量为返回变量,其中 @Name output 为返回变量,@ID 则是传入变量。

declare @sql nvarchar(500), @Name nvarchar(50),@ID nvarchar(40)
set @SQL=N'select @Name=Name from LNK_ServerB_DatabaseB.DatabaseB.dbo.TableB where ID=@ID'
exec sp_executesql @SQL,N'@Name nvarchar(50) output,@ID nvarchar(40)',@Name output,@ID

另外 exec 直接执行 sql 语句,本质上是执行拼接后的 sql 字符串,有时将变量拼接进字符串会困难的多(到底需要几个单引号),而 sp_executesql 则清晰多了

declare @SQL nvarchar(500),@Name nvarchar(50),@Count int,@ID nvarchar(40)
set @Name=NCat
set @Count=0
set @ID=N{00000000-0000-0000-0000-000000000000}
set @SQL=Nupdate TableA set Name=”’+@Name+”’, Count=+@Count+ where ID=”’+@ID+””
exec(@SQL)
set @SQL=Nupdate TableA set Name=@Name,Count=@Count where ID=@ID
exec sp_executesql @SQL, N@Name nvarchar(50),@Count int,@ID nvarchar(40),@Name,@Count,@ID

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-05/143670.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计3668字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7804887
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

  开源 MoneyPrinterTurbo 利用 AI 大模型,一键生成高清短视频! 在短视频内容...
这个开源软件130k的star数!让电脑轻松管理安卓手机的神器

这个开源软件130k的star数!让电脑轻松管理安卓手机的神器

这个开源软件 130k 的 star 数!让电脑轻松管理安卓手机的神器 大家好,我是星哥。今天给大家安利一款宝...
还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手! 前言 对于个人开发者、建站新手或是想搭建测试站点的从业者...
手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板 前言 大家好,我是星哥。星哥发现很多新手刚接触服务器时,都会被“选购...
星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛 NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手! 作为动漫爱好者,你是否还在为...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比 星哥玩云,带你从小白到上云高手。今天咱们就来聊聊——什...
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...
星哥带你玩飞牛NAS-7:手把手教你免费内网穿透-Cloudflare tunnel

星哥带你玩飞牛NAS-7:手把手教你免费内网穿透-Cloudflare tunnel

星哥带你玩飞牛 NAS-7:手把手教你免费内网穿透 -Cloudflare tunnel 前言 大家好,我是星...
零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face 免费服务器 +Docker 快速部署 HertzBeat 监控平台 ...
星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛 NAS-12:开源笔记的进化之路,效率玩家的新选择 前言 如何高效管理知识与笔记,已经成为技术...