日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Transactional Replication2:在Subscriber中,主键列是只读的

發(fā)布時(shí)間:2024/8/22 编程问答 34 如意码农
生活随笔 收集整理的這篇文章主要介紹了 Transactional Replication2:在Subscriber中,主键列是只读的 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在使用Transactional Replication時(shí),Subscriber 被認(rèn)為是“Read-Only”的 , All data at the Subscriber is “read-only” (transactional replication does not enforce this at the Subscriber),實(shí)際上,除了主鍵列,其他字段是可以修改的。但是不能更新Subscriber數(shù)據(jù)的主鍵,否則,某些數(shù)據(jù)更新操作會(huì)失敗。

一,事務(wù)復(fù)制中修改是如何傳遞的

在Transactional Replication中,默認(rèn)情況下,調(diào)用系統(tǒng)自動(dòng)生成的存儲(chǔ)過程來更新(delete,update,insert)訂閱服務(wù)器的數(shù)據(jù)。

默認(rèn)情況下,事務(wù)復(fù)制通過每個(gè)訂閱服務(wù)器上的一組存儲(chǔ)過程把更改同步到訂閱服務(wù)器。 當(dāng)在發(fā)布服務(wù)器上的表上發(fā)生插入,更新或刪除操作時(shí),該操作將轉(zhuǎn)換為對(duì)訂閱服務(wù)器上的存儲(chǔ)過程的調(diào)用。 存儲(chǔ)過程接受映射到表中列的參數(shù),從而更新在訂閱服務(wù)器上上的列。

二,使用參數(shù)化的存儲(chǔ)過程更新數(shù)據(jù)

對(duì)于表來說,默認(rèn)情況下,會(huì)創(chuàng)建三個(gè)存儲(chǔ)過程:

  • sp_MSins_< tablename >,用于處理數(shù)據(jù)插入

  • sp_MSupd_< tablename >,用于處理Update命令

  • sp_MSdel_< tablename >,用于處理數(shù)據(jù)刪除

例如,在Programmability catalog下,有三個(gè)sp,分別是:dbo.sp_MSdel_dbodt_study,dbo.sp_MSins_dbodt_study,dbo.sp_MSupd_dbodt_study,用以對(duì)subscriber端的 dbo.dt_sutdy進(jìn)行delete,insert和update 操作,這三個(gè)sp每次執(zhí)行時(shí)必須保證update,insert或update的數(shù)據(jù)行數(shù)是1,如果更新的記錄數(shù)量不是1,那么Replication報(bào)錯(cuò)。用于Publication的Table必須創(chuàng)建PK,PK起到唯一標(biāo)識(shí)一條記錄的作用。

1,查看 dbo.sp_MSdel_dbodt_study 的源代碼

刪除數(shù)據(jù)時(shí) 使用主鍵列作為Delete 命令的過濾條件(Filter condition),保證只刪除一條記錄,如果刪除的數(shù)據(jù)行數(shù)為0,則報(bào)錯(cuò)。

ALTER procedure [dbo].[sp_MSdel_dbodt_study]
@pkc1 int
as
begin
delete [dbo].[dt_study]
where [id] = @pkc1
if @@rowcount = 0
if @@microsoftversion>0x07320000
exec sp_MSreplraiserror 20598
end

示例分析,在Publisher端有如下數(shù)據(jù)

如果在Publisher端使用如下腳本,刪除所有的4個(gè)記錄

delete dbo.dt_study_publication

那么在Subscriber端,等價(jià)的操作是在一個(gè)transaction中調(diào)用4次dbo.sp_MSdel_dbodt_study,如果在Subscriber端,數(shù)據(jù)有丟失,比如,PKColumn=4 的Record不存在,那么則會(huì)導(dǎo)致整個(gè)transactino失敗,導(dǎo)致數(shù)據(jù)同步失敗。

set XACT_ABORT on

begin tran
exec dbo.sp_MSdel_dbodt_study @pkc1=1
exec dbo.sp_MSdel_dbodt_study @pkc1=2
exec dbo.sp_MSdel_dbodt_study @pkc1=3
exec dbo.sp_MSdel_dbodt_study @pkc1=4
commit
set XACT_ABORT off

2,查看dbo.sp_MSupd_dbodt_study的源代碼

使用@bitmap參數(shù)check是否更新主鍵,@pkc1 是主鍵列的值。更新數(shù)據(jù)使用主鍵列作為update命令的Filter condition,保證每次只更新一條記錄,如果更新的數(shù)據(jù)行數(shù)為0,則報(bào)錯(cuò)。

ALTER procedure [dbo].[sp_MSupd_dbodt_study]
@c1 int = NULL,
@c2 nvarchar(50) = NULL,
@c3 bit = NULL,
@pkc1 int = NULL,
@bitmap binary(1)
as
begin
if (substring(@bitmap,1,1) & 1 = 1)
begin update [dbo].[dt_study] set
[id] = case substring(@bitmap,1,1) & 1 when 1 then @c1 else [id] end,
[name] = case substring(@bitmap,1,1) & 2 when 2 then @c2 else [name] end,
[sex] = case substring(@bitmap,1,1) & 4 when 4 then @c3 else [sex] end
where [id] = @pkc1
if @@rowcount = 0
if @@microsoftversion>0x07320000
exec sp_MSreplraiserror 20598
end
else
begin update [dbo].[dt_study] set
[name] = case substring(@bitmap,1,1) & 2 when 2 then @c2 else [name] end,
[sex] = case substring(@bitmap,1,1) & 4 when 4 then @c3 else [sex] end
where [id] = @pkc1
if @@rowcount = 0
if @@microsoftversion>0x07320000
exec sp_MSreplraiserror 20598
end
end

