June 8, 2012

sp_setsubscriptionxactseqno (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_setsubscriptionxactseqno(nvarchar @publisher
, nvarchar @publisher_db
, nvarchar @publication
, varbinary @xact_seqno)

MetaData:

 CREATE PROCEDURE sys.sp_setsubscriptionxactseqno  
(
@publisher sysname,
@publisher_db sysname,
@publication sysname,
@xact_seqno varbinary(16)
)
AS
BEGIN
SET NOCOUNT ON

DECLARE @retcode int,
@current_xact_seqno varbinary(16),
@sub_streams_count int

-- Security Check
EXEC @retcode = sys.sp_MSreplcheck_subscribe
IF @@ERROR <> 0 OR @retcode <> 0
RETURN 1

-- Parameter Checks : @publisher
IF @publisher IS NULL
BEGIN
-- The parameter @publisher cannot be NULL.
RAISERROR (14043, 16, -1, '@publisher', 'sp_setsubscriptionxactseqno')
RETURN 1
END

EXEC @retcode = sys.sp_validname @publisher
IF @@ERROR <> 0 OR @retcode <> 0
RETURN 1

-- Parameter Checks : @publisher_db
IF @publisher_db IS NULL
BEGIN
-- The parameter @publisher_db cannot be NULL.
RAISERROR (14043, 16, -1, '@publisher_db', 'sp_setsubscriptionxactseqno')
RETURN 1
END

EXEC @retcode = sys.sp_validname @publisher_db
IF @@ERROR <> 0 OR @retcode <> 0
RETURN 1

-- Parameter Check: @publication
IF @publication IS NULL
BEGIN
-- The parameter @publisher cannot be NULL.
RAISERROR (14043, 16, -1, '@publication', 'sp_setsubscriptionxactseqno')
RETURN 1
END

EXEC @retcode = sys.sp_validname @publication
IF @@ERROR <> 0 OR @retcode <> 0
RETURN 1

-- Parameter Check: @xact_seqno
IF @xact_seqno IS NULL
BEGIN
-- The parameter @xact_seqno cannot be NULL.
RAISERROR (14043, 16, -1, '@xact_seqno', 'sp_setsubscriptionxactseqno')
RETURN 1
END

-- check to make sure we are at a subscription database
IF OBJECT_ID('MSreplication_subscriptions', 'U') IS NULL
BEGIN
-- The subscription on the Subscriber does not exist.
RAISERROR (20017, 16, -1)
RETURN 1
END

-- check if publication is independent agent if not @publication must be all
IF UPPER(@publication) != N'ALL'
AND NOT EXISTS (SELECT *
FROM MSreplication_subscriptions
WHERE UPPER(publisher) = UPPER(@publisher)
AND publisher_db = @publisher_db
AND publication = @publication)
AND EXISTS (SELECT *
FROM MSreplication_subscriptions
WHERE UPPER(publisher) = UPPER(@publisher)
AND publisher_db = @publisher_db
AND publication = N''
AND independent_agent = 0)
BEGIN
-- The subscription to publication '%s' was not found but a shared agent does exist. To specify a subscription to a publication that is replicated via a shared agent specify '%s' for the publication name.
RAISERROR(22579, 16, -1, @publication, N'ALL')
RETURN 1
END

-- Peer-To-Peer subscriptions do not support this feature
IF OBJECT_ID(N'MSpeer_lsns', 'U') is not NULL
BEGIN
IF EXISTS(SELECT *
FROM MSpeer_lsns
WHERE originator = UPPER(@publisher)
AND originator_db = @publisher_db
AND originator_publication = @publication)
BEGIN
-- Peer-To-Peer publications do not support 'sp_setsubscriptionxactseqno'. Please change the '@publication' parameter value.
RAISERROR(20646, 16, -1, '''sp_setsubscriptionxactseqno''', '@publication')
RETURN 1
END
END

-- if there are mstreams ensure that the last commit xact_seqno
-- match for all streams before allowing this process to cont...
IF (SELECT COUNT(*)
FROM MSreplication_subscriptions msrs1
JOIN MSreplication_subscriptions msrs2
ON UPPER(msrs1.publisher) = UPPER(msrs2.publisher)
AND msrs1.publisher_db = msrs2.publisher_db
AND msrs1.publication = msrs2.publication
AND CAST(SUBSTRING(msrs1.transaction_timestamp, 1, 15) AS binary(15)) != CAST(SUBSTRING(msrs2.transaction_timestamp, 1, 15) AS binary(15))
WHERE UPPER(msrs1.publisher) = UPPER(@publisher)
AND msrs1.publisher_db = @publisher_db
AND (msrs1.publication = @publication
OR (msrs1.publication = N''
AND msrs1.independent_agent = 0
AND UPPER(@publication) = N'ALL'))) > 0
BEGIN
-- The distribution agent must be run in single subscription stream mode prior to resetting the subscription xact_seqno.
RAISERROR (21836, 16, -1)
RETURN 1
END

SELECT @current_xact_seqno = transaction_timestamp
FROM MSreplication_subscriptions
WHERE UPPER(publisher) = UPPER(@publisher)
AND publisher_db = @publisher_db
AND (publication = @publication
OR (publication = N''
AND independent_agent = 0
AND UPPER(@publication) = N'ALL'))

SELECT @sub_streams_count = @@ROWCOUNT

IF @current_xact_seqno IS NULL
BEGIN
-- There is no subscription on Publisher '@publisher', publisher database '@publisher_db', publication '@publication'.
RAISERROR(14135, 11, -1, @publisher, @publisher_db, @publication)
RETURN 1
END

UPDATE MSreplication_subscriptions
SET transaction_timestamp = CAST(@xact_seqno AS binary(15)) + CAST(SUBSTRING(transaction_timestamp, 16, 1) AS binary(1))
WHERE UPPER(publisher) = UPPER(@publisher)
AND publisher_db = @publisher_db
AND (publication = @publication
OR (publication = N''
AND independent_agent = 0
AND UPPER(@publication) = N'ALL'))
IF @@ERROR <> 0
RETURN 1


SELECT @current_xact_seqno AS "ORIGINAL XACT_SEQNO",
@xact_seqno AS "UPDATED XACT_SEQNO",
@sub_streams_count AS "SUBSCRIPTION STREAM COUNT"

RETURN 0
END

No comments:

Post a Comment

Total Pageviews