校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁(yè) > 知識(shí)庫(kù) > SQL Server實(shí)時(shí)同步更新遠(yuǎn)程數(shù)據(jù)庫(kù)遇到的問(wèn)題小結(jié)

SQL Server實(shí)時(shí)同步更新遠(yuǎn)程數(shù)據(jù)庫(kù)遇到的問(wèn)題小結(jié)

熱門標(biāo)簽:千呼電銷機(jī)器人價(jià)格 京華物流公司地圖標(biāo)注 智能語(yǔ)音外呼系統(tǒng)選哪家 武漢長(zhǎng)沙外呼系統(tǒng)方法和技巧 奧威地圖標(biāo)注多個(gè)地方 百度地圖標(biāo)注不同路線 怎樣在地圖上標(biāo)注路線圖標(biāo) 外呼系統(tǒng)電銷專用 優(yōu)質(zhì)地圖標(biāo)注

工作中遇到這樣的情況,需要在更新表TableA(位于服務(wù)器ServerA 172.16.8.100中的庫(kù)DatabaseA)同時(shí)更新TableB(位于服務(wù)器ServerB 172.16.8.101中的庫(kù)DatabaseB)。

TableA與TableB結(jié)構(gòu)相同,但數(shù)據(jù)數(shù)量不一定相同,應(yīng)為有可能TableC也在更新TableB。由于數(shù)據(jù)更新不頻繁,為簡(jiǎn)單起見(jiàn)想到使用了觸發(fā)器Tirgger。記錄一下遇到的一些問(wèn)題:

1. 訪問(wèn)異地?cái)?shù)據(jù)庫(kù)

在ServerA 中創(chuàng)建指向ServerB的鏈接服務(wù)器,并做好賬號(hào)映射。addlinkedserver存儲(chǔ)過(guò)程創(chuàng)建一個(gè)鏈接服務(wù)器,參數(shù)詳情參見(jiàn)官方文檔。第1個(gè)參數(shù)LNK_ServerA是自定義的名稱;第2參數(shù)產(chǎn)品名稱,如果是SQL Server不用提供;第3個(gè)參數(shù)是驅(qū)動(dòng)類型;第4個(gè)參數(shù)是數(shù)據(jù)源,這里寫SQL Server服務(wù)器地址

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

配置鏈接服務(wù)器后,默認(rèn)使用同一本地賬號(hào)登陸遠(yuǎn)程數(shù)據(jù)庫(kù),如果賬號(hào)有不同,還需要進(jìn)行賬號(hào)映射。sp_addlinkedsrvlogin參數(shù)詳情參見(jiàn)官方文檔。第1個(gè)參數(shù)同上;第2個(gè)參數(shù)false即使用后面參數(shù)提供的用戶密碼登陸;第3個(gè)參數(shù)null使所有本地賬號(hào)都可以使用后面的用戶密碼來(lái)登陸鏈接服務(wù)器,如果第3個(gè)參數(shù)設(shè)置為一個(gè)本地SQL Server登陸用戶名,那么只有這個(gè)用戶才可以使用遠(yuǎn)程賬號(hào)登陸鏈接服務(wù)器;最后兩個(gè)是登錄遠(yuǎn)程服務(wù)器的用戶和密碼。

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

如果要?jiǎng)h除以上配置可以如下

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

上面的配置在SQL Server Management Studio管理器里Server Objects下LinkedServers可以查詢到,如果一切鏈接正常,可以直接打開(kāi)鏈接服務(wù)器上的庫(kù)表

值得注意的是以上兩個(gè)存儲(chǔ)過(guò)程不能出現(xiàn)在觸發(fā)器代碼中,而是事先在服務(wù)器ServerA中運(yùn)行完成配置,否則觸發(fā)器隱式事務(wù)的要求會(huì)報(bào)錯(cuò)“The procedure 'sys.sp_addlinkedserver' cannot be executed within a transaction.”

2. 配置分布式事務(wù)

SQL Server的觸發(fā)器是隱式使用事務(wù)的,鏈接服務(wù)器是遠(yuǎn)程服務(wù)器,需要在本地服務(wù)器和遠(yuǎn)程服務(wù)器之間開(kāi)啟分布式事務(wù)處理,否則會(huì)報(bào)“The partner transaction manager has disabled its support for remote/network transactions”的錯(cuò)誤。我在ServerA和ServerB中都開(kāi)啟分布式事務(wù)協(xié)調(diào)器,并進(jìn)行適當(dāng)配置,以支持分布式事務(wù)。ServerA和ServerB都是Windows Server 2012 R2,其他版本服務(wù)器類似。

(1)首先在Services.msc中確認(rèn)Distributed Transaction Coordinator已經(jīng)開(kāi)啟,其他版本的服務(wù)器不一定默認(rèn)安裝,需要安裝windows features的方式先進(jìn)行該特性的安裝。