4, 查看 [dbo].[sp_MSins_dbodt_study] 的源代碼

每次插入一條數(shù)據(jù),如果插入失敗,Insert 命令報(bào)錯(cuò)。

ALTER procedure [dbo].[sp_MSins_dbodt_study]
@c1 int,
@c2 nvarchar(50),
@c3 bit
as
begin
insert into [dbo].[dt_study](
[id],
[name],
[sex]
) values (
@c1,
@c2,
@c3 )
end

三,更新Subscriber端數(shù)據(jù)的非主鍵屬性

查看發(fā)布者和訂閱者中的表dt_study中的數(shù)據(jù):

step1, 在Publisher 端更新數(shù)據(jù)

update dbo.dt_study
set name='update5'
where id=5

在Subscriber端查看數(shù)據(jù)更新

step2,在Subscriber端update數(shù)據(jù)

update dbo.dt_study
set name='update6'
where id=5

step3,在Publisher 端更新數(shù)據(jù)

update dbo.dt_study
set name='update7'
where id=5

step4,在Subscriber端查看數(shù)據(jù)更新

可以看出,如果在Subscriber端對(duì)數(shù)據(jù)的非主鍵屬性進(jìn)行更新,那么不影響transaction replication同步數(shù)據(jù)。

四,更新Subscriber端數(shù)據(jù)的主鍵屬性

把訂閱者中的主鍵更新了,這回導(dǎo)致更新失敗。

1,把訂閱者中的主鍵刪除

在Subscriber端刪除ID=5的記錄

delete dbo.dt_study
where id=5

在Publisher 端刪除 dbo.dt_study 中ID>=5的所有記錄

delete dbo.dt_study
where id>=5

2,檢查復(fù)制的狀態(tài)

查看 Replication Monitor,在Distributor To Subscriber History Tab 發(fā)現(xiàn)Error Message:

The row was not found at the Subscriber when applying the replicated command. (Source: MSSQLServer, Error number: 20598)

3,WorkAround

在Subscriber 端中把缺失的Row 中的主鍵補(bǔ)上即可,非主鍵可以隨意賦值。

insert into dbo.dt_study
(ID,name,sex)
values(5,null,null)

4,Transaction 何時(shí)從Distribution database中移除?

對(duì)于執(zhí)行失敗Transaction和commands,Replication不會(huì)將其從Distribution database中移除,Distributor Agent 會(huì)多次重新執(zhí)行失敗的Transaction。

事務(wù)中的命令存儲(chǔ)在distribution數(shù)據(jù)庫(kù)中,直到被傳播到訂閱者,或者超過了分發(fā)留存的最大時(shí)間。

總結(jié)

以上是生活随笔為你收集整理的Transactional Replication2:在Subscriber中,主键列是只读的的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美在线视频第一页 | 精品国语对白 | 免费看一级黄色片 | 免费午夜人成电影 | 日韩精品一区二区三区在线观看 | www日韩视频| 牛牛澡牛牛爽一区二区 | 国产精品1区2区 | 男女男精品网站 | 精品久久久久一区二区国产 | 在线免费亚洲 | 国产sm调教视频 | 亚洲精品日日夜夜 | 女女互慰揉小黄文 | 美女被娇喘视频 | 看全色黄大色黄女片18 | 超碰caopeng | 人人爽人人插 | 精品久久久久久久久久久久久久久久久久 | 久久免费手机视频 | 裸体一区二区 | 色多多视频在线观看 | 久久免费的精品国产v∧ | 日韩毛片在线观看 | 免费看av在线 | 图片一区二区 | 亚洲精品乱码久久久久久久久久久久 | 精品久久久久久久无码 | 欧美一级片a| 久热在线 | 日韩少妇激情 | 免费不卡av | 日韩高清二区 | 三上悠亚 电影 | 国产福利99| 国产一级黄色大片 | 黄色99 | 456亚洲影院 | 综合亚洲网 | 91免费观看入口 | 亚洲免费黄网 | 欧美bbbbb | 婷婷亚洲五月 | 免费男女乱淫真视频免费播放 | 国产精品美女久久久久图片 | 国产视频观看 | 顶级尤物极品女神福利视频 | 乱子伦一区二区三区 | 精品一区日韩 | 日本一二三区在线视频 | 麻豆视频在线免费观看 | 国产色婷婷一区二区三区竹菊影视 | 91视频美女| 亚洲91精品 | ass亚洲熟妇毛耸耸pics | av一级久久 | 午夜片在线 | 成人在线亚洲 | 亚洲第一毛片 | 国产精品久久久久久久天堂 | 双性人bbww欧美双性 | 精品日本一区二区三区在线观看 | 精品免费一区 | 亚洲涩涩 | 欧美日本一区二区三区 | 人人干人 | 欧美激情在线狂野欧美精品 | 久久夜色av | 91华人在线 | 国产又黄又粗又猛又爽视频 | 最近最新中文字幕 | 三级一区二区 | 亚洲自拍偷拍图 | 99午夜| 汗汗视频 | 无毒黄色网址 | 华人色 | 一级美女大片 | 免费在线黄色网 | 日韩欧美国产视频 | 午夜大片| 91www在线观看 | 日本大尺度床戏揉捏胸 | 天天舔天天爱 | 奇米精品一区二区三区在线观看 | a片在线免费观看 | 91麻豆免费看 | 日本色一区 | 亚洲精品国产精品乱码不99热 | 自拍日韩亚洲一区在线 | 无码人妻精品一区二区三区99日韩 | 欧洲色综合 | 亚洲免费在线 | 亚洲视频手机在线 | 老司机在线看片 | 亚洲骚片| 亚洲一区国产一区 | 欧美乱妇高清无乱码 | 欧美三级小说 |