May 11, 2012

sp_MSdummyupdate (Transact-SQL MetaData) Definition

Please note: that the following source code is provided and copyrighted by Microsoft and is for educational purpose only.
The meta data is from an SQL 2012 Server.

I have posted alot more, find the whole list here.

Goto Definition or MetaData

Definition:

sys.sp_MSdummyupdate(uniqueidentifier @rowguid
, int @tablenick
, tinyint @metatype
, uniqueidentifier @pubid
, tinyint @uplineage
, varbinary @inlineage
, varbinary @incolv)

MetaData:

   

create procedure sys.sp_MSdummyupdate
(@rowguid uniqueidentifier,
@tablenick int,
@metatype tinyint,
@pubid uniqueidentifier = NULL,
@uplineage tinyint = 1,
@inlineage varbinary(311) = NULL,
@incolv varbinary(2953) = NULL)
as
declare @retcode int
declare @lineage varbinary(311)
declare @conflict_lineage varbinary(311)
declare @replnick binary(6)
declare @col_tracking int
declare @colv varbinary(2953)

-- Parameter checks --
if (@rowguid is null)
begin
RAISERROR(14043, 16, -1, '@rowguid', 'sp_MSdummyupdate')
return (1)
end
if (@tablenick is null)
begin
RAISERROR(14043, 16, -1, '@tablenick', 'sp_MSdummyupdate')
return (1)
end
if (@metatype is null)
begin
RAISERROR(14043, 16, -1, '@metatype', 'sp_MSdummyupdate')
return (1)
end

--
-- Check to see if current publication has permission
--
exec @retcode = sys.sp_MSrepl_PAL_rolecheck @pubid = @pubid, @tablenick = @tablenick
if (@retcode <> 0) or (@@error <> 0)
return 1

-- Check if we have a merge publication by whether system table is there --
if object_id('MSmerge_contents') is NULL
begin
RAISERROR(20054 , 16, -1)
return (1)
end

exec sys.sp_MSgetreplnick @replnick = @replnick out
if (@@error <> 0) or @replnick IS NULL
begin
RAISERROR (14055, 11, -1)
RETURN(1)
end

-- only Shiloh reconciler and below call sp_MSdummyupdate, Yukon reconciler calls sp_MSdummyupdate90
if @inlineage is not null
set @inlineage= {fn LINEAGE_80_TO_90(@inlineage)}
if @incolv is not null
set @incolv= {fn COLV_80_TO_90(@incolv)}

-- Look for the "other" lineage in a conflict table
select @conflict_lineage = max(lineage) from MSmerge_errorlineage where
rowguid = @rowguid and tablenick = @tablenick

if (@metatype = 0)
begin
-- We don't have the row. Putting in a system delete tombstone should cause a delete and
-- eventual convergence. We are already logging the row as a conflict / error.
--
if @conflict_lineage is not null
begin
set @lineage = { fn UPDATELINEAGE(@conflict_lineage, @replnick, 1) }
end
else
begin
set @lineage = { fn UPDATELINEAGE(0x0, @replnick, 1) }
end

begin tran

insert into dbo.MSmerge_tombstone (rowguid, tablenick, type, lineage, generation)
select @rowguid, @tablenick, 6, @lineage, 0
where not exists (select * from dbo.MSmerge_contents
where tablenick = @tablenick
and rowguid = @rowguid)
if @@rowcount = 0
begin
-- We get here only when there is an existing contents row, which caused us to
-- not insert the tombstone row. Let us dummy update the contents row in this
-- case.
update dbo.MSmerge_contents set generation = 0
where tablenick = @tablenick
and rowguid = @rowguid
end
else
begin
delete from dbo.MSmerge_current_partition_mappings where rowguid=@rowguid and tablenick=@tablenick
insert into dbo.MSmerge_past_partition_mappings (publication_number, tablenick, rowguid,
partition_id, generation, reason)
values (0, @tablenick, @rowguid, -1, 0, 1)
end
commit tran

end
else if (@metatype = 1)
begin
if @inlineage is not null
begin
set @lineage = @inlineage
set @lineage = { fn UPDATELINEAGE(@lineage, @replnick, 1) }
end
else
begin
select @lineage = lineage from dbo.MSmerge_tombstone with (UPDLOCK ROWLOCK index = 1) where tablenick = @tablenick and
rowguid = @rowguid
if (@uplineage = 1)
begin
if @conflict_lineage is not null
begin
exec @retcode= sys.xp_mergelineages @lineage, @conflict_lineage, @lineage output
if @@error<>0 or @retcode<>0 return(1)
end
set @lineage = { fn UPDATELINEAGE(@lineage, @replnick, 1) }
end
end

update dbo.MSmerge_tombstone set generation = 0, lineage = @lineage where
tablenick = @tablenick and rowguid = @rowguid
end
else if (@metatype = 2)
begin
if @inlineage is not null
begin
set @lineage = @inlineage
set @lineage = { fn UPDATELINEAGE(@lineage, @replnick, 1) }