(2)在服務(wù)器管理工具Administrative Tools中找到Component Services,在Local DTC中屬性Security選項(xiàng)卡中配置如下,打開(kāi)相關(guān)安全設(shè)置,完成后會(huì)重啟服務(wù),也有文檔稱需要重啟服務(wù)器,但是至少2012 R2不用。

(3)配置防火墻,Inbound和Outbound都打開(kāi)

3. 數(shù)據(jù)庫(kù)字段text, ntext的處理

業(yè)務(wù)中表TableA中有一個(gè)Content字段是text類型,同步到TableB時(shí)需要對(duì)內(nèi)容做一些替換處理。對(duì)于text類型是一個(gè)過(guò)時(shí)的類型,微軟官方建議用(N)VARCHAR(MAX)替換,可查閱這里。今后設(shè)計(jì)時(shí)可以考慮,這里我們考慮對(duì)text進(jìn)行處理。

但是在觸發(fā)器中,inserted和deleted表都是不允許對(duì)text/ntext/image類型進(jìn)行處理的,這里我們采用一個(gè)曲線救國(guó)的辦法,從數(shù)據(jù)庫(kù)中把記錄讀取到臨時(shí)表中,然后通過(guò)textptr和patindex函數(shù)和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>1
begin
 updatetext #temp_tablea.Content @p @postion @l @d
 select @postion=patindex('%'+@s+'%',Content)+1 from #temp_tablea
end

4. 執(zhí)行遠(yuǎn)程數(shù)據(jù)庫(kù)操作

當(dāng)配置鏈接服務(wù)器時(shí),我們可以直接訪問(wèn)遠(yuǎn)程數(shù)據(jù)庫(kù)表了,如下

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

但簡(jiǎn)陋的SQL編輯器往往會(huì)對(duì)語(yǔ)法報(bào)錯(cuò),另外為方便編程,我們希望通過(guò)exec sp_executesql的方式獲得更多的靈活性。其實(shí)exec就可以直接執(zhí)行sql語(yǔ)句,但如果有返回值就比較困難了。如下,從遠(yuǎn)程服務(wù)器上通過(guò)ID查詢表TableB后返回Name,sp_executesql存儲(chǔ)過(guò)程可以使用output關(guān)鍵字定義變量為返回變量,其中@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直接執(zhí)行sql語(yǔ)句,本質(zhì)上是執(zhí)行拼接后的sql字符串,有時(shí)將變量拼接進(jìn)字符串會(huì)困難的多(到底需要幾個(gè)單引號(hào)),而sp_executesql則清晰多了

declare @SQL nvarchar(500),@Name nvarchar(50),@Count int,@ID nvarchar(40)
set @Name=N'Cat'
set @Count=0
set @ID=N'{00000000-0000-0000-0000-000000000000}'
set @SQL=N'update TableA set Name='''+@Name+''', Count='+@Count+' where ID='''+@ID+''''
exec(@SQL)
set @SQL=N'update 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

以上所述是小編給大家介紹的SQL Server實(shí)時(shí)同步更新遠(yuǎn)程數(shù)據(jù)庫(kù)遇到的問(wèn)題小結(jié),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

您可能感興趣的文章:
  • SQL Server 出現(xiàn)Error: 1326錯(cuò)誤(管理器無(wú)法連接遠(yuǎn)程數(shù)據(jù)庫(kù))問(wèn)題解決方案
  • SQL server 2005將遠(yuǎn)程數(shù)據(jù)庫(kù)導(dǎo)入到本地的方法
  • SQLSERVER 本地查詢更新操作遠(yuǎn)程數(shù)據(jù)庫(kù)的代碼

標(biāo)簽:威海 天水 宿州 銅仁 來(lái)賓 七臺(tái)河 益陽(yáng) 防疫戰(zhàn)設(shè)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SQL Server實(shí)時(shí)同步更新遠(yuǎn)程數(shù)據(jù)庫(kù)遇到的問(wèn)題小結(jié)》,本文關(guān)鍵詞  SQL,Server,實(shí)時(shí),同步,更新,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《SQL Server實(shí)時(shí)同步更新遠(yuǎn)程數(shù)據(jù)庫(kù)遇到的問(wèn)題小結(jié)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于SQL Server實(shí)時(shí)同步更新遠(yuǎn)程數(shù)據(jù)庫(kù)遇到的問(wèn)題小結(jié)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 涡阳县| 沁水县| 且末县| 新巴尔虎左旗| 景宁| 准格尔旗| 肇东市| 抚顺县| 资兴市| 衡东县| 青阳县| 商河县| 临桂县| 海兴县| 理塘县| 和平区| 武川县| 广饶县| 汝阳县| 五家渠市| 睢宁县| 乐陵市| 高碑店市| 霍州市| 和龙市| 湖州市| 琼海市| 平顶山市| 武城县| 汽车| 防城港市| 祁阳县| 莱芜市| 临夏市| 普宁市| 濮阳县| 内丘县| 琼结县| 禄劝| 正安县| 汕头市|