91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SQL Server中怎么實時同步更新遠程數據庫

發布時間:2021-07-26 17:01:02 來源:億速云 閱讀:993 作者:Leah 欄目:數據庫

SQL Server中怎么實時同步更新遠程數據庫,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

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',nullexec sp_dropserver 'LNK_ServerB_DatabaseB','droplogins'

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

值得注意的是以上兩個存儲過程不能出現在觸發器代碼中,而是事先在服務器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的方式先進行該特性的安裝。

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

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

3. 數據庫字段text, ntext的處理

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

但是在觸發器中,inserted和deleted表都是不允許對text/ntext/image類型進行處理的,這里我們采用一個曲線救國的辦法,從數據庫中把記錄讀取到臨時表中,然后通過textptr和patindex函數和updatetext命令完成字符串替換處理

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

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=N'Cat'set @Count=0set @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

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

炉霍县| 多伦县| 广丰县| 策勒县| 和林格尔县| 军事| 合作市| 凤翔县| 阿坝县| 偃师市| 商河县| 旬邑县| 仙游县| 赤城县| 确山县| 道真| 岳阳市| 尼玛县| 汾阳市| 公安县| 怀仁县| 新蔡县| 宕昌县| 五原县| 扎鲁特旗| 安阳市| 博白县| 刚察县| 库车县| 华阴市| 出国| 安阳市| 汪清县| 庆云县| 双峰县| 娄底市| 五常市| 辛集市| 鹤山市| 花莲市| 陆良县|