22,182
社区成员




create trigger upd_7C7EB787062A46A19F6D5A145B23D635 on [dbo].[tblcase] FOR UPDATE AS
if sessionproperty('replication_agent') = 1 and (select trigger_nestlevel()) = 1
return
/* Declare variables */
declare @article_rows_updated int
select @article_rows_updated = count(*) from inserted
declare @contents_rows_updated int, @updateerror int
declare @bm varbinary(500), @missingbm varbinary(500), @lineage varbinary(255), @cv varbinary(2048)
declare @tablenick int, @nick int, @ccols int, @partchange int, @joinchange int
declare @partchangebm varbinary(500), @joinchangebm varbinary(500)
declare @oldmaxversion int
set nocount on
set @tablenick = 4201078
select @oldmaxversion= maxversion_at_cleanup from dbo.sysmergearticles where nickname = @tablenick
/* Use intrinsic funtion to set bits for updated columns */
set @bm = columns_updated()
/* only do the map down when needed */
set @missingbm = 0x000080E607
set @partchangebm = 0x00
set @joinchangebm = 0x00
if update([rowguid])
begin
if @@trancount > 0
rollback tran
RAISERROR (20062, 16, -1)
end
/* See if the partition might have changed */
if @partchangebm = 0x0
set @partchange = 0
else
set @partchange= { fn INTERSECTBITMAPS (@bm, @partchangebm) }
/* See if a column used in a join filter changed */
if @joinchangebm = 0x0
set @joinchange = 0
else
set @joinchange= { fn INTERSECTBITMAPS (@bm, @joinchangebm) }
execute master..xp_mapdown_bitmap 0x000080E607, @bm output
exec dbo.sp_MSgetreplnick @nickname = @nick output
select @ccols = 37
set @lineage = { fn UPDATELINEAGE(0x0, @nick, @oldmaxversion+1) }
set @cv = { fn INITCOLVS(@ccols, @nick) }
if (@@error <> 0)
begin
goto FAILURE
end
set @cv = { fn UPDATECOLVBM(@cv, @nick, @bm, @missingbm, { fn GETMAXVERSION(@lineage) }) }
update dbo.ctsv_7C7EB787062A46A19F6D5A145B23D635
set lineage = { fn UPDATELINEAGE(lineage, @nick, @oldmaxversion+1) },
generation = A.gen_cur,
joinchangegen = case when (@joinchange = 1) then A.gen_cur else joinchangegen end,
partchangegen = case when (@partchange = 1) then A.gen_cur else partchangegen end,
colv1 = { fn UPDATECOLVBM(colv1, @nick, @bm, @missingbm, { fn GETMAXVERSION({ fn UPDATELINEAGE(lineage, @nick, @oldmaxversion+1) }) }) }
FROM inserted as I JOIN dbo.ctsv_7C7EB787062A46A19F6D5A145B23D635 as V
ON (I.rowguidcol=V.rowguid)
and V.tablenick = @tablenick
JOIN (select top 1 nickname, gen_cur = isnull(gen_cur, 0) from dbo.sysmergearticles where nickname = @tablenick) as A
ON V.tablenick = A.nickname
select @updateerror = @@error, @contents_rows_updated = @@rowcount
if @article_rows_updated <> @contents_rows_updated
begin
insert into dbo.ctsv_7C7EB787062A46A19F6D5A145B23D635 (tablenick, rowguid, lineage, colv1, generation, partchangegen, joinchangegen)
select @tablenick, rowguidcol, @lineage, @cv, A.gen_cur,
case when (@joinchange = 1 or @partchange = 1) then A.gen_cur else NULL end,
case when @joinchange = 1 then A.gen_cur else NULL end
from inserted,
(select top 1 nickname, gen_cur = isnull(gen_cur, 0) from dbo.sysmergearticles where nickname = @tablenick) as A
where rowguidcol not in (select rowguid from dbo.ctsv_7C7EB787062A46A19F6D5A145B23D635 where tablenick = @tablenick)
if @@error <> 0
GOTO FAILURE
end
return
FAILURE:
if @@trancount > 0
rollback tran
raiserror (20041, 16, -1)
return
用这些代码试试。
create trigger upd_7C7EB787062A46A19F6D5A145B23D635 on [dbo].[tblcase] FOR UPDATE AS
if sessionproperty('replication_agent') = 1 and (select trigger_nestlevel()) = 1
return
/* Declare variables */
declare @article_rows_updated int
select @article_rows_updated = count(*) from inserted
declare @contents_rows_updated int, @updateerror int
declare @bm varbinary(500), @missingbm varbinary(500), @lineage varbinary(255), @cv varbinary(2048)
declare @tablenick int, @nick int, @ccols int, @partchange int, @joinchange int
declare @partchangebm varbinary(500), @joinchangebm varbinary(500)
declare @oldmaxversion int
set nocount on
set @tablenick = 4201078
select @oldmaxversion= maxversion_at_cleanup from dbo.sysmergearticles where nickname = @tablenick
/* Use intrinsic funtion to set bits for updated columns */
set @bm = columns_updated()
/* only do the map down when needed */
set @missingbm = 0x000080E607
set @partchangebm = 0x00
set @joinchangebm = 0x00
if update([rowguid])
begin
if @@trancount > 0
rollback tran
RAISERROR (20062, 16, -1)
end
/* See if the partition might have changed */
if @partchangebm = 0x0
set @partchange = 0
else
set @partchange= { fn INTERSECTBITMAPS (@bm, @partchangebm) }
/* See if a column used in a join filter changed */
if @joinchangebm = 0x0
set @joinchange = 0
else
set @joinchange= { fn INTERSECTBITMAPS (@bm, @joinchangebm) }
execute master..xp_mapdown_bitmap 0x000080E607, @bm output
exec dbo.sp_MSgetreplnick @nickname = @nick output
select @ccols = 37
set @lineage = { fn UPDATELINEAGE(0x0, @nick, @oldmaxversion+1) }
set @cv = { fn INITCOLVS(@ccols, @nick) }
if (@@error <> 0)
begin
goto FAILURE
end
set @cv = { fn UPDATECOLVBM(@cv, @nick, @bm, @missingbm, { fn GETMAXVERSION(@lineage) }) }
update ctsv_7C7EB787062A46A19F6D5A145B23D635
set lineage = { fn UPDATELINEAGE(lineage, @nick, @oldmaxversion+1) },
generation = A.gen_cur,
joinchangegen = case when (@joinchange = 1) then A.gen_cur else joinchangegen end,
partchangegen = case when (@partchange = 1) then A.gen_cur else partchangegen end,
colv1 = { fn UPDATECOLVBM(colv1, @nick, @bm, @missingbm, { fn GETMAXVERSION({ fn UPDATELINEAGE(lineage, @nick, @oldmaxversion+1) }) }) }
FROM inserted as I JOIN ctsv_7C7EB787062A46A19F6D5A145B23D635 as V
ON (I.rowguidcol=V.rowguid)
and V.tablenick = @tablenick
JOIN (select top 1 nickname, gen_cur = isnull(gen_cur, 0) from dbo.sysmergearticles where nickname = @tablenick) as A
ON V.tablenick = A.nickname
select @updateerror = @@error, @contents_rows_updated = @@rowcount
if @article_rows_updated <> @contents_rows_updated
begin
insert into ctsv_7C7EB787062A46A19F6D5A145B23D635 (tablenick, rowguid, lineage, colv1, generation, partchangegen, joinchangegen)
select @tablenick, rowguidcol, @lineage, @cv, A.gen_cur,
case when (@joinchange = 1 or @partchange = 1) then A.gen_cur else NULL end,
case when @joinchange = 1 then A.gen_cur else NULL end
from inserted,
(select top 1 nickname, gen_cur = isnull(gen_cur, 0) from dbo.sysmergearticles where nickname = @tablenick) as A
where rowguidcol not in (select rowguid from ctsv_7C7EB787062A46A19F6D5A145B23D635 where tablenick = @tablenick)
if @@error <> 0
GOTO FAILURE
end
return
FAILURE:
if @@trancount > 0
rollback tran
raiserror (20041, 16, -1)
return