if @incolv is not null
begin
set @colv = @incolv
end
else
begin
select @colv = colv1 from dbo.MSmerge_contents with (UPDLOCK ROWLOCK index = 1) where
tablenick = @tablenick and rowguid = @rowguid
if @pubid is NULL
select @col_tracking = column_tracking from dbo.sysmergearticles where nickname = @tablenick
else
select @col_tracking = column_tracking from dbo.sysmergearticles where nickname = @tablenick and pubid = @pubid
if (@col_tracking = 0 or @colv is NULL)
set @colv = NULL
else
set @colv = { fn UPDATECOLVBM(@colv, @replnick, 0x01, 0x00, { fn GETMAXVERSION(@lineage) }) }
end
end
else
-- @inlineage is null -> @incolv is null, too
begin
select @lineage = lineage, @colv = colv1 from dbo.MSmerge_contents with (UPDLOCK ROWLOCK index = 1) where tablenick = @tablenick and
rowguid = @rowguid
if (@uplineage = 1)
begin
if @conflict_lineage is not null
begin
exec @retcode= sys.xp_mergelineages @lineage, @conflict_lineage, @lineage output
if @@error<>0 or @retcode<>0 return(1)
end
set @lineage = { fn UPDATELINEAGE(@lineage, @replnick, 1) }
if @pubid is NULL
select @col_tracking = column_tracking from dbo.sysmergearticles where nickname = @tablenick
else
select @col_tracking = column_tracking from dbo.sysmergearticles where nickname = @tablenick and pubid = @pubid
if (@col_tracking = 0 or @colv is NULL)
set @colv = NULL
else
set @colv = { fn UPDATECOLVBM(@colv, @replnick, 0x01, 0x00, { fn GETMAXVERSION(@lineage) }) }
end
end

update dbo.MSmerge_contents set generation = 0, lineage = @lineage, colv1 = @colv where
tablenick = @tablenick and rowguid = @rowguid

update dbo.MSmerge_past_partition_mappings set generation = 0 where
tablenick = @tablenick and rowguid = @rowguid

end
else if (@metatype = 3)
begin
if @inlineage is not null
begin
set @lineage = @inlineage
set @lineage = { fn UPDATELINEAGE(@lineage, @replnick, 1) }
end
else if @conflict_lineage is not null
begin
set @lineage = { fn UPDATELINEAGE(@conflict_lineage, @replnick, 1) }
end
else
begin
set @lineage = { fn UPDATELINEAGE(0x0, @replnick, 2) }
end

if @incolv is not null
begin
set @colv = @incolv
end
else
begin
if @pubid is NULL
begin
select @col_tracking = column_tracking
from dbo.sysmergearticles where nickname = @tablenick
end
else
begin
select @col_tracking = column_tracking
from dbo.sysmergearticles where nickname = @tablenick and pubid = @pubid
end

if (@col_tracking = 0)
set @colv = NULL
else
begin
set @colv = 0xFF
end
end

begin tran
save tran eval_change_membership_for_row

exec @retcode = sys.sp_MSevaluate_change_membership_for_row @tablenick = @tablenick, @rowguid = @rowguid
if @retcode <> 0 or @@error <> 0
begin
rollback tran eval_change_membership_for_row
commit tran
return 1
end

insert into dbo.MSmerge_contents (tablenick, rowguid, lineage, generation, colv1)
values (@tablenick, @rowguid, @lineage, 0, @colv)

exec @retcode = sys.sp_MSevaluate_logicalrecordparent @nickname = @tablenick, @rowguid = @rowguid
if @retcode <> 0 or @@error <> 0
begin
rollback tran eval_change_membership_for_row
commit tran
return 1
end

commit tran
end
else if (@metatype = 6) -- e.g., used to cope with dup key / dup index
begin
if @conflict_lineage is not null
begin
set @lineage = { fn UPDATELINEAGE(@conflict_lineage, @replnick, 1) }
end
else
begin
set @lineage = { fn UPDATELINEAGE(0x0, @replnick, 1) }
end

begin transaction
if not exists (select * from dbo.MSmerge_tombstone where rowguid=@rowguid and tablenick=@tablenick)
begin
insert into dbo.MSmerge_tombstone (rowguid, tablenick, type, lineage, generation)
select @rowguid, @tablenick, @metatype, @lineage, 0
where not exists (select * from dbo.MSmerge_contents
where tablenick = @tablenick
and rowguid = @rowguid)
if @@rowcount = 0
begin
-- We get here only when there is an existing contents row, which caused us to
-- not insert the tombstone row. Let us dummy update the contents row in this
-- case.
update dbo.MSmerge_contents set generation = 0
where tablenick = @tablenick
and rowguid = @rowguid
end
else
begin
insert into dbo.MSmerge_past_partition_mappings (publication_number, tablenick, rowguid,
partition_id, generation, reason)
values (0, @tablenick, @rowguid, -1, 0, 1)

delete from dbo.MSmerge_current_partition_mappings where rowguid=@rowguid and tablenick=@tablenick
end
end
commit
end
return (0)

No comments:

Post a Comment

Total Pageviews