home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-12-08 | 231.7 KB | 8,325 lines |
- /*
- ** instrepl.sql 03/14/95
- **
- **
- ** Copyright Microsoft, Inc. 1994, 1995
- ** All Rights Reserved.
- ** Use, duplication, or disclosure by the United States Government
- ** is subject to restrictions as set forth in subdivision (c) (1) (ii)
- ** of the Rights in Technical Data and Computer Software clause
- ** at CFR 252.227-7013. Microsoft, Inc. One Microsoft Way, Redmond WA
- ** 98052.
- */
-
- use master
- go
- dump tran master with no_log
- go
- set nocount on
- go
-
- exec sp_configure 'update',1
- go
- reconfigure with override
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_addarticle')
- drop procedure sp_addarticle
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_articlecolumn')
- drop procedure sp_articlecolumn
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_articlefilter')
- drop procedure sp_articlefilter
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_articletextcol')
- drop procedure sp_articletextcol
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_textcolstatus')
- drop procedure sp_textcolstatus
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_articleview')
- drop procedure sp_articleview
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_addpublication')
- drop procedure sp_addpublication
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_addpublisher')
- drop procedure sp_addpublisher
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_addsubscriber')
- drop procedure sp_addsubscriber
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_addsubscription')
- drop procedure sp_addsubscription
- go
-
-
- IF EXISTS (SELECT * FROM sysobjects
- WHERE sysstat & 0xf = 4
- AND name = 'sp_changearticle')
- DROP PROCEDURE sp_changearticle
- go
-
-
- IF EXISTS (SELECT * FROM sysobjects
- WHERE sysstat & 0xf = 4
- AND name = 'sp_changepublication')
- DROP PROCEDURE sp_changepublication
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_changesubscriber')
- drop procedure sp_changesubscriber
- go
-
- IF EXISTS (SELECT * FROM sysobjects
- WHERE sysstat & 0xf = 4
- AND name = 'sp_changesubscription')
- DROP PROCEDURE sp_changesubscription
- go
-
- IF EXISTS (SELECT * FROM sysobjects
- WHERE sysstat & 0xf = 4
- AND name = 'sp_create_distribution_tables')
- DROP PROCEDURE sp_create_distribution_tables
- go
-
- dump tran master with no_log
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_hcchangesubstatus1')
- drop procedure sp_hcchangesubstatus1
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_hcchangesubstatus2')
- drop procedure sp_hcchangesubstatus2
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_changesubstatus')
- drop procedure sp_changesubstatus
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_distcounters')
- drop procedure sp_distcounters
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_droparticle')
- drop procedure sp_droparticle
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_droppublication')
- drop procedure sp_droppublication
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_droppublisher')
- drop procedure sp_droppublisher
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_dropsubscriber')
- drop procedure sp_dropsubscriber
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_dropsubscription')
- drop procedure sp_dropsubscription
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_dsninfo')
- drop procedure sp_dsninfo
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_enumdsn')
- drop procedure sp_enumdsn
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_enumfullsubscribers')
- drop procedure sp_enumfullsubscribers
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_helparticle')
- drop procedure sp_helparticle
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_helparticlecolumns')
- drop procedure sp_helparticlecolumns
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_helpdistributor')
- drop procedure sp_helpdistributor
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_helppublication')
- drop procedure sp_helppublication
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_helppublicationsync')
- drop procedure sp_helppublicationsync
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_helpreplicationdb')
- drop procedure sp_helpreplicationdb
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_helpsubscriberinfo')
- drop procedure sp_helpsubscriberinfo
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_helpsubscription')
- drop procedure sp_helpsubscription
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_publishdb')
- drop procedure sp_publishdb
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_replica')
- drop procedure sp_replica
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_replsync')
- drop procedure sp_replsync
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_subscribe')
- drop procedure sp_subscribe
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_unsubscribe')
- drop procedure sp_unsubscribe
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'xp_dsninfo')
- exec sp_dropextendedproc 'xp_dsninfo'
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'xp_enumdsn')
- exec sp_dropextendedproc 'xp_enumdsn'
- go
-
- CREATE PROCEDURE sp_helpdistributor (
- @distributor varchar(30) = '%' OUTPUT, /* The distribution server name */
- @distribdb varchar(30) = '%' OUTPUT, /* The distribution database script */
- @directory varchar(255) = '%' OUTPUT, /* The working directory */
- @account varchar(255) = '%' OUTPUT, /* The Windows NT user account */
- @local varchar(5) = NULL /* Get local server values */
- ) AS
-
- /*
- ** Declarations.
- */
- DECLARE @loc_distributor varchar(30)
- DECLARE @loc_distribdb varchar(30)
- DECLARE @loc_directory varchar(255)
- DECLARE @loc_account varchar(255)
- DECLARE @proc varchar(255)
-
- SET NOCOUNT ON
-
- /*
- ** If @local flag, get current server's distribution values.
- */
- IF LOWER (@local) = 'local'
- SELECT @loc_distributor = @@SERVERNAME
- /*
- ** Get the distribution server
- */
- ELSE
- BEGIN
- SELECT @loc_distributor = srvname
- FROM master..sysservers
- WHERE srvstatus & 8 <> 0
-
- IF @@error <> 0
- BEGIN
- RAISERROR (14071, 16, -1)
- RETURN (1)
- END
- END
-
- /*
- ** If remote distribuiton, execute sp_helpdistributor on distribution
- ** server.
- */
- IF @loc_distributor <> @@SERVERNAME
- BEGIN
- SELECT @proc = RTRIM(@loc_distributor) + '.master..sp_helpdistributor '
- EXECUTE @proc
- @loc_distributor OUTPUT,
- @loc_distribdb OUTPUT,
- @loc_directory OUTPUT,
- @loc_account OUTPUT,
- @local = 'local'
- IF @@ERROR <> 0
- RETURN (1)
-
- GOTO DONE
- END
-
- /*
- ** Fetch the distribution database name.
- */
- IF (@distributor = '%' AND @distribdb = '%' AND @directory = '%'
- AND @account = '%') OR @distribdb IS NULL
- BEGIN
- SELECT @proc = 'master..xp_regread '
- EXECUTE @proc 'HKEY_LOCAL_MACHINE',
- 'SOFTWARE\Microsoft\MSSQLServer\Replication',
- 'DistributionDB',
- @param = @loc_distribdb OUTPUT
-
- IF @@ERROR <> 0 RETURN (1)
- END
- /*
- ** Fetch the distribution working directory.
- */
- IF (@distributor = '%' AND @distribdb = '%' AND @directory = '%'
- AND @account = '%') OR @directory IS NULL
- BEGIN
- SELECT @proc = 'master..xp_regread '
- EXECUTE @proc 'HKEY_LOCAL_MACHINE',
- 'SOFTWARE\Microsoft\MSSQLServer\Replication',
- 'WorkingDirectory',
- @param = @loc_directory OUTPUT
-
- IF @@ERROR <> 0 RETURN (1)
- END
-
- /*
- ** Fetch the distribution account name.
- */
- IF (@distributor = '%' AND @distribdb = '%' AND @directory = '%'
- AND @account = '%') OR @account IS NULL
- BEGIN
- SELECT @proc = 'master..xp_regread '
- EXECUTE @proc 'HKEY_LOCAL_MACHINE',
- 'SYSTEM\CurrentControlSet\Services\SQLExecutive',
- 'ObjectName',
- @param = @loc_account OUTPUT
-
- IF @@ERROR <> 0 RETURN (1)
- END
-
- DONE:
-
- /*
- ** Return result set if no output parameters
- */
-
- IF @distributor = '%' AND @distribdb = '%' AND @directory = '%'
- AND @account = '%'
-
- SELECT 'distributor' = @loc_distributor,
- 'distribution database' = @loc_distribdb,
- 'directory' = @loc_directory,
- 'account' = @loc_account
-
- /*
- ** Return output parameters if requested.
- */
-
- IF @distributor IS NULL
- SELECT @distributor = @loc_distributor
- IF @distribdb IS NULL
- SELECT @distribdb = @loc_distribdb
- IF @directory IS NULL
- SELECT @directory = @loc_directory
- IF @account IS NULL
- SELECT @account = @loc_account
-
- RETURN (0)
- go
-
- /*
- ** Create replication stored procedures.
- ** Part 2: create all other stored procedures.
- */
-
- print ''
- print 'Creating procedure sp_addpublication.'
- go
- CREATE PROCEDURE sp_addpublication (
- @publication varchar(30), /* publication name */
- @taskid int, /* associated scheduler task */
- @restricted varchar (10) = 'false', /* publication security */
- @sync_method varchar(13) = 'native', /* (bcp) native, (bcp) character */
- @repl_freq varchar(10) = 'continuous', /* continuous, snapshot */
- @description varchar (255) = NULL, /* publication description */
- @status varchar(8) = 'inactive' /* publication status; 0=inactive, 1=active */
- ) AS
-
- SET NOCOUNT ON
-
- /*
- ** Declarations.
- */
-
- DECLARE @retcode int /* return code value for procedure execution */
- DECLARE @rid bit /* value for restricted column */
- DECLARE @rfid tinyint /* identifier for replication frequency */
- DECLARE @publish_bit smallint /* publication bit (flag) in sysobjects */
- DECLARE @smid tinyint /* identifier for sync method */
- DECLARE @statid tinyint /* status id based on @status */
- DECLARE @distributor varchar(30)
- DECLARE @distproc varchar (255)
-
-
- SELECT @publish_bit = 32
-
- /*
- ** Security Check
- ** Only the System Administratr (SA) or the Database Owner (dbo) can
- ** publish a table.
- */
-
- IF suser_id() <> 1 AND user_id() <> 1
- BEGIN
- RAISERROR (15000, 14, -1)
- RETURN (1)
- END
-
- /*
- ** Check to see if the database has been activated for publication.
- */
-
- IF (SELECT category & 1
- FROM master..sysdatabases
- WHERE name = DB_NAME()) = 0
-
- BEGIN
- RAISERROR (14013, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @publication.
- ** The @publication name must conform to the rules for identifiers,
- ** and must not be the keyword 'all'.
- */
-
- IF @publication IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @publication
-
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
-
- IF LOWER (@publication) = 'all'
- BEGIN
- RAISERROR (14034, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Get distribution server information for remote RPC
- ** task verification.
- */
- EXEC @retcode = sp_helpdistributor @distributor = @distributor OUTPUT
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14071, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @taskid
- ** The @taskid must exists in the systasks table. The @taskid
- ** must also be unique.
- */
- SELECT @distproc = RTRIM(@distributor) + '.msdb..sp_verifytaskid'
- EXECUTE @retcode = @distproc @taskid = @taskid, @subsystem = 'Sync'
- IF @@ERROR <> 0 or @retcode <> 0
- BEGIN
- RAISERROR (14002, 16, -1, @taskid)
- RETURN (1)
- END
-
- IF EXISTS (SELECT * FROM syspublications WHERE taskid = @taskid)
- BEGIN
- RAISERROR (14045, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @sync_method
- ** The synchronization method must be one of the following:
- **
- ** 0 [bcp] native
- ** 1 [bcp] character
- */
-
- SELECT @sync_method = LOWER(@sync_method)
- IF @sync_method IS NULL OR @sync_method NOT IN ('native', 'character', 'bcp native', 'bcp character')
- BEGIN
- RAISERROR (14014, 16, -1)
- RETURN (1)
- END
-
- IF @sync_method IN ('character', 'bcp character')
- SELECT @smid = 1
- ELSE
- SELECT @smid = 0
-
- /*
- ** Parameter Check: @repl_freq.
- ** Make sure that the replication frequency is one of the following:
- **
- ** id frequency
- ** == ==========
- ** 0 continuous
- ** 1 snapshot
- */
-
- SELECT @repl_freq = LOWER(@repl_freq)
- IF @repl_freq IS NULL OR @repl_freq NOT IN ('continuous', 'snapshot')
- BEGIN
- RAISERROR (14015, 16, -1)
- RETURN (1)
- END
-
- IF @repl_freq = 'snapshot' SELECT @rfid = 1
- ELSE SELECT @rfid = 0
-
- /*
- ** Check if the publication already exists.
- */
-
- IF EXISTS (SELECT * FROM syspublications WHERE name = @publication)
- BEGIN
- RAISERROR (14016, 16, -1, @publication)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @restricted.
- */
-
- IF (@restricted IS NULL) OR (LOWER(@restricted) NOT IN ('true', 'false'))
- BEGIN
- RAISERROR (14017, 16, -1)
- RETURN (1)
- END
-
- IF LOWER(@restricted) = 'true'
- SELECT @rid = 1
- ELSE
- SELECT @rid = 0
-
- /*
- ** Parameter Check: @status.
- ** The @status value can be:
- **
- ** statid status
- ** ====== ========
- ** 0 inactive
- ** 1 active
- */
-
- IF @status IS NULL OR LOWER(@status) NOT IN ('inactive', 'active')
- BEGIN
- RAISERROR (14012, 16, -1)
- RETURN (1)
- END
-
- IF LOWER(@status) = 'active' SELECT @statid = 1
- ELSE SELECT @statid = 0
-
- /*
- ** Add publication to syspublications.
- */
-
- INSERT syspublications(description, name, repl_freq,
- restricted, status, sync_method, taskid)
- VALUES (@description, @publication, @rfid, @rid, @statid, @smid, @taskid)
-
- IF @@ERROR <> 0
- BEGIN
- RAISERROR (14018, 16, -1)
- RETURN (1)
- END
- go
-
- print ''
- print 'Creating procedure sp_changepublication.'
- go
- CREATE PROCEDURE sp_changepublication (
- @publication varchar(30) = NULL, /* Publication name */
- @property varchar(15) = NULL, /* The property to change */
- @value varchar(255) = NULL /* The new property value */
- ) AS
-
- SET NOCOUNT ON
-
- /*
- ** Declarations.
- */
-
- DECLARE @cmd varchar(255)
- DECLARE @pubid int
- DECLARE @replfreqid tinyint
- DECLARE @restrictedid bit
- DECLARE @retcode int
- DECLARE @statusid tinyint
- DECLARE @syncmethodid tinyint
- DECLARE @taskid int
- DECLARE @distributor varchar(30)
- DECLARE @distproc varchar (255)
- DECLARE @subscribed int
-
- select @subscribed = 1
-
- /*
- ** Security Check
- ** Only the System Administrator (SA) or the Database Owner (dbo) can
- ** perform this procedure.
- */
-
- IF suser_id() <> 1 AND user_id() <> 1
- BEGIN
- RAISERROR (15000, 14, -1)
- RETURN (1)
- END
-
- /*
- ** Check to see if the database has been activated for publication.
- */
-
- IF (SELECT category & 1
- FROM master..sysdatabases
- WHERE name = DB_NAME()) = 0
-
- BEGIN
- RAISERROR (14013, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @property.
- ** If the @property parameter is NULL, print the options.
- */
-
- IF @property IS NULL
- BEGIN
- CREATE TABLE #tab1 (properties varchar(30))
- INSERT INTO #tab1 VALUES ('name')
- INSERT INTO #tab1 VALUES ('description')
- INSERT INTO #tab1 VALUES ('taskid')
- INSERT INTO #tab1 VALUES ('sync_method')
- INSERT INTO #tab1 VALUES ('status')
- INSERT INTO #tab1 VALUES ('repl_freq')
- INSERT INTO #tab1 VALUES ('restricted')
- PRINT ''
- SELECT * FROM #tab1
- RETURN (0)
- END
-
- /*
- ** Parameter Check: @publication.
- ** Make sure that the publication exists.
- */
-
- IF @publication IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @publication
-
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
-
- SELECT @pubid = pubid FROM syspublications WHERE name = @publication
-
- IF @pubid IS NULL
- BEGIN
- RAISERROR (15001, 11, -1, @publication)
- RETURN (1)
- END
- ELSE
-
- /*
- ** Parameter Check: @property.
- ** Check to make sure that @property is a valid property in
- ** syspublications.
- */
-
- IF LOWER(@property) NOT IN ('name', 'description', 'taskid', 'sync_method', 'status', 'repl_freq', 'restricted')
- BEGIN
- RAISERROR (14078, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Change the property.
- */
-
- IF LOWER(@property) IN ('name', 'description')
- BEGIN
-
- IF LOWER(@property) = 'name'
- BEGIN
-
- IF @value IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @value
-
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
-
- IF EXISTS (SELECT * FROM syspublications WHERE name = @value)
- BEGIN
- RAISERROR (14016, 16, -1, @value)
- RETURN (1)
- END
-
- END
-
- SELECT @cmd = ''
- SELECT @cmd = @cmd + 'UPDATE syspublications '
- SELECT @cmd = @cmd + ' SET ' + @property + ' = ''' + @value + ''''
- SELECT @cmd = @cmd + ' WHERE pubid = ' + STR(@pubid)
- EXECUTE (@cmd)
- IF @@ERROR <> 0 RETURN (1)
- END
-
- IF LOWER(@property) = 'taskid'
- BEGIN
- SELECT @taskid = CONVERT(int, @value)
- /*
- ** Get distribution server information for remote RPC
- ** task verification.
- */
- EXEC @retcode = sp_helpdistributor @distributor = @distributor OUTPUT
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14071, 16, -1)
- RETURN (1)
- END
-
- /*
- ** The @taskid must exists in the systasks table. The @taskid
- ** must also be unique.
- */
- SELECT @distproc = RTRIM(@distributor) + '.msdb..sp_verifytaskid'
- EXECUTE @retcode = @distproc @taskid = @taskid,
- @subsystem = 'Sync'
- IF @@ERROR <> 0 or @retcode <> 0
- BEGIN
- RAISERROR (14002, 16, -1, @taskid)
- RETURN (1)
- END
-
- IF EXISTS (SELECT * FROM syspublications WHERE taskid = @taskid)
- BEGIN
- RAISERROR (14045, 16, -1)
- RETURN (1)
- END
-
- UPDATE syspublications SET taskid = @taskid
- WHERE pubid = @pubid
-
- IF @@ERROR <> 0 RETURN (1)
- END
-
- IF LOWER(@property) = 'sync_method'
- BEGIN
-
- /*
- ** Check for a valid synchronization method.
- */
-
- IF LOWER(@value) NOT IN ('native', 'character', 'bcp native', 'bcp character')
- BEGIN
- RAISERROR (14026, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Determine the integer value for the sync_method.
- */
-
- IF LOWER(@value) IN ('native', 'bcp native')
- SELECT @syncmethodid = 0
- ELSE IF LOWER(@value) IN ('character', 'bcp character')
- SELECT @syncmethodid = 1
-
- /*
- ** Update the publication with the new synchronization method.
- */
-
- UPDATE syspublications
- SET sync_method = @syncmethodid
- WHERE pubid = @pubid
-
- IF @@ERROR <> 0 RETURN (1)
-
- END
-
- IF LOWER(@property) = 'status'
- BEGIN
-
- /*
- ** Check to make sure that we have a valid status.
- */
-
- IF LOWER(@value) NOT IN ('active', 'inactive')
- BEGIN
- RAISERROR (14024, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Determine the integer value for the status.
- */
-
- IF LOWER(@value) = 'active'
- SELECT @statusid = 1
- ELSE
- SELECT @statusid = 0
-
- /*
- ** Update the publication with the new status.
- */
-
- UPDATE syspublications
- SET status = @statusid
- WHERE pubid = @pubid
-
- IF @@ERROR <> 0 RETURN (1)
-
- END
-
- IF LOWER(@property) = 'repl_freq'
- BEGIN
-
- /*
- ** Only unsubscribed publications may have this modified.
- */
- IF EXISTS (SELECT * FROM syssubscriptions
- WHERE status <> @subscribed
- AND artid IN (SELECT artid FROM sysarticles where pubid
- = @pubid))
- BEGIN
- RAISERROR (14033, 11, -1)
- RETURN (1)
- END
-
- /*
- ** Check for a valid replication frequency value.
- */
-
- IF LOWER(@value) NOT IN ('continuous', 'snapshot')
- BEGIN
- RAISERROR (14015, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Determine the integer value for the replication frequency.
- */
-
- IF LOWER(@value) = 'continuous'
- SELECT @replfreqid = 0
- ELSE
- SELECT @replfreqid = 1
-
- /*
- ** Update the publication with the new replication frequency.
- */
-
- UPDATE syspublications
- SET repl_freq = @replfreqid
- WHERE pubid = @pubid
-
- IF @@ERROR <> 0 RETURN (1)
-
- END
-
- IF LOWER(@property) = 'restricted'
- BEGIN
-
- /*
- ** Check for a valid restricted value.
- */
-
- IF LOWER(@value) NOT IN ('true', 'false')
- BEGIN
- RAISERROR (14017, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Determine the integer value for the restricted column.
- */
-
- IF LOWER(@value) = 'true'
- SELECT @restrictedid = 1
- ELSE
- SELECT @restrictedid = 0
-
- /*
- ** Update the publication with the new restriction value.
- */
-
- UPDATE syspublications
- SET restricted = @restrictedid
- WHERE pubid = @pubid
-
- IF @@ERROR <> 0 RETURN (1)
-
- END
-
- /*
- ** Return succeed.
- */
-
- RAISERROR (14077, 10, -1)
- RETURN (0)
- GO
-
- print ''
- print 'Creating procedure sp_changesubscription.'
- GO
- CREATE PROCEDURE sp_changesubscription (
- @publication varchar(30) = NULL, /* Publication name */
- @article varchar(30) = NULL, /* Article name */
- @subscriber varchar(30), /* Subscriber name */
- @property varchar(15) = NULL, /* The property to change */
- @value varchar(255) = NULL /* The new property value */
- ) AS
-
- SET NOCOUNT ON
-
- /*
- ** Declarations.
- */
-
- DECLARE @artid int
- DECLARE @inactive tinyint
- DECLARE @pubid int
- DECLARE @retcode int
- DECLARE @srvid int
- DECLARE @subscribed tinyint
- DECLARE @subscriber_bit smallint
- DECLARE @synctypeid int
- DECLARE @none tinyint
- DECLARE @automatic tinyint
- DECLARE @manual tinyint
-
- /*
- ** Initializations.
- */
-
- SELECT @inactive = 0 /* Const: subscription status 'inactive' */
- SELECT @subscribed = 1 /* Const: subscription status 'subscribed' */
- SELECT @subscriber_bit = 4 /* Const: subscription server status */
- SELECT @none = 2 /* Const: synchronization type 'none' */
- SELECT @automatic = 1 /* Const: synchronization type 'automatic' */
- SELECT @manual = 0 /* Const: synchronization type 'manual' */
-
- /*
- ** Security Check.
- */
- IF suser_id() <> 1 AND user_id() <> 1
- BEGIN
- RAISERROR (15000, 14, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @property.
- ** If the @property parameter is NULL, print the options.
- */
-
- IF @property IS NULL
- BEGIN
- CREATE TABLE #tab1 (properties varchar(30))
- INSERT INTO #tab1 VALUES ('sync_type')
- INSERT INTO #tab1 VALUES ('dest_db')
- SELECT * FROM #tab1
- RETURN (0)
- END
-
- /*
- ** Parameter Check: @publication.
- ** Make sure that the publication exists.
- */
-
- IF @publication IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @publication
-
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
-
- SELECT @pubid = pubid FROM syspublications WHERE name = @publication
-
- IF @pubid IS NULL
- BEGIN
- RAISERROR (15001, 11, -1, @publication)
- RETURN (1)
- END
- ELSE
-
- /*
- ** Check to see that the article exists in sysarticles.
- ** Fetch the article identification number.
- */
-
- IF @article IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The article')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @article
-
- IF @retcode <> 0
- RETURN (1)
-
- SELECT @artid = artid
- FROM sysarticles
- WHERE name = @article
- AND pubid = @pubid
-
- IF @artid IS NULL
- BEGIN
- RAISERROR (15001, 11, -1, @article)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @subscriber.
- ** Check to make sure we have a valid subscriber.
- */
-
- IF @subscriber IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The subscriber')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @subscriber
-
- IF @retcode <> 0
- RETURN (1)
-
- SELECT @srvid = srvid
- FROM master..sysservers
- WHERE srvname = @subscriber
- AND (srvstatus & @subscriber_bit) <> 0
-
- IF @srvid IS NULL
- BEGIN
- RAISERROR (14010, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Check to see if you have a subscription on this publication/article.
- */
-
- IF NOT EXISTS (SELECT *
- FROM syssubscriptions
- WHERE artid = @artid
- AND srvid = @srvid)
- BEGIN
- RAISERROR (14050, 11, -1)
- RETURN(1)
- END
-
- /*
- ** Parameter Check: @property.
- ** Check to make sure that @property is a valid property in
- ** sysarticles.
- */
-
- IF LOWER(@property) NOT IN ('sync_type', 'dest_db')
- BEGIN
- RAISERROR (14051, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Change the property.
- */
-
- IF LOWER(@property) = 'sync_type'
- BEGIN
-
- /*
- ** Check to make sure that we have a valid sync_type.
- */
-
- IF LOWER(@value) NOT IN ('manual', 'automatic', 'none')
- BEGIN
- RAISERROR (14052, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Determine the integer value for the sync_type.
- */
-
- IF LOWER(@value) = 'automatic'
- SELECT @synctypeid = @automatic
- ELSE IF LOWER(@value) = 'manual'
- SELECT @synctypeid = @manual
- ELSE
- SELECT @synctypeid = @none
-
- /*
- ** Update the subscription with the new sync_type.
- */
-
- UPDATE syssubscriptions
- SET sync_type = @synctypeid
- WHERE artid = @artid
- AND srvid = @srvid
-
- IF @@ERROR <> 0
- BEGIN
- RAISERROR (14053, 16, -1)
- RETURN (1)
- END
-
- END
-
- IF LOWER(@property) = 'dest_db'
- BEGIN
-
- /*
- ** Check to make sure that we have a valid dest_db.
- */
-
- EXECUTE @retcode = sp_validname @value
-
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
-
- /*
- ** Update the subscription with the new destination database.
- */
-
- IF EXISTS (SELECT *
- FROM syssubscriptions
- WHERE artid = @artid
- AND srvid = @srvid
- AND status = @inactive)
-
- BEGIN
-
- UPDATE syssubscriptions
- SET dest_db = @value
- WHERE artid = @artid
- AND srvid = @srvid
-
- IF @@ERROR <> 0
- BEGIN
- RAISERROR (14053, 16, -1)
- RETURN (1)
- END
- END
-
- ELSE
- BEGIN
- RAISERROR (14007, 16, -1)
- RETURN (1)
- END
- END
-
- /*
- ** Return succeed.
- */
-
- RAISERROR (14054, 10, -1)
- RETURN (0)
- go
-
- print ''
- print 'Creating procedure sp_helparticle.'
- go
-
- CREATE PROCEDURE sp_helparticle (
- @publication varchar(30), /* The publication name */
- @article varchar(30) = '%', /* The article name */
- @returnfilter bit = 1 /* Return filter flag */
- ) AS
-
- SET NOCOUNT ON
-
- /*
- ** Declarations.
- */
-
- DECLARE @pubid int
- DECLARE @retcode int
- DECLARE @subscriber_bit smallint
-
- /*
- ** Initializations.
- */
-
- SELECT @subscriber_bit = 4
-
- IF @publication IS NOT NULL
- SELECT @pubid = pubid FROM syspublications WHERE name = @publication
-
- /*
- ** Create a temporary table to hold all information.
- */
-
- CREATE TABLE #tab1 (
- artid int,
- columns varbinary(32),
- creation_script varchar(127) NULL,
- del_cmd varchar(255) NULL,
- description varchar(255) NULL,
- dest_table varchar(30) NULL,
- old_filter int NULL,
- ins_cmd varchar(255) NULL,
- name varchar(30),
- objid int,
- pubid int,
- status tinyint,
- sync_objid int,
- type tinyint,
- upd_cmd varchar(255) NULL,
- source_table varchar(61) NULL, /* converted from objid */
- filter varchar(61) NULL, /* converted from old_filter */
- sync_object varchar(61) NULL, /* converted from sync_objid */
- vpartition bit NOT NULL, /* computed */
- pre_creation_cmd tinyint,
- filter_clause text NULL
- )
-
- CREATE UNIQUE INDEX idx1 ON #tab1 (name, pubid)
-
- /*
- ** Parameter Check: @publication.
- ** Check to make sure that there are some articles
- ** to display.
- */
-
- IF @publication IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @publication
-
- IF @retcode <> 0
- RETURN (1)
-
- IF NOT EXISTS (SELECT * FROM syspublications WHERE name = @publication)
- BEGIN
- RAISERROR (15001, 11, -1, @publication)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @article.
- ** Check to make sure that the article exists, that it conforms
- ** to the rules for identifiers, and that it isn't NULL.
- */
-
- IF @article IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The article')
- RETURN (1)
- END
-
- IF @article <> '%'
- BEGIN
-
- EXECUTE @retcode = sp_validname @article
-
- IF @retcode <> 0
- RETURN (1)
-
- IF NOT EXISTS (SELECT *
- FROM sysarticles
- WHERE name = @article
- AND pubid IN (SELECT pubid
- FROM syspublications
- WHERE name = @publication))
- BEGIN
- RAISERROR (15001, 11, -1, @article)
- RETURN (1)
- END
-
- END
-
- /*
- ** If local user show all articles.
- */
- IF @@REMSERVER IS NULL
- BEGIN
- IF @returnfilter = 1
- BEGIN
- INSERT INTO #tab1 (artid, columns, creation_script, del_cmd,
- description, dest_table, old_filter,
- ins_cmd, name, objid, pubid, status,
- sync_objid, type, upd_cmd, source_table,
- filter, vpartition, pre_creation_cmd,
- filter_clause)
- (SELECT artid, columns, creation_script, del_cmd, a.description,
- dest_table, filter, ins_cmd, a.name, objid, a.pubid,
- a.status, sync_objid, type, upd_cmd, NULL, NULL, 0,
- a.pre_creation_cmd, a.filter_clause
- FROM sysarticles a, syspublications b
- WHERE a.name LIKE @article
- AND a.pubid = b.pubid
- AND b.name = @publication)
- END
- ELSE
- BEGIN
- INSERT INTO #tab1 (artid, columns, creation_script, del_cmd,
- description, dest_table, old_filter,
- ins_cmd, name, objid, pubid, status,
- sync_objid, type, upd_cmd, source_table,
- filter, vpartition, pre_creation_cmd,
- filter_clause)
- (SELECT artid, columns, creation_script, del_cmd, a.description,
- dest_table, filter, ins_cmd, a.name, objid, a.pubid,
- a.status, sync_objid, type, upd_cmd, NULL, NULL, 0,
- a.pre_creation_cmd, NULL
- FROM sysarticles a, syspublications b
- WHERE a.name LIKE @article
- AND a.pubid = b.pubid
- AND b.name = @publication)
- END
- END
-
- ELSE
- BEGIN
-
- /*
- ** Check if remote server is defined as a subscription server.
- */
-
- IF NOT EXISTS (SELECT *
- FROM sysservers
- WHERE srvname = @@REMSERVER
- AND (srvstatus & @subscriber_bit) <> 0)
- BEGIN
- RAISERROR (14010, 16, -1)
- RETURN (1)
- END
-
- /*
- ** If the publication is public, we can display it.
- */
-
- IF NOT EXISTS (SELECT *
- FROM syspublications
- WHERE name = @publication
- AND restricted = 0)
-
- /*
- ** The publication wasn't public, so let's check to see
- ** if there's a restricted publication on which I have
- ** permission.
- */
-
- IF NOT EXISTS (SELECT *
- FROM syssubscriptions a,
- sysarticles b,
- syspublications c
- WHERE c.name = @publication
- AND c.restricted = 1
- AND c.pubid = b.pubid
- AND b.name LIKE @article
- AND b.artid = a.artid)
-
- BEGIN
- RAISERROR (14011, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Fetch the information into the temporary table. First, put
- ** in the information about public publications if this publi-
- ** cation is public. Next, if the publication is restricted,
- ** put in only those articles on which you have been granted
- ** access (sp_addsubscription).
- */
-
- IF @returnfilter = 1
- BEGIN
- INSERT INTO #tab1 (artid, columns, creation_script, del_cmd,
- description, dest_table, old_filter,
- ins_cmd, name, objid, pubid, status,
- sync_objid, type, upd_cmd, source_table,
- filter, vpartition, pre_creation_cmd,
- filter_clause)
- (SELECT a.artid, columns, creation_script, del_cmd, a.description,
- dest_table, filter, ins_cmd, a.name, objid, a.pubid,
- a.status, sync_objid, type, upd_cmd, NULL, NULL, 0,
- a.pre_creation_cmd, a.filter_clause
- FROM sysarticles a,
- syspublications b
- WHERE a.name LIKE @article
- AND a.pubid = b.pubid
- AND b.name = @publication
- AND b.restricted = 0)
-
- INSERT INTO #tab1 (artid, columns, creation_script, del_cmd,
- description, dest_table, old_filter,
- ins_cmd, name, objid, pubid, status,
- sync_objid, type, upd_cmd, source_table,
- filter, vpartition, pre_creation_cmd,
- filter_clause)
- (SELECT a.artid, columns, creation_script, del_cmd, a.description,
- dest_table, filter, ins_cmd, a.name, objid, a.pubid,
- a.status, sync_objid, type, upd_cmd, NULL, NULL, 0,
- a.pre_creation_cmd, a.filter_clause
- FROM sysarticles a,
- syspublications b,
- syssubscriptions c,
- master..sysservers d
- WHERE a.name LIKE @article
- AND a.pubid = b.pubid
- AND b.name = @publication
- AND b.restricted = 1
- AND a.artid = c.artid
- AND c.srvid = d.srvid
- AND d.srvname = @@REMSERVER)
- END
- ELSE
- BEGIN
- INSERT INTO #tab1 (artid, columns, creation_script, del_cmd,
- description, dest_table, old_filter,
- ins_cmd, name, objid, pubid, status,
- sync_objid, type, upd_cmd, source_table,
- filter, vpartition, pre_creation_cmd,
- filter_clause)
- (SELECT a.artid, columns, creation_script, del_cmd, a.description,
- dest_table, filter, ins_cmd, a.name, objid, a.pubid,
- a.status, sync_objid, type, upd_cmd, NULL, NULL, 0,
- a.pre_creation_cmd, NULL
- FROM sysarticles a,
- syspublications b
- WHERE a.name LIKE @article
- AND a.pubid = b.pubid
- AND b.name = @publication
- AND b.restricted = 0)
-
- INSERT INTO #tab1 (artid, columns, creation_script, del_cmd,
- description, dest_table, old_filter,
- ins_cmd, name, objid, pubid, status,
- sync_objid, type, upd_cmd, source_table,
- filter, vpartition, pre_creation_cmd,
- filter_clause)
- (SELECT a.artid, columns, creation_script, del_cmd, a.description,
- dest_table, filter, ins_cmd, a.name, objid, a.pubid,
- a.status, sync_objid, type, upd_cmd, NULL, NULL, 0,
- a.pre_creation_cmd, NULL
- FROM sysarticles a,
- syspublications b,
- syssubscriptions c,
- master..sysservers d
- WHERE a.name LIKE @article
- AND a.pubid = b.pubid
- AND b.name = @publication
- AND b.restricted = 1
- AND a.artid = c.artid
- AND c.srvid = d.srvid
- AND d.srvname = @@REMSERVER)
- END
- END
-
- UPDATE #tab1
- SET source_table = u.name + '.' + o.name
- FROM #tab1, sysobjects o, sysusers u
- WHERE o.id = #tab1.objid
- AND o.uid = u.uid
-
- UPDATE #tab1
- SET sync_object = sysusers.name + '.' + sysobjects.name
- FROM sysobjects, sysusers
- WHERE sysobjects.id = sync_objid
- AND sysobjects.uid = sysusers.uid
-
- UPDATE #tab1 SET filter = (SELECT sysusers.name + '.' + sysobjects.name
- FROM sysobjects, sysusers
- WHERE sysobjects.id = #tab1.old_filter
- AND sysobjects.uid = sysusers.uid)
- FROM #tab1
-
- EXECUTE ('DECLARE hC SCROLL CURSOR FOR SELECT name, pubid FROM #tab1')
- OPEN hC
- FETCH hC INTO @article, @pubid
- WHILE (@@fetch_status <> -1)
- BEGIN
- IF EXISTS (SELECT *
- FROM sysarticles a, syscolumns b
- WHERE (CONVERT(bit, SUBSTRING(a.columns, CONVERT(tinyint, 32 - FLOOR((colid-1)/8)), 1) & POWER(2, ((colid-1)%8))) = 0
- OR CONVERT(bit, SUBSTRING(a.columns, CONVERT(tinyint, 32 - FLOOR((colid-1)/8)), 1) & POWER(2, ((colid-1)%8))) IS NULL)
- AND a.objid = b.id
- AND a.name = @article
- AND a.pubid = @pubid)
-
- UPDATE #tab1
- SET vpartition = 1
- WHERE name = @article
- AND pubid = @pubid
-
- FETCH hC INTO @article, @pubid
- END
- CLOSE hC
- DEALLOCATE hC
-
- IF @returnfilter = 1
- SELECT 'article id' = artid,
- 'article name' = name,
- 'base table' = source_table,
- 'destination table' = dest_table,
- 'synchronization object' = sync_object,
- 'type' = type,
- 'status' = status,
- 'filter' = filter,
- 'description' = description,
- 'insert_command' = ins_cmd,
- 'update_command' = upd_cmd,
- 'delete_command' = del_cmd,
- 'creation script path' = creation_script,
- 'vertical partition' = vpartition,
- 'pre_creation_cmd' = pre_creation_cmd,
- 'filter_clause' = filter_clause
- FROM #tab1
- ORDER BY 2
- ELSE
- SELECT 'article id' = artid,
- 'article name' = name,
- 'base table' = source_table,
- 'destination table' = dest_table,
- 'synchronization object' = sync_object,
- 'type' = type,
- 'status' = status,
- 'filter' = filter,
- 'description' = description,
- 'insert_command' = ins_cmd,
- 'update_command' = upd_cmd,
- 'delete_command' = del_cmd,
- 'creation script path' = creation_script,
- 'vertical partition' = vpartition,
- 'pre_creation_cmd' = pre_creation_cmd
- FROM #tab1
- ORDER BY 2
- RETURN (0)
- go
-
- dump tran master with no_log
- go
-
- print ''
- print 'Creating procedure sp_articlecolumn.'
- go
- CREATE PROCEDURE sp_articlecolumn (
- @publication varchar(30), /* The publication name */
- @article varchar(30), /* The article name */
- @column varchar(30) = NULL, /* The column name */
- @operation varchar(4) = 'add' /* Add or delete a column */
- ) AS
-
- /*
- ** Declarations.
- */
-
- DECLARE @bit tinyint /* Bit offset */
- DECLARE @byte tinyint /* Byte offset */
- DECLARE @cnt tinyint, @idx tinyint /* Loop counter, index */
- DECLARE @columns binary(32) /* Temporary storage for the converted column */
- DECLARE @mask smallint /* Bit mask to set the bit on */
- DECLARE @newbyte binary(1) /* New byte to replace old byte with */
- DECLARE @oldbyte binary(1) /* Temporary storage for original byte */
- DECLARE @pubid int /* Publication identification number */
- DECLARE @retcode int /* Return code for stored procedures */
- DECLARE @zero binary(32) /* Constant: 0 */
- DECLARE @artid int
- DECLARE @inactive tinyint
- DECLARE @objid int /* Article base table id */
-
- select @inactive = 0
-
- /*
- ** Security Check
- ** Only the System Administratr (SA) or the Database Owner (dbo) can
- ** perform this procedure.
- */
-
- IF suser_id() <> 1 AND user_id() <> 1
- BEGIN
- RAISERROR (15000, 14, -1)
- RETURN (1)
- END
-
- /*
- ** Check to see if the database has been activated for publication.
- */
-
- IF (SELECT category & 1
- FROM master..sysdatabases
- WHERE name = DB_NAME()) = 0
-
- BEGIN
- RAISERROR (14013, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @publication.
- ** Make sure that the publication exists and that it conforms to the
- ** rules for identifiers.
- */
-
- IF @publication IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @publication
-
- IF @retcode <> 0
- RETURN (1)
-
- SELECT @pubid = pubid FROM syspublications WHERE name = @publication
-
- IF @pubid IS NULL
- BEGIN
- RAISERROR (15001, 11, -1, @publication)
- RETURN (1)
- END
- ELSE
-
- /*
- ** Parameter Check: @article.
- ** Check to make sure that the article exists in the publication.
- */
-
- IF @article IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The article')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @article
-
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
-
-
- /*
- ** Make sure the article exists.
- */
- SELECT @artid = artid FROM sysarticles
- WHERE pubid = @pubid AND name = @article
- IF @artid IS NULL
- BEGIN
- RAISERROR (15001, 11, -1, @article)
- RETURN (1)
- END
-
- /*
- ** Only unsubscribed articles may be modified.
- */
- IF EXISTS (SELECT * FROM syssubscriptions WHERE artid = @artid
- AND status <> @inactive)
- BEGIN
- RAISERROR (14092, 11, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @column.
- ** Check to make sure that the column exists and conforms to the rules
- ** for identifiers.
- */
-
- IF @column IS NOT NULL
- BEGIN
- EXECUTE @retcode = sp_validname @column
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @operation.
- ** The operation can be either 'add' or 'drop'.
- */
-
- IF LOWER(@operation) NOT IN ('add', 'drop')
- BEGIN
- RAISERROR (14019, 16, -1)
- RETURN (1)
- END
-
- BEGIN TRANSACTION articlecolumn
-
- /*
- ** Make sure that the columns column is not NULL.
- */
-
- SELECT @zero = 0x00
-
- SELECT @columns = columns
- FROM sysarticles
- WHERE artid = @artid
-
- IF @columns IS NULL
- UPDATE sysarticles
- SET columns = @zero
- WHERE artid = @artid
-
- SELECT @objid = (SELECT objid FROM sysarticles WHERE artid = @artid)
-
- /*
- ** If no columns are specified, or if NULL is specified, set all
- ** the bits in the 'columns' column so all columns will be included.
- */
-
- IF @column IS NULL
-
- BEGIN
-
- /*
- ** Fetch the number of columns affected.
- */
-
- SELECT @cnt = COUNT(*), @idx = 1
- FROM syscolumns
- WHERE id = @objid
-
- SELECT @columns = @zero
-
- WHILE @idx <= @cnt
- BEGIN
-
- SELECT @byte = CONVERT(tinyint, 32 - FLOOR((@idx-1)/8))
- SELECT @bit = (@idx-1) % 8
-
- IF LOWER(@operation) = 'add'
- SELECT @mask = POWER(2, @bit)
- ELSE
- SELECT @mask = ~POWER(2, @bit)
-
- SELECT @oldbyte = SUBSTRING(@columns, @byte, 1)
- IF @oldbyte IS NULL SELECT @oldbyte = 0x00
-
- IF LOWER(@operation) = 'add'
- SELECT @newbyte = CONVERT(binary(1), ASCII(@oldbyte) | @mask)
- ELSE
- SELECT @newbyte = CONVERT(binary(1), ASCII(@oldbyte) & @mask)
-
- SELECT @columns = CONVERT(binary(32), STUFF(@columns, @byte, 1, @newbyte))
- SELECT @idx = @idx + 1
-
-
- END
-
- IF LOWER(@operation) = 'drop'
- BEGIN
- /* Update Text\Image column status as not published */
- EXECUTE @retcode = sp_articletextcol @artid, NULL,
- 'publish', @operation
- IF (@@error <> 0 OR @retcode <> 0)
- BEGIN
- ROLLBACK TRANSACTION articlecolumn
- RAISERROR (14020, 16, -1)
- RETURN (1)
- END
- END
-
- UPDATE sysarticles
- SET columns = @columns
- WHERE name = @article
- AND pubid = @pubid
-
- IF LOWER(@operation) = 'add'
- BEGIN
- /* Update Text\Image column status as published */
- EXECUTE @retcode = sp_articletextcol @artid, NULL,
- 'publish', @operation
- IF (@@error <> 0 OR @retcode <> 0)
- BEGIN
- ROLLBACK TRANSACTION articlecolumn
- RAISERROR (14020, 16, -1)
- RETURN (1)
- END
- END
- END
-
- ELSE
-
- BEGIN
- IF EXISTS (SELECT *
- FROM sysarticles
- WHERE name = @article
- AND pubid = @pubid
- AND columns IS NULL)
-
- UPDATE sysarticles
- SET columns = @zero
- WHERE name = @article
- AND pubid = @pubid
-
- DECLARE @columnid tinyint /* Columnid-1 = bit to set */
-
- /*
- ** Get the column id for this column. We'll use the column id
- ** to determine the bit in the 'columns' column. The bit we want
- ** is equal to the columnid - 1.
- */
-
- SELECT @columnid = colid
- FROM syscolumns
- WHERE id = @objid AND name = @column
-
- IF ((@@error <> 0) OR (@columnid IS NULL))
- BEGIN
- ROLLBACK TRANSACTION articlecolumn
- RAISERROR (14020, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Obtain the byte offset and the bit offset, then set the
- ** mask column for the bit we want to turn on.
- */
-
- SELECT @byte = CONVERT(tinyint, 32 - FLOOR((@columnid-1)/8.0))
- SELECT @bit = (@columnid-1) % 8
-
- IF LOWER(@operation) = 'add'
- SELECT @mask = POWER(2, @bit)
- ELSE
- SELECT @mask = ~POWER(2, @bit)
-
- /*
- ** Save the columns column in a temporary local variable so we
- ** can twiddle the bit and then put it back into the table.
- */
-
- SELECT @columns = columns
- FROM sysarticles
- WHERE name = @article
- AND pubid = @pubid
-
- /*
- ** Fish out the byte we're interested in and save it in a
- ** a temporary local variable. If it's NULL, just set it
- ** to 0. Then apply the bitwise operator OR to twiddle the
- ** bit in the old byte and save it in another temporary
- ** local variable @newbyte.
- */
-
- SELECT @oldbyte = SUBSTRING(@columns, @byte, 1)
- IF @oldbyte IS NULL SELECT @oldbyte = 0x00
-
- IF LOWER(@operation) = 'add'
- SELECT @newbyte = CONVERT(binary(1), ASCII(@oldbyte) | @mask)
- ELSE
- SELECT @newbyte = CONVERT(binary(1), ASCII(@oldbyte) & @mask)
-
- /*
- ** Stuff the new byte into the varbinary column to replace the
- ** old byte.
- */
-
- SELECT @columns = CONVERT(varbinary(32), STUFF(@columns+@zero, @byte, 1, @newbyte))
-
- IF LOWER(@operation) = 'drop'
- BEGIN
- /* Update Text\Image column status as not published */
- EXECUTE @retcode = sp_articletextcol @artid, @columnid,
- 'publish', @operation
- IF (@@error <> 0 OR @retcode <> 0)
- BEGIN
- ROLLBACK TRANSACTION articlecolumn
- RAISERROR (14021, 16, -1)
- RETURN (1)
- END
- END
-
- /*
- ** Update the sysarticles table. Set the bit to 1 for the
- ** selected column.
- */
-
- UPDATE sysarticles
- SET columns = @columns
- WHERE name = @article
- AND pubid = @pubid
-
- IF @@error <> 0
- BEGIN
- ROLLBACK TRANSACTION articlecolumn
- RAISERROR (14021, 16, -1)
- RETURN (1)
- END
-
- IF LOWER(@operation) = 'add'
- BEGIN
- /* Update Text\Image column status as not published */
- EXECUTE @retcode = sp_articletextcol @artid, @columnid,
- 'publish', @operation
- IF (@@error <> 0 OR @retcode <> 0)
- BEGIN
- ROLLBACK TRANSACTION articlecolumn
- RAISERROR (14021, 16, -1)
- RETURN (1)
- END
- END
- END
- /*
- ** Force the article cache to be refreshed with the new definition.
- */
- EXECUTE sp_replflush
-
- COMMIT TRANSACTION articlecolumn
- go
-
- print ''
- print 'Creating procedure sp_helparticlecolumns.'
- go
- CREATE PROCEDURE sp_helparticlecolumns (
- @publication varchar(30), /* The publication name */
- @article varchar(30) /* The article name */
- ) AS
-
- /*
- ** Declarations.
- */
-
- DECLARE @columns binary(32)
- DECLARE @pubid int
- DECLARE @retcode int
-
- /*
- ** Parameter Check: @article.
- ** The @article name must conform to the rules for identifiers.
- */
-
- IF @article IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The article')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @article
-
- IF @retcode <> 0
- RETURN (1)
-
- /*
- ** Parameter Check: @publication.
- ** The @publication name must conform to the rules for identifiers.
- */
-
- IF @publication IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @publication
-
- IF @retcode <> 0
- RETURN (1)
-
- /*
- ** Get the pubid.
- */
-
- SELECT @pubid = pubid FROM syspublications WHERE name = @publication
-
- IF @pubid IS NULL
- BEGIN
- RAISERROR (14027, 11, -1, 'The publication')
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @article, @publication.
- ** Check to make sure that the article exists in this publication.
- */
-
- IF NOT EXISTS (SELECT *
- FROM sysarticles
- WHERE pubid = @pubid
- AND name = @article)
- BEGIN
- RAISERROR (15001, 11, -1, 'The article')
- RETURN (1)
- END
-
- IF @@REMSERVER IS NOT NULL
-
- /*
- ** Is the publication/article restricted?
- */
-
- IF EXISTS (SELECT *
- FROM syspublications
- WHERE pubid = @pubid
- AND restricted = 1)
-
- /*
- ** We have a restricted publication. Does the subscriber
- ** have access to it?
- */
-
- IF NOT EXISTS (SELECT *
- FROM sysarticles a,
- syssubscriptions b,
- master..sysservers c
- WHERE c.srvname = @@REMSERVER
- AND c.srvid = b.srvid
- AND b.artid = a.artid
- AND a.name = @article
- AND a.pubid = @pubid)
- BEGIN
- RAISERROR (14011, 16, -1)
- RETURN (1)
- END
-
- SELECT @columns = columns
- FROM sysarticles
- WHERE name = @article
- AND pubid = @pubid
-
- SELECT 'column id' = colid,
- 'column' = name,
- 'published' = CONVERT(bit, SUBSTRING(@columns, CONVERT(tinyint, 32 - FLOOR((colid-1)/8)), 1) & POWER(2, ((colid-1)%8)))
- FROM syscolumns
- WHERE id = (SELECT objid
- FROM sysarticles
- WHERE name = @article
- AND pubid = @pubid)
- go
-
- print ''
- print 'Creating procedure sp_helppublication.'
- go
-
- CREATE PROCEDURE sp_helppublication (
- @publication varchar(30) = '%' /* The publication name */
- ) AS
-
- SET NOCOUNT ON
-
- /*
- ** Declarations.
- */
-
- DECLARE @retcode int
- DECLARE @subscriber_bit smallint
-
- /*
- ** Initializations.
- */
-
- SELECT @subscriber_bit = 4
-
- /*
- ** If local user show all publications.
- */
- IF @@REMSERVER IS NULL
- BEGIN
-
- /*
- ** Parameter Check: @publication.
- ** Check to make sure that there are some publications
- ** to display.
- */
-
- IF @publication IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- IF @publication <> '%'
- BEGIN
-
- EXECUTE @retcode = sp_validname @publication
-
- IF @retcode <> 0
- RETURN (1)
- END
-
- IF @publication <> '%' AND NOT EXISTS (SELECT *
- FROM syspublications
- WHERE name = @publication)
- BEGIN
- RAISERROR (15001, 11, -1, @publication)
- RETURN (1)
- END
-
- SELECT 'pubid' = pubid,
- 'name' = name,
- 'restricted' = restricted,
- 'status' = status,
- 'task' = taskid,
- 'replication frequency' = repl_freq,
- 'synchronization method' = sync_method,
- 'description' = description
- FROM syspublications
- WHERE name LIKE @publication
- ORDER BY name
-
- IF @@ERROR <> 0 RETURN (1)
-
- END
-
- ELSE
- BEGIN
-
- /*
- ** Check if remote server is defined as a subscription server.
- */
-
- IF NOT EXISTS (SELECT *
- FROM sysservers
- WHERE srvname = @@REMSERVER
- AND (srvstatus & @subscriber_bit) <> 0)
- BEGIN
- RAISERROR (14010, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @publication.
- ** Check to make sure that there are some publications
- ** to display.
- */
-
- IF @publication IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- IF @publication <> '%'
- BEGIN
-
- EXECUTE @retcode = sp_validname @publication
-
- IF @retcode <> 0
- RETURN (1)
- END
-
- IF @publication <> '%'
- AND NOT EXISTS (SELECT *
- FROM syspublications
- WHERE restricted = 0
- AND name = @publication)
- AND NOT EXISTS (SELECT *
- FROM syspublications a,
- syssubscriptions b,
- sysarticles c,
- master..sysservers d
- WHERE a.restricted = 1
- AND a.name = @publication
- AND a.pubid = c.pubid
- AND c.artid = b.artid
- AND b.srvid = d.srvid
- AND d.srvname = @@REMSERVER)
- BEGIN
- RAISERROR (14011, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Display all public publications and all restricted publications
- ** allowed for the server.
- */
-
- SELECT 'pubid' = pubid,
- 'name' = name,
- 'restricted' = restricted,
- 'status' = status,
- 'task' = taskid,
- 'replication frequency' = repl_freq,
- 'synchronization method' = sync_method,
- 'description' = description
- FROM syspublications
- WHERE restricted = 0
- AND name LIKE @publication
- UNION
- SELECT a.pubid, a.name, a.restricted, a.status, a.taskid, a.repl_freq, a.sync_method, a.description
- FROM syspublications a,
- syssubscriptions b,
- sysarticles c,
- master..sysservers d
- WHERE a.restricted = 1
- AND a.name LIKE @publication
- AND a.pubid = c.pubid
- AND c.artid = b.artid
- AND b.srvid = d.srvid
- AND d.srvname = @@REMSERVER
- ORDER BY name
-
- IF @@ERROR <> 0 RETURN (1)
- END
-
- RETURN (0)
- go
-
- print ''
- print 'Creating procedure sp_helppublicationsync.'
- go
-
- CREATE PROCEDURE sp_helppublicationsync (
- @publication varchar(30) /* The publication name */
- ) AS
-
- SET NOCOUNT ON
-
- /*
- ** Declarations.
- */
-
- DECLARE @retcode int
- DECLARE @subscriber_bit smallint
- DECLARE @taskid int
- DECLARE @distributor varchar(30)
- DECLARE @distproc varchar (255)
-
- /*
- ** Initializations.
- */
-
- SELECT @subscriber_bit = 4
-
- /*
- ** If local user show all publications.
- */
- IF @@REMSERVER IS NULL
- BEGIN
-
- /*
- ** Parameter Check: @publication.
- ** Check to make sure that there are some publications
- ** to display.
- */
-
- IF @publication IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- IF @publication = '%'
- BEGIN
- RAISERROR (14003, 16, -1, 'The publication')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @publication
- IF @@ERROR <> 0 OR @retcode <> 0 RETURN (1)
-
- IF NOT EXISTS (SELECT * FROM syspublications
- WHERE name = @publication)
- BEGIN
- RAISERROR (15001, 11, -1, @publication)
- RETURN (1)
- END
-
- END
-
- ELSE
- BEGIN
-
- /*
- ** Check if remote server is defined as a subscription server.
- */
-
- IF NOT EXISTS (SELECT *
- FROM sysservers
- WHERE srvname = @@REMSERVER
- AND (srvstatus & @subscriber_bit) <> 0)
- BEGIN
- RAISERROR (14010, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @publication.
- ** Check to make sure that there are some publications
- ** to display.
- */
-
- IF @publication IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- IF @publication = '%'
- BEGIN
- RAISERROR (14003, 16, -1, 'The publication')
- RETURN (1)
- END
-
- IF NOT EXISTS (SELECT *
- FROM syspublications
- WHERE restricted = 0
- AND name = @publication)
- AND NOT EXISTS (SELECT *
- FROM syspublications a,
- syssubscriptions b,
- sysarticles c,
- master..sysservers d
- WHERE a.restricted = 1
- AND a.name = @publication
- AND a.pubid = c.pubid
- AND c.artid = b.artid
- AND b.srvid = d.srvid
- AND d.srvname = @@REMSERVER)
- BEGIN
- RAISERROR (14011, 16, -1)
- RETURN (1)
- END
-
- END
-
- /*
- ** Get the publication sync task id
- */
- SELECT @taskid = taskid FROM syspublications WHERE name LIKE @publication
- IF @@ERROR <> 0 RETURN (1)
-
- /*
- ** Get distribution server information for remote RPC
- ** task verification.
- */
- EXEC @retcode = sp_helpdistributor @distributor = @distributor OUTPUT
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14071, 16, -1)
- RETURN (1)
- END
-
- /*
- ** The @taskid must exists in the systasks table.
- */
- SELECT @distproc = RTRIM(@distributor) + '.msdb..sp_verifytaskid'
- EXECUTE @retcode = @distproc @taskid = @taskid, @subsystem = 'Sync'
- IF @@ERROR <> 0 or @retcode <> 0
- BEGIN
- RAISERROR (14002, 16, -1, @taskid)
- RETURN (1)
- END
-
- /*
- ** Return sync task information
- */
- SELECT @distproc = RTRIM(@distributor) + '.msdb..sp_helptask'
- EXECUTE @retcode = @distproc @taskid = @taskid, @mode = 'full'
- IF @@ERROR <> 0 or @retcode <> 0
- RETURN (1)
- go
-
- print ''
- print 'Creating procedure sp_helpreplicationdb.'
- go
-
- CREATE PROCEDURE sp_helpreplicationdb
- @dbname varchar (30) = '%', @type varchar(30) = 'pub'
- AS
-
- SET NOCOUNT ON
-
- /*
- ** Declarations.
- */
-
- DECLARE @retcode int, @typebit int
-
- if (lower(@type) like 'pub%')
- select @typebit = 1
- else if (lower(@type) like 'sub%')
- select @typebit = 2
- else
- begin
- raiserror(14091,-1,-1)
- return 1
- end
-
- /*
- ** Parameter Check: @dbname.
- ** Check to make sure that the database name conforms to the rules
- ** for identifiers.
- */
-
-
- IF @dbname <> '%'
- BEGIN
- EXECUTE @retcode = sp_validname @dbname
-
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
- END
-
- /*
- ** Show databases with this option enabled.
- */
-
- SELECT name
- FROM sysdatabases
- WHERE name LIKE @dbname
- AND (category & @typebit) <> 0
- go
-
-
- print ''
- print 'Creating procedure sp_enumdsn.'
- go
- CREATE PROCEDURE sp_enumdsn
- AS
-
- SET NOCOUNT ON
-
- DECLARE @distributor varchar(30)
- DECLARE @distproc varchar (255)
- DECLARE @retcode int
-
- /*
- ** Get distribution server information for remote RPC
- ** subscription calls.
- */
-
- EXEC @retcode = sp_helpdistributor @distributor = @distributor OUTPUT
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14071, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Call xp_enumdsn
- */
- SELECT @distproc = RTRIM(@distributor) + '.master..xp_enumdsn'
- EXEC @retcode = @distproc
- IF @@error <> 0
- BEGIN
- RAISERROR (14071, 16, -1)
- RETURN (1)
- END
-
- go
-
- print ''
- print 'Creating procedure sp_enumfullsubscribers.'
- go
-
- CREATE PROCEDURE sp_enumfullsubscribers (
- @publication varchar(30) = '%' /* The publication name */
- ) AS
-
- /*
- ** Declarations.
- */
-
- DECLARE @retcode int
-
- /*
- ** Parameter Check: @publication.
- ** Check to make sure that the publication exists and that it conforms
- ** to the rules for identifiers.
- */
-
- IF @publication IS NOT NULL
- BEGIN
-
- IF @publication <> '%'
- BEGIN
-
- EXECUTE @retcode = sp_validname @publication
-
- IF @retcode <> 0
- RETURN (1)
- END
-
- IF NOT EXISTS (SELECT * FROM syspublications WHERE name LIKE @publication)
- BEGIN
- RAISERROR (15001, 11, -1, @publication)
- RETURN (1)
- END
-
- END
-
- ELSE
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- /*
- ** Select all subscribers who subscribe to all articles in the desired
- ** publication.
- */
-
- SELECT DISTINCT 'subscriber' = sv.srvname
- FROM syspublications p,
- sysarticles s,
- syssubscriptions ss,
- master..sysservers sv
- WHERE p.name LIKE @publication
- AND p.pubid = s.pubid
- AND s.artid = ss.artid
- AND ss.srvid = sv.srvid
- AND NOT EXISTS (SELECT *
- FROM sysarticles s2
- WHERE s2.pubid = p.pubid
- AND NOT EXISTS (SELECT *
- FROM syssubscriptions ss2,
- master..sysservers sv2
- WHERE s2.artid = ss2.artid
- AND ss2.srvid = sv2.srvid
- AND sv2.srvid = sv.srvid))
- go
-
- print ''
- print 'Creating procedure sp_helpsubscriberinfo'
- go
-
- CREATE PROCEDURE sp_helpsubscriberinfo
- @subscriber varchar (30)
- AS
-
- SET NOCOUNT ON
-
- DECLARE @distributor varchar(30)
- DECLARE @distribdb varchar(30)
- DECLARE @distproc varchar (255)
- DECLARE @retcode int
-
- /*
- ** Check if subscriber is valid
- */
-
- IF @subscriber IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The subscriber')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @subscriber
-
- IF @retcode <> 0
- RETURN (1)
-
- IF NOT EXISTS (SELECT *
- FROM master..sysservers
- WHERE srvname = @subscriber)
-
- BEGIN
- RAISERROR (14209, 16, -1, @subscriber)
- RETURN (1)
- END
-
- /*
- ** Get distribution server information for remote RPC
- ** subscription calls.
- */
-
- EXEC @retcode = sp_helpdistributor @distributor = @distributor OUTPUT,
- @distribdb = @distribdb OUTPUT
-
- IF @@error <> 0 OR @retcode <> 0 OR @distribdb IS NULL OR @distributor IS NULL
- BEGIN
- RAISERROR (14071, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Retrieve MSsubscriber_info
- */
-
- SELECT @distproc = RTRIM(@distributor) + '.' +
- RTRIM(@distribdb) + '..sp_MShelp_subscriber_info '
-
- EXEC @retcode = @distproc @@SERVERNAME, @subscriber
-
- IF @@error <> 0
- BEGIN
- RAISERROR (14071, 16, -1)
- RETURN (1)
- END
-
- IF @retcode <> 0
- BEGIN
- RAISERROR (14085, 16, -1)
- RETURN (1)
- END
-
- go
-
- print ''
- print 'Creating procedure sp_helpsubscription.'
- go
-
- CREATE PROCEDURE sp_helpsubscription
- @publication varchar (30) = '%', /* The publication name */
- @article varchar (30) = '%', /* The article name */
- @subscriber varchar (30) = '%' /* The subscriber name */
- AS
-
- SET NOCOUNT ON
-
- /*
- ** Declarations.
- */
-
- DECLARE @retcode int
- DECLARE @subscriber_bit smallint
-
-
- /*
- ** Initializations.
- */
- SELECT @subscriber_bit = 4
-
- /*
- ** Parameter Check: @subscriber.
- ** If remote server, limit the view to the remote server's subscriptions.
- ** Make sure that the name isn't NULL.
- */
-
- IF @@REMSERVER IS NOT NULL SELECT @subscriber = @@REMSERVER
-
- IF @subscriber IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The subscriber')
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @subscriber.
- ** Check if remote server is defined as a subscription server, and
- ** that the name conforms to the rules for identifiers.
- */
-
- IF @subscriber <> '%'
- BEGIN
-
- EXECUTE @retcode = sp_validname @subscriber
-
- IF @retcode <> 0
- RETURN (1)
-
- IF NOT EXISTS (SELECT *
- FROM sysservers
- WHERE srvname = @subscriber
- AND (srvstatus & @subscriber_bit) <> 0)
- BEGIN
- RAISERROR (14010, 16, -1)
- RETURN (1)
- END
- END
-
- /*
- ** Parameter Check: @publication.
- ** If the publication name is specified, check to make sure that it
- ** conforms to the rules for identifiers and that the publication
- ** actually exists. Disallow NULL.
- */
-
- IF @publication IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- IF @publication <> '%'
- BEGIN
-
- EXECUTE @retcode = sp_validname @publication
-
- IF @retcode <> 0
- RETURN (1)
-
- IF NOT EXISTS (SELECT * FROM syspublications WHERE name LIKE @publication)
- BEGIN
- IF @publication = '%'
- RAISERROR (14008, 11, -1)
- ELSE
- RAISERROR (15001, 11, -1, @publication)
- RETURN (1)
- END
-
- END
-
- /*
- ** Parameter Check: @article.
- ** If the article name is specified, check to make sure that it
- ** conforms to the rules for identifiers and that the article
- ** actually exists. Disallow NULL.
- */
-
- IF @article IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The article')
- RETURN (1)
- END
-
- IF @article <> '%'
- BEGIN
-
- EXECUTE @retcode = sp_validname @article
-
- IF @retcode <> 0
- RETURN (1)
-
- IF NOT EXISTS (SELECT *
- FROM sysarticles
- WHERE name = @article
- AND pubid IN (SELECT pubid
- FROM syspublications
- WHERE name LIKE @publication))
- BEGIN
- RAISERROR (15001, 11, -1, @article)
- RETURN (1)
- END
-
- END
-
- /*
- ** Get subscriptions
- */
-
- SELECT 'subscriber' = ss.srvname,
- 'publication' = pub.name,
- 'article' = art.name,
- 'destination database' = sub.dest_db,
- 'subscription status' = sub.status,
- 'synchronization type' = sub.sync_type
- FROM syssubscriptions sub,
- sysservers ss,
- syspublications pub,
- sysarticles art
- WHERE ss.srvname LIKE @subscriber
- AND sub.srvid = ss.srvid
- AND pub.name LIKE @publication
- AND art.name LIKE @article
- AND art.pubid = pub.pubid
- AND sub.artid = art.artid
- ORDER BY subscriber, publication, article
- go
-
- print ''
- print 'Creating procedure sp_replica.'
- go
-
- CREATE PROCEDURE sp_replica (
- @tabname varchar(92), /* The table being replicated */
- @replicated varchar(5) /* True or false */
- ) AS
-
- /*
- ** Declarations.
- */
-
- DECLARE @db varchar(30)
- DECLARE @id int
- DECLARE @object varchar(30)
- DECLARE @owner varchar(30)
- DECLARE @replica_bit int
- DECLARE @retcode int
- DECLARE @site varchar(30)
-
- /*
- ** Initializations.
- */
-
- SELECT @replica_bit = 256
-
- /*
- ** Parameter Check: @tabname.
- ** Check to make sure that the table exists and that it conforms to the
- ** rules for identifiers.
- */
-
- IF @tabname IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The table')
- RETURN (1)
- END
-
- EXECUTE sp_namecrack @tabname,
- @site OUTPUT,
- @db OUTPUT,
- @owner OUTPUT,
- @object OUTPUT
-
- EXECUTE @retcode = sp_validname @object
-
- IF @@ERROR <> 0 OR @retcode <> 0
- return(1)
-
- IF @owner IS NOT NULL
- BEGIN
-
- EXECUTE @retcode = sp_validname @owner
-
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
- END
-
- IF @db IS NOT NULL
- BEGIN
-
- EXECUTE @retcode = sp_validname @db
-
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
-
- IF @db <> DB_NAME()
- BEGIN
- RAISERROR (14004, 16, -1, @object)
- RETURN (1)
- END
-
- END
-
- SELECT @id = OBJECT_ID (@tabname)
- IF @id IS NULL
- BEGIN
- RAISERROR (15001, 11, -1, @tabname)
- RETURN (1)
- END
-
- IF NOT EXISTS (SELECT * FROM sysobjects WHERE id = @id AND type = 'U')
- BEGIN
- RAISERROR (14028, 11, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @replicated.
- ** Check to make sure that the value is {true | false}.
- */
-
- IF LOWER(@replicated) NOT IN ('true', 'false')
- BEGIN
- RAISERROR (14081, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Set the category bit on or off depending upon @replicated.
- */
-
- IF LOWER(@replicated) IN ('true') /* Turn on bit */
- UPDATE sysobjects
- SET category = category | @replica_bit
- WHERE id = @id
- AND type = 'U'
- ELSE /* Turn off bit */
- UPDATE sysobjects
- SET category = category & ~@replica_bit
- WHERE id = @id
- AND type = 'U'
-
- IF @@ERROR <> 0
- BEGIN
- RAISERROR (14083, 16, -1)
- RETURN (1)
- END
-
- IF LOWER(@replicated) IN ('true')
- PRINT 'The object was successfully marked as a replicated object.'
- ELSE
- PRINT 'The object was successfully unmarked as a replicated object.'
-
- RETURN (0)
- go
-
- print ''
- print 'Creating procedure sp_articlefilter.'
- go
- create procedure sp_articlefilter
- @publication varchar(30), /* publication name */
- @article varchar(30), /* article name */
- @filter_name varchar (92) = NULL, /* name of filter procedure*/
- @filter_clause text = '' /* article's filter clause */
-
- as
-
- declare @pubid smallint
- declare @table_name varchar (30)
- declare @user_name varchar (30)
- declare @qualified_table_name varchar (61)
- declare @filter_id int
- declare @type tinyint
- declare @previous_proc varchar (30)
- declare @retcode int
- declare @site varchar(30)
- declare @db varchar(30)
- declare @owner varchar(30)
- declare @object varchar(30)
- declare @artid int
- declare @inactive tinyint
-
-
- select @inactive = 0
-
- /*
- ** Security Check.
- ** Only the System Administrator (SA) or the Database Owner (dbo) can
- ** add an article view.
- */
- if suser_id() <> 1 and user_id() <> 1
- begin
- RAISERROR (15000, 14, -1)
- return (1)
- end
-
- /*
- ** Parameter Check: @publication.
- ** Make sure that the publication exists and that it conforms to the
- ** rules for identifiers.
- */
- if @publication is null
- begin
- RAISERROR (14043, 16, -1, 'The publication')
- return (1)
- END
-
- execute @retcode = sp_validname @publication
- if @retcode <> 0
- RETURN (1)
-
- select @pubid = pubid from syspublications where name = @publication
-
- if @pubid is null
- begin
- RAISERROR (15001, 11, -1, @publication)
- return (1)
- end
-
- /*
- ** Parameter Check: @article.
- ** Check to make sure that the article exists in the publication.
- */
-
- if @article is null
- begin
- RAISERROR (14043, 16, -1, 'The article')
- return (1)
- end
-
- execute @retcode = sp_validname @article
- if @retcode <> 0
- return (1)
-
- /*
- ** Get the article information.
- */
- select @artid = art.artid, @table_name = so.name, @type = art.type,
- @filter_id = art.filter, @user_name = USER_NAME(so.uid)
- from sysarticles art, sysobjects so
- where art.pubid = @pubid
- and art.name = @article
- and art.objid = so.id
-
- /*
- ** Fail if there is no article information.
- */
- if @artid is null
- begin
- RAISERROR (15001, 11, -1, @article)
- return (1)
- end
-
- /*
- ** Only unsubscribed articles may be modified.
- */
- if exists (select * from syssubscriptions where artid = @artid
- and status <> @inactive)
- begin
- RAISERROR (14092, 11, -1)
- RETURN (1)
- end
-
- /*
- ** Make sure a valid @filter_name was provided and it is
- ** a valid name.
- */
- if datalength(@filter_clause) > 1
- begin
- /*
- ** Make sure a valid @filter_name was provided and it is
- ** a valid name.
- */
- if @filter_name is null
- begin
- RAISERROR (14043, 16, -1, 'The filter_name')
- return (1)
- end
-
- execute sp_namecrack @filter_name,
- @site OUTPUT,
- @db OUTPUT,
- @owner OUTPUT,
- @object OUTPUT
-
- execute @retcode = sp_validname @object
- if @retcode <> 0
- return (1)
- end
-
- /*
- ** If the article has a generated filter (not manually created), then
- ** drop the current filter before creating the new one.
- */
- if ((@type & 0x3) <> 0x3) and @filter_id <> 0
- begin
- select @previous_proc = object_name (@filter_id)
- if @previous_proc is not null and
- exists (select * from sysobjects where name = @previous_proc
- and type = 'RF')
- begin
- exec ('drop procedure ' + @previous_proc)
- if @@error <> 0
- return (1)
- end
-
- end
-
- /*
- ** make an owner qualified table name for these operations name
- */
-
- select @qualified_table_name = @user_name + '.' + @table_name
-
- /*
- ** If there is a @filter_clause, create the new filter and
- ** update the article filter id and filter_clause.
- **/
- if datalength(@filter_clause) > 1
- begin
- exec ('create procedure ' + @object +
- ' for replication as ' +
- 'if exists (select * from ' + @qualified_table_name +
- ' where ' + @filter_clause +
- ') return 1 else return 0')
- if @@error <> 0
- return (1)
-
- select @filter_id = id from sysobjects where name = @object
- and type = 'RF'
- if @filter_id is null or @filter_id = 0
- begin
- RAISERROR (15001, 11, -1, @object)
- return (1)
- end
-
- /*
- ** Update article
- */
- update sysarticles set filter = @filter_id,
- filter_clause = @filter_clause
- where pubid = @pubid
- and name = @article
- end
- else
- /*
- ** Clear the filter id and filter_clause.
- */
- update sysarticles set filter = 0,
- filter_clause = NULL
- where pubid = @pubid
- and name = @article
-
- /*
- ** Force the article cache to be refreshed with the new definition.
- */
- EXECUTE sp_replflush
- go
-
- print ''
- print 'Creating procedure sp_articletextcol.'
- go
- CREATE PROCEDURE sp_articletextcol (
- @artid int,
- @colid tinyint = NULL,
- @type varchar(10), /* 'publish', 'nonsqlsub' */
- @operation varchar(5)) /* 'add', 'drop' */
- AS
-
- /*
- ** Declarations.
- */
- DECLARE @cmd char(255)
- DECLARE @cmd1 char(255)
- DECLARE @columns binary(32) /* Temporary storage for the converted column */
- DECLARE @tabid int /* Article base table id */
- DECLARE @retcode int
- DECLARE @status bit
- DECLARE @image tinyint /* Constant: 0x22 */
- DECLARE @text tinyint /* Constant: 0x23 */
- DECLARE @publish tinyint /* Constant: 0x10 */
- DECLARE @nonsqlsub tinyint /* Constant: 0x20 */
-
- /* Constants */
- SELECT @image = 0x22
- SELECT @text = 0x23
- SELECT @publish = 0x10
- SELECT @nonsqlsub = 0x20
-
- /*
- ** Security Check
- ** Only the System Administratr (SA) or the Database Owner (dbo)
- ** can execute this procedure.
- */
- IF suser_id() <> 1 AND user_id() <> 1
- BEGIN
- RAISERROR (14093, 14, -1)
- RETURN (1)
- END
-
- SELECT @tabid = objid FROM sysarticles WHERE artid = @artid
-
- SELECT @cmd = @cmd + 'DECLARE hCarttextcol CURSOR FOR'
-
- IF @colid IS NULL
- BEGIN
- SELECT @cmd = @cmd + ' SELECT colid FROM syscolumns, sysarticles'
- SELECT @cmd = @cmd + ' WHERE artid = ' + CONVERT(varchar(10), @artid)
- SELECT @cmd = @cmd + ' AND id = ' + CONVERT(varchar(10), @tabid)
- SELECT @cmd = @cmd + ' AND (syscolumns.type = 0x22 OR syscolumns.type = 0x23)'
- SELECT @cmd1 = @cmd1 + ' AND CONVERT(bit, SUBSTRING(columns,'
- SELECT @cmd1 = @cmd1 + ' CONVERT(tinyint, 32 - FLOOR((colid-1)/8)),'
- SELECT @cmd1 = @cmd1 + ' 1) & POWER(2, ((colid-1)%8))) = 1'
- EXECUTE (@cmd + @cmd1)
- END
- ELSE
- BEGIN
- SELECT @cmd = @cmd + ' SELECT colid FROM syscolumns WHERE id ='
- SELECT @cmd = @cmd + ' ' + CONVERT(varchar(10), @tabid)
- SELECT @cmd = @cmd + ' AND colid =' + CONVERT(varchar(10), @colid)
- SELECT @cmd = @cmd + ' AND (type = 0x22 OR type = 0x23)'
- EXECUTE (@cmd)
- END
-
-
- /* Process each Text\Image column in the article */
- OPEN hCarttextcol
- FETCH hCarttextcol INTO @colid
- WHILE (@@fetch_status <> -1)
- BEGIN
-
- IF LOWER(@operation) = 'add'
- BEGIN
- IF LOWER(@type) = 'publish'
- UPDATE syscolumns
- SET status = status | @publish
- WHERE id = @tabid
- AND colid = @colid
- ELSE
- UPDATE syscolumns
- SET status = status | @nonsqlsub
- WHERE id = @tabid
- AND colid = @colid
- END
- ELSE /* drop */
- BEGIN
- /*
- ** Is there another non-sql server subscription on the column?
- ** Or another article publishing the column?
- */
- EXEC @retcode = sp_textcolstatus @artid, @tabid, @colid,
- @type, @status OUTPUT
-
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- CLOSE hCarttextcol
- DEALLOCATE hCarttextcol
- RETURN (1)
- END
-
- IF (@status = 0)
- BEGIN
- IF LOWER(@type) = 'publish'
- /* Clear 'publish' bit */
- UPDATE syscolumns
- SET status = status & ~@publish
- WHERE id = @tabid
- AND colid = @colid
- ELSE
- /* Clear 'non-sql server subscription' bit */
- UPDATE syscolumns
- SET status = status & ~@nonsqlsub
- WHERE id = @tabid
- AND colid = @colid
- END
- END
- FETCH hCarttextcol INTO @colid
- END
-
- CLOSE hCarttextcol
- DEALLOCATE hCarttextcol
-
- GO
-
- print ''
- print 'Creating procedure sp_textcolstatus.'
- go
- CREATE PROCEDURE sp_textcolstatus (
- @artid int,
- @tabid int,
- @colid int,
- @type varchar (10), /* 'publish', 'nonsqlsub' */
- @status bit OUTPUT)
- AS
-
- /*
- ** Declarations.
- */
- DECLARE @cmd char(255)
- DECLARE @artid2 int
- DECLARE @columns binary(32)
- DECLARE @replicate tinyint /* Constant: 0x10 */
- DECLARE @nonsqlsub tinyint /* Constant: 0x20 */
- DECLARE @image tinyint /* Constant: 0x22 */
- DECLARE @text tinyint /* Constant: 0x23 */
-
- /* Constants */
- SELECT @image = 0x22
- SELECT @text = 0x23
-
- SELECT @status = 0
-
- /*
- ** Security Check
- ** Only the System Administratr (SA) or the Database Owner (dbo)
- ** can execute this procedure.
- */
- IF suser_id() <> 1 AND user_id() <> 1
- BEGIN
- RAISERROR (14093, 14, -1)
- RETURN (1)
- END
-
- IF LOWER(@type) = 'nonsqlsub'
- BEGIN
- /*
- ** Check all active or subscribed articles for the TEXT/IMAGE column.
- */
- SELECT @cmd = @cmd + 'DECLARE hC4 CURSOR FOR '
- SELECT @cmd = @cmd + ' SELECT sub.artid FROM sysarticles art, syssubscriptions sub'
- SELECT @cmd = @cmd + ' WHERE art.objid = ' + CONVERT(varchar(10), @tabid)
- SELECT @cmd = @cmd + ' AND art.artid <> ' + CONVERT(varchar(10), @artid)
- SELECT @cmd = @cmd + ' AND sub.artid = art.artid'
- SELECT @cmd = @cmd + ' AND sub.status = 1 OR sub.status = 2'
- END
- ELSE
- BEGIN
- /*
- ** Check all articles for the TEXT/IMAGE column.
- */
- SELECT @cmd = @cmd + 'DECLARE hC4 CURSOR FOR '
- SELECT @cmd = @cmd + ' SELECT artid FROM sysarticles '
- SELECT @cmd = @cmd + ' WHERE objid = ' + CONVERT(varchar(10), @tabid)
- SELECT @cmd = @cmd + ' AND artid <> ' + CONVERT(varchar(10), @artid)
- END
-
- EXECUTE (@cmd)
- OPEN hC4
- FETCH hC4 INTO @artid2
- WHILE (@@fetch_status <> -1)
- BEGIN
- SELECT @columns = columns FROM sysarticles WHERE artid = @artid2
-
- IF EXISTS (SELECT * FROM syscolumns
- WHERE id = @tabid
- AND colid = @colid
- AND CONVERT(bit, SUBSTRING(@columns, CONVERT(tinyint,
- 32 - FLOOR((colid-1)/8)), 1) & POWER(2, ((colid-1)%8))) = 1
- AND (type = @image OR type = @text))
- BEGIN
- SELECT @status = 1
- GOTO CLEANUP
- END
-
- FETCH hC4 INTO @artid2
- END
-
- CLEANUP:
- CLOSE hC4
- DEALLOCATE hC4
-
- RETURN (0)
- GO
-
- print ''
- print 'Creating procedure sp_articleview.'
- go
- create procedure sp_articleview
- @publication varchar(30), /* Publication name */
- @article varchar(30), /* Article name */
- @view_name varchar (92) = NULL, /* View name */
- @filter_clause text = '' /* Article's filter clause */
-
- as
- declare @pubid smallint
- declare @table_name varchar (30)
- declare @user_id int
- declare @user_name varchar (30)
- declare @qualified_table_name varchar (61)
- declare @columns varbinary (32)
- declare @name varchar (30)
- declare @col_clause1 varchar (255)
- declare @col_clause2 varchar (255)
- declare @retcode int
- declare @view_id int
- declare @type tinyint
- declare @table_id int
- declare @previous_view varchar (30)
- declare @colid int
- declare @site varchar(30)
- declare @db varchar(30)
- declare @owner varchar(30)
- declare @object varchar(30)
- declare @artid int
- declare @inactive tinyint
-
-
- select @inactive = 0
-
- /*
- ** Security Check.
- ** Only the System Administrator (SA) or the Database Owner (dbo) can
- ** add an article view.
- */
- if suser_id() <> 1 and user_id() <> 1
- begin
- RAISERROR (15000, 14, -1)
- return (1)
- end
-
- /*
- ** Parameter Check: @publication.
- ** Make sure that the publication exists and that it conforms to the
- ** rules for identifiers.
- */
- if @publication is null
- begin
- RAISERROR (14043, 16, -1, 'The publication')
- return (1)
- END
-
- execute @retcode = sp_validname @publication
- if @retcode <> 0
- RETURN (1)
-
- select @pubid = pubid from syspublications where name = @publication
- if @pubid is null
- begin
- RAISERROR (15001, 11, -1, @publication)
- return (1)
- end
-
- /*
- ** Parameter Check: @article.
- ** Check to make sure that the article exists in the publication.
- */
-
- if @article is null
- begin
- RAISERROR (14043, 16, -1, 'The article')
- return (1)
- end
-
- execute @retcode = sp_validname @article
- if @retcode <> 0
- return (1)
-
- /*
- ** Get the article information.
- */
- select @artid = art.artid, @table_name = so.name,
- @user_id = uid, @user_name = USER_NAME(so.uid),
- @columns = art.columns, @type = art.type,
- @view_id = art.sync_objid, @table_id = art.objid
- from sysarticles art, sysobjects so
- where art.pubid = @pubid
- and art.name = @article
- and art.objid = so.id
-
- /*
- ** Fail if there is no article information.
- */
- if @artid is null
- begin
- RAISERROR (15001, 11, -1, @article)
- return (1)
- end
-
- /*
- ** Only unsubscribed articles may be modified.
- */
- if exists (select * from syssubscriptions where artid = @artid
- and status <> @inactive)
- begin
- RAISERROR (14092, 11, -1)
- RETURN (1)
- end
-
-
- /*
- ** Create a table of all the articles columns.
- */
- create table #tmp (colid int, name varchar(30), published bit)
- if @@error <> 0
- return (1)
-
- create unique index ind1 on #tmp (colid)
- if @@error <> 0
- begin
- drop table #tmp
- return (1)
- end
-
- insert into #tmp select colid, name,
- convert(bit, substring(@columns, convert(tinyint,
- 32 - floor((colid-1)/8)), 1) & POWER(2, ((colid-1)%8)))
- from syscolumns
- where id = (select id from sysobjects where name = @table_name and
- uid = @user_id and type = 'U')
-
- /* Break out the specified view name and get the non-ownerqual'd name, then validate that. */
- execute sp_namecrack @view_name, @site OUTPUT, @db OUTPUT, @owner OUTPUT, @object OUTPUT
- execute @retcode = sp_validname @object
- if @retcode <> 0
- return (1)
-
- /* If no non-published columns, we'll select all and avoid the 510-byte limit on column strings. */
- if not exists (select * from #tmp where published = 0) begin
- select @col_clause1 = null
- select @col_clause2 = null
- goto CreateView
- end
-
- /*
- ** Construct the column list based on all published columns in the
- ** article.
- */
- execute ('declare hC scroll cursor for select colid, name from #tmp
- where published = 1')
- open hC
- fetch hC into @colid, @name
- while (@@fetch_status <> -1)
- begin
-
- if @col_clause1 is null or
- ((datalength(@name) + datalength(@col_clause1) + 2) < 255)
- if @col_clause1 is null
- select @col_clause1 = @name
- else
- select @col_clause1 = @col_clause1 + ', ' + @name
-
- else if @col_clause2 is null or
- ((datalength(@name) + datalength(@col_clause2) + 2) < 255)
- begin
- if @col_clause2 is null
- select @col_clause2 = @name
- else
- select @col_clause2 = @col_clause2 + ', ' +
- @name
- end
- else
- /*
- ** The procedure only support ~510 bytes for the column list
- */
- begin
- RAISERROR (14039, 16, -1)
- close hC
- deallocate hC
- drop table #tmp
- return (1)
- end
- fetch hC into @colid, @name
- end
-
- close hC
- deallocate hC
-
- CreateView:
- /*
- ** If the article has a generated view (not manually created), then
- ** drop the current view before creating the new one.
- */
- if ((@type & 0x5) <> 0x5) and @view_id <> 0
- and @view_id <> @table_id
- begin
- select @previous_view = object_name (@view_id)
- if @previous_view is not null and
- exists (select * from sysobjects where name = @previous_view
- and type = 'V')
- exec ('drop view ' + @previous_view)
- end
-
- /*
- ** If a view is going to be created. Make sure a valid @view_name
- ** was provided.
- */
- if @col_clause1 is not null or @col_clause2 is not null
- begin
- if @view_name is null
- begin
- RAISERROR (14043, 16, -1, 'The view_name')
- return (1)
- end
- end
-
- /*
- ** make an owner qualified table name for these operations name
- */
-
- select @qualified_table_name = @user_name + '.' + @table_name
-
- /*
- ** Construct and execute the view creation command.
- */
- if @col_clause2 is not null
- begin
- if datalength(@filter_clause) > 1
- exec ('create view ' + @object + ' as select ' +
- @col_clause1 + @col_clause2 + ' from ' +
- @qualified_table_name + ' where ' + @filter_clause)
- else
- exec ('create view ' + @object + ' as select ' +
- @col_clause1 + @col_clause2 + ' from ' +
- @qualified_table_name)
- if @@error <> 0
- return (1)
- end
- else if @col_clause1 is not null
- begin
-
- if datalength(@filter_clause) > 1
- exec ('create view ' + @object + ' as select ' +
- @col_clause1 + ' from ' + @qualified_table_name +
- ' where ' + @filter_clause)
- else
- exec ('create view ' + @object + ' as select ' +
- @col_clause1 + ' from ' + @qualified_table_name)
- if @@error <> 0
- return (1)
- end
- else
- begin
- if datalength(@filter_clause) > 1
- exec ('create view ' + @object + ' as select * from ' +
- @qualified_table_name + ' where ' + @filter_clause)
- if @@error <> 0
- return (1)
-
- end
- /*
- ** Update the article's sync_objid with the new view or the base
- ** table id.
- */
- if @col_clause1 is null and datalength(@filter_clause) = 1
- select @view_id = object_id(@qualified_table_name)
- else
- begin
- select @view_id = id from sysobjects where name = @object and
- type = 'V'
- if @view_id is null or @view_id = 0
- begin
- RAISERROR (15001, 11, -1, @object)
- return (1)
- end
- end
-
- /* Update article definition */
- update sysarticles set sync_objid = @view_id where
- pubid = @pubid and
- name = @article
-
- /*
- ** Set new sync_objid and @filter_clause value
- */
- if datalength(@filter_clause) > 1
- update sysarticles set sync_objid = @view_id,
- filter_clause = @filter_clause
- where pubid = @pubid
- and name = @article
- else
- update sysarticles set sync_objid = @view_id,
- filter_clause = NULL
- where pubid = @pubid
- and name = @article
-
- drop table #tmp
-
- /*
- ** Force the article cache to be refreshed with the new definition.
- */
- EXECUTE sp_replflush
- go
-
- dump tran master with no_log
- go
-
- print ''
- print 'Creating procedure sp_addarticle.'
- go
- CREATE PROCEDURE sp_addarticle
- @publication varchar(30), /* publication name */
- @article varchar(30), /* article name */
- @source_table varchar (92), /* table name */
- @destination_table varchar (30) = NULL, /* destination table name */
- @vertical_partition char(5) = 'false', /* vertical partition */
- @type varchar (30) = 'logbased', /* article type */
- @filter varchar (92) = NULL, /* stored procedure used to filter table */
- @sync_object varchar (92) = NULL, /* view or table used for synchronization */
- @ins_cmd varchar (255) = 'SQL', /* insert format string */
- @del_cmd varchar (255) = 'SQL', /* delete format string */
- @upd_cmd varchar (255) = 'SQL', /* update format string */
- @creation_script varchar (127) = NULL, /* article schema script */
- @description varchar (255) = NULL, /* article description */
- @pre_creation_cmd varchar(10) = 'drop', /* 'none', 'drop', 'delete', 'truncate' */
- @filter_clause text = '' /* where clause */
- AS
-
- SET NOCOUNT ON
-
- /*
- ** Declarations.
- */
-
- DECLARE @accessid smallint
- DECLARE @db varchar(30)
- DECLARE @filterid int
- DECLARE @object varchar(30)
- DECLARE @owner varchar(30)
- DECLARE @pubid int
- DECLARE @publish_bit smallint
- DECLARE @retcode int
- DECLARE @site varchar(30)
- DECLARE @syncid int
- DECLARE @tabid int
- DECLARE @typeid smallint
- DECLARE @pkkey varchar (30)
- DECLARE @i int
- DECLARE @indid int
- DECLARE @precmdid int
-
- SELECT @publish_bit = 32
-
- /*
- ** Security Check.
- ** Only the System Administrator (SA) or the Database Owner (dbo) can
- ** add an article to a publication.
- */
- IF suser_id() <> 1 AND user_id() <> 1
- BEGIN
- RAISERROR (15000, 14, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @article.
- ** The @article name cannot be NULL and must conform to the rules
- ** for identifiers.
- */
-
- IF @article IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The article')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @article
-
- IF @retcode <> 0
- return(1)
-
- if LOWER(@article) = 'all'
- BEGIN
- RAISERROR (14032, 16, -1, @article)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @publication.
- ** The @publication name cannot be NULL and must conform to the rules
- ** for identifiers.
- */
-
- IF @publication IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @publication
-
- IF @retcode <> 0
- RETURN (1)
-
- /*
- ** Parameter Check: @source_table.
- ** Check to see that the @source_table is local, that it conforms
- ** to the rules for identifiers, and that it is a table, and not
- ** a view or another database object.
- */
-
- IF @source_table IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The source table')
- RETURN (1)
- END
-
- EXECUTE sp_namecrack @source_table,
- @site OUTPUT,
- @db OUTPUT,
- @owner OUTPUT,
- @object OUTPUT
-
- IF @source_table LIKE '%.%.%' AND @db <> DB_NAME()
- BEGIN
- RAISERROR (14004, 16, -1, 'The source table')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @object
-
- IF @retcode <> 0
- RETURN (1)
-
- /*
- ** Get the id of the @source_table
- */
-
- SELECT @tabid = id FROM sysobjects WHERE id = OBJECT_ID(@source_table)
-
- IF @tabid IS NULL
- BEGIN
- RAISERROR (14027, 11, -1, 'The source table')
- RETURN (1)
- END
-
- /*
- ** Make sure that the table name specified is a table and not a view.
- */
-
- IF NOT EXISTS (SELECT *
- FROM sysobjects
- WHERE id = (SELECT OBJECT_ID(@source_table))
- AND type = 'U')
- BEGIN
- RAISERROR (14028, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @destination_table.
- ** If the destination table is not specified, assume it's the same
- ** as the source table. Make sure that the table name is not qualified.
- */
-
- IF @destination_table LIKE '%.%.%'
- BEGIN
- RAISERROR (14001, 16, -1)
- RETURN (1)
- END
-
- IF @destination_table LIKE '%.%'
- BEGIN
- RAISERROR (14044, 16, -1, 'destination table')
- RETURN (1)
- END
-
- IF @destination_table IS NULL
- SELECT @destination_table = @source_table
-
- EXECUTE sp_namecrack @destination_table,
- @site OUTPUT,
- @db OUTPUT,
- @owner OUTPUT,
- @object OUTPUT
-
- EXECUTE @retcode = sp_validname @object
-
- IF @retcode <> 0
- RETURN (1)
-
- /*
- ** Parameter Check: @vertical_partition
- ** Check to make sure that the vertical partition is either TRUE or FALSE.
- */
-
- SELECT @vertical_partition = LOWER(@vertical_partition)
- IF @vertical_partition NOT IN ('true', 'false')
- BEGIN
- RAISERROR (14029, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @filter
- ** Make sure that the filter is a valid stored procedure.
- */
- IF @filter IS NOT NULL
- BEGIN
-
- EXECUTE sp_namecrack @filter,
- @site OUTPUT,
- @db OUTPUT,
- @owner OUTPUT,
- @object OUTPUT
-
- IF @filter LIKE '%.%.%' AND @db <> DB_NAME()
- BEGIN
- RAISERROR (14004, 16, -1, 'The filter')
- RETURN (1)
- END
-
-
- EXECUTE @retcode = sp_validname @object
-
- IF @retcode <> 0
- RETURN (1)
-
- /*
- ** Get the id of the @filter
- */
- select @filterid = id from sysobjects where
- id = OBJECT_ID(@filter) and type = 'RF'
- IF @filterid IS NULL
- BEGIN
- RAISERROR (14027, 11, -1, 'The filter')
- RETURN (1)
- END
- END
- ELSE
- select @filterid = 0
-
- /*
- ** Get the pubid.
- */
-
- SELECT @pubid = pubid FROM syspublications WHERE name = @publication
-
- IF @pubid IS NULL
- BEGIN
- RAISERROR (14027, 11, -1, 'The publication')
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @article, @publication.
- ** Check if the article already exists in this publication.
- */
-
- IF EXISTS (SELECT *
- FROM sysarticles
- WHERE pubid = @pubid
- AND name = @article)
- BEGIN
- RAISERROR (14030, 16, -1, @article, @publication)
- RETURN (1)
- END
-
- /*
- ** Set the typeid. The default type is logbased. Anything else is
- ** currently undefined (reserved for future use).
- **
- ** @typeid type
- ** ======= ========
- ** 1 logbased
- ** 3 logbased manualfilter
- ** 5 logbased manualview
- ** 7 logbased manualboth
- */
-
- IF LOWER(@type) NOT IN ('logbased', 'logbased manualfilter', 'logbased manualview', 'logbased manualboth')
- BEGIN
- RAISERROR (14023, 16, -1)
- RETURN (1)
- END
-
- IF LOWER(@type) = 'logbased'
- SELECT @typeid = 1
- ELSE IF LOWER(@type) = 'logbased manualfilter'
- SELECT @typeid = 3
- ELSE IF LOWER(@type) = 'logbased manualview'
- SELECT @typeid = 5
- ELSE IF LOWER(@type) = 'logbased manualboth'
- SELECT @typeid = 7
-
- /*
- ** Set the precmdid. The default type is 'drop'.
- **
- ** @precmdid pre_creation_cmd
- ** ========= ================
- ** 0 none
- ** 1 drop
- ** 2 delete
- ** 3 truncate
- */
- IF LOWER(@pre_creation_cmd) NOT IN ('none', 'drop', 'delete', 'truncate')
- BEGIN
- RAISERROR (14061, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Determine the integer value for the pre_creation_cmd.
- */
- IF LOWER(@pre_creation_cmd) = 'none'
- SELECT @precmdid = 0
- ELSE IF LOWER(@pre_creation_cmd) = 'drop'
- SELECT @precmdid = 1
- ELSE IF LOWER(@pre_creation_cmd) = 'delete'
- SELECT @precmdid = 2
- ELSE IF LOWER(@pre_creation_cmd) = 'truncate'
- SELECT @precmdid = 3
-
- IF @sync_object IS NULL
- select @syncid = @tabid
- ELSE
- BEGIN
-
- /*
- ** Parameter Check: @sync_object.
- ** Check to see that the sync_object is local and that it
- ** conforms to the rules for identifiers.
- */
-
- EXECUTE sp_namecrack @sync_object,
- @site OUTPUT,
- @db OUTPUT,
- @owner OUTPUT,
- @object OUTPUT
-
- IF @sync_object LIKE '%.%.%' AND @db <> DB_NAME()
- BEGIN
- RAISERROR (14004, 16, -1, 'The synchronization object')
- RETURN (1)
- END
-
-
- EXECUTE @retcode = sp_validname @object
-
- IF @retcode <> 0
- RETURN (1)
-
- /*
- ** Get the id of the @sync_object
- */
-
- SELECT @syncid = id FROM sysobjects WHERE id = OBJECT_ID(@sync_object)
-
- IF @syncid IS NULL
- BEGIN
- RAISERROR (14027, 11, -1, 'The synchronization object')
- RETURN (1)
- END
-
- /*
- ** Make sure the sync object specified is a table or a view.
- */
-
- IF NOT EXISTS (SELECT * FROM sysobjects
- WHERE id = (SELECT OBJECT_ID(@sync_object))
- AND (type = 'U' or
- type = 'V'))
- BEGIN
- RAISERROR (14031, 16, -1)
- RETURN (1)
- END
- END
-
- /*
- ** Make sure there is a primary key on the source table.
- */
- IF NOT EXISTS (SELECT * FROM sysconstraints WHERE id = @tabid and
- (status & 0x1) <> 0) /* PK status */
- BEGIN
- RAISERROR (14088, 16, -1, @source_table)
- RETURN (1)
- END
-
- /*
- ** Add article to sysarticles and update sysobjects category bit.
- */
- BEGIN TRAN sp_addarticle
- INSERT sysarticles (columns, creation_script, del_cmd, description,
- dest_table, filter, filter_clause, ins_cmd, name,
- objid, pre_creation_cmd, pubid,
- status, sync_objid, type, upd_cmd)
- VALUES (0, @creation_script, @del_cmd, @description, @destination_table,
- @filterid, @filter_clause, @ins_cmd, @article, @tabid,
- @precmdid, @pubid, 0, @syncid, @typeid, @upd_cmd)
-
- IF @@ERROR <> 0
- BEGIN
- ROLLBACK TRAN sp_addarticle
- RETURN (1)
- END
-
- UPDATE sysobjects
- SET category = category | @publish_bit
- WHERE id = (SELECT objid
- FROM sysarticles
- WHERE name = @article
- AND pubid = @pubid)
-
- IF @@ERROR <> 0
- BEGIN
- ROLLBACK TRAN sp_addarticle
- RETURN (1)
- END
-
- /*
- ** Set all bits to '1' in the columns column to include all columns.
- */
-
- IF @vertical_partition = 'false'
- BEGIN
- EXECUTE @retcode = sp_articlecolumn @publication, @article
- IF @@ERROR <> 0 OR @retcode <> 0
- BEGIN
- ROLLBACK TRAN sp_addarticle
- RETURN (1)
- END
- END
- /*
- ** Set all bits to '1' for all columns in the primary key.
- */
- ELSE
- BEGIN
- SELECT @indid = indid FROM sysindexes
- WHERE id = @tabid
- AND (status & 2048) <> 0 /* PK index */
- /*
- ** First we'll figure out what the keys are.
- */
- SELECT @i = 1
-
- WHILE (@i <= 16)
- BEGIN
- SELECT @pkkey = INDEX_COL(@source_table, @indid, @i)
- if @pkkey is NULL
- goto DONE
-
- EXECUTE @retcode = sp_articlecolumn @publication,
- @article, @pkkey, 'add'
- IF @@ERROR <> 0 OR @retcode <> 0
- BEGIN
- ROLLBACK TRAN sp_addarticle
- RETURN (1)
- END
-
- select @i = @i + 1
- END
- END
-
- DONE:
- COMMIT TRAN sp_addarticle
- go
-
- print ''
- print 'Creating procedure sp_addpublisher.'
- go
-
- CREATE PROCEDURE sp_addpublisher (
- @publisher varchar (30), /* publisher server name */
- @type varchar (5) = NULL /* NULL or 'dist' */
- ) AS
-
- /*
- ** Declarations.
- */
-
- DECLARE @distaccount varchar(255)
- DECLARE @proc varchar (255)
- DECLARE @retcode int
- DECLARE @privilege varchar (30)
-
- /*
- ** Parameter Check: @publisher.
- ** Check to make sure that the publisher is not NULL and that it
- ** conforms to the rules for identifiers.
- */
-
- IF @publisher IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publisher')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @publisher
-
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
-
-
- /*
- ** Perform special logic if defining a publisher for a distribution
- ** server.
- */
- IF LOWER(@type) = 'dist'
- BEGIN
- /* Check if publisher is already defined. */
- IF EXISTS (SELECT *
- FROM master..sysservers
- WHERE srvname = @publisher
- AND srvstatus & 16 <> 0)
-
- BEGIN
- RAISERROR (14074, 16, -1, @publisher)
- RETURN (1)
- END
-
- IF NOT EXISTS (SELECT *
- FROM master..sysservers
- WHERE srvname = @publisher)
-
- /* Add the server if it does not exist. */
- BEGIN
- EXECUTE @retcode = sp_addserver @publisher
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14075, 16, -1)
- RETURN (1)
- END
- END
-
- /*
- ** Set the server option to indicate that this is a
- ** distribution publisher.
- */
- EXECUTE @retcode = sp_serveroption @publisher, 'dpub', true
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14075, 16, -1)
- RETURN (1)
- END
-
- /* Add remotelogin enabling the 'sa' of the publisher to
- ** RPC for distribution information.
- */
- IF NOT EXISTS (SELECT *
- FROM sysremotelogins srl,
- sysservers ss
- WHERE ss.srvname = @publisher
- AND srl.remoteserverid = ss.srvid
- AND srl.remoteusername = 'sa'
- AND srl.suid = 1) /* 'sa' */
- BEGIN
- EXECUTE @retcode = sp_addremotelogin @publisher, sa, sa
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14075, 16, -1)
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_remoteoption @publisher, sa, sa, trusted, true
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14075, 16, -1)
- RETURN (1)
- END
- END
-
- /* Add remotelogin enabling the 'probe' of the publisher to
- ** RPC for distribution counter information.
- */
- IF NOT EXISTS (SELECT *
- FROM sysremotelogins srl,
- sysservers ss
- WHERE ss.srvname = @publisher
- AND srl.remoteserverid = ss.srvid
- AND srl.remoteusername = 'probe'
- AND srl.suid = 2) /* 'probe' */
- BEGIN
- EXECUTE @retcode = sp_addremotelogin @publisher, probe, probe
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14075, 16, -1)
- RETURN (1)
- END
- END
-
- RETURN (0)
- END
-
- /*
- ** Check to make sure that the publisher doesn't already exist.
- */
- IF EXISTS (SELECT * FROM master..sysservers
- WHERE srvname = @publisher
- AND srvstatus & 2 <> 0)
- BEGIN
- RAISERROR (14074, 16, -1, @publisher)
- RETURN (1)
- END
-
- /*
- ** The server may already be listed in master..sysservers, but might
- ** not be marked as a publisher yet. If it's not in
- ** master..sysservers, let's add it first.
- */
-
- IF NOT EXISTS (SELECT *
- FROM master..sysservers
- WHERE srvname = @publisher)
-
- BEGIN
- EXECUTE @retcode = sp_addserver @publisher
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14075, 16, -1)
- RETURN (1)
- END
- END
-
- /*
- ** Fetch the publisher's distributor account.
- */
-
- SELECT @proc = RTRIM(@publisher) + '.master..sp_helpdistributor '
- EXECUTE @retcode = @proc @account = @distaccount OUTPUT
- IF @@error <> 0 OR @retcode <> 0 OR @distaccount IS NULL
- BEGIN
- RAISERROR (14071, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Set the server option to indicate that this is a publisher.
- */
-
-
- EXECUTE @retcode = sp_serveroption @publisher, 'pub', true
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14075, 16, -1)
- RETURN (1)
- END
-
- /*
- ** If @distaccount = 'LocalSystem' assume 'admin' privilege
- */
- IF @distaccount = 'LocalSystem'
- RETURN (0)
-
- /*
- ** Check if @distaccount has admin or repl privilege already.
- */
- EXECUTE @retcode = master.dbo.xp_logininfo @distaccount, 'all',
- @privilege = @privilege output
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14076, 16, -1, @distaccount)
- RAISERROR (14075, 16, -1)
- RETURN (1)
- END
-
- IF @privilege = 'admin' OR @privilege = 'repl'
- RETURN (0)
-
- /*
- ** Grant replication privilege to the distributor NT account.
- */
- EXECUTE @retcode = master.dbo.xp_grantlogin @distaccount, repl
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14076, 16, -1, @distaccount)
- RAISERROR (14075, 16, -1)
- RETURN (1)
- END
-
- go
-
- print ''
- print 'Creating procedure sp_addsubscriber.'
- go
-
- CREATE PROCEDURE sp_addsubscriber (
- @subscriber varchar (30),
- @type tinyint = 0,
- @login varchar (30) = NULL,
- @password varchar (30) = NULL,
- @commit_batch_size int = 20,
- @status_batch_size int = 20,
- @flush_frequency int = 0,
- @frequency_type int = 4,
- @frequency_interval int = 1,
- @frequency_relative_interval int = 1,
- @frequency_recurrence_factor int = 0,
- @frequency_subday int = 4,
- @frequency_subday_interval int = 5,
- @active_start_time_of_day int = 0,
- @active_end_time_of_day int = 235959,
- @active_start_date int = 0,
- @active_end_date int = 99991231,
- @description varchar (255) = NULL
- ) AS
-
- DECLARE @distributor varchar(30)
- DECLARE @distribdb varchar(30)
- DECLARE @distproc varchar (255)
- DECLARE @retcode int
- DECLARE @dsn_subscriber tinyint
-
- select @dsn_subscriber = 1 /* Const: subscriber type 'dsn' */
-
- /*
- ** Parameter Check: @subscriber.
- ** Check to make sure that the subscriber doesn't already exist, and
- ** that the name is a valid non-null identifier.
- */
-
- IF @subscriber IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The subscriber')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @subscriber
-
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
-
- IF EXISTS (SELECT *
- FROM master..sysservers
- WHERE srvname = @subscriber
- AND srvstatus & 4 <> 0)
-
- BEGIN
- RAISERROR (14040, 16, -1, @subscriber)
- RETURN (1)
- END
-
-
- /*
- ** If no MSsubscriber_info parameters skip RPC code.
- */
-
- IF @frequency_type = -1
- GOTO ADDSUB
-
- /*
- ** Get distribution server information for remote RPC
- ** subscription calls.
- */
-
- EXEC @retcode = sp_helpdistributor @distributor = @distributor OUTPUT,
- @distribdb = @distribdb OUTPUT
-
- IF @@error <> 0
- BEGIN
- RAISERROR (14071, 16, -1)
- RETURN (1)
- END
-
- IF @retcode <> 0 OR @distribdb IS NULL OR @distributor IS NULL
- BEGIN
- RAISERROR (14071, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Add subscriber to distribution sysservers, if distribution
- ** server is remote.
- */
-
- If @distributor <> @@SERVERNAME
- BEGIN
-
- SELECT @distproc = RTRIM(@distributor) + '.master..sp_addserver '
- EXEC @distproc @server = @subscriber, @duplicate_ok = 'duplicate_ok'
-
- /*
- ** Assume distributor already existed if execute failed. Check
- ** @@error for non-procedure errors.
- */
- IF @@error <> 0
- BEGIN
- RAISERROR (14042, 16, -1)
- RETURN (1)
- END
- END
-
- /*
- ** Insert information into MSsubscriber_info
- */
- SELECT @distproc = RTRIM(@distributor) + '.' + RTRIM(@distribdb) + '..sp_MSadd_subscriber_info '
- EXEC @retcode = @distproc
- @@SERVERNAME,
- @subscriber,
- @type,
- @login,
- @password,
- @commit_batch_size,
- @status_batch_size,
- @flush_frequency,
- @frequency_type,
- @frequency_interval,
- @frequency_relative_interval,
- @frequency_recurrence_factor,
- @frequency_subday,
- @frequency_subday_interval,
- @active_start_time_of_day,
- @active_end_time_of_day,
- @active_start_date,
- @active_end_date,
- @description = @description
-
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14042, 16, -1)
- RETURN (1)
- END
-
- ADDSUB:
-
- /*
- ** The server may already be listed in master..sysservers, but might
- ** not be marked as a subscriber yet. If it's not in
- ** master..sysservers, let's add it first.
- */
-
- IF NOT EXISTS (SELECT *
- FROM master..sysservers
- WHERE srvname = @subscriber)
-
- EXECUTE @retcode = sp_addserver @subscriber
-
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14042, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Set the server option to indicate this is a subscriber.
- */
-
- EXECUTE @retcode = sp_serveroption @subscriber, 'sub', true
-
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14042, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Set the server option to indicate this is a DSN subscriber.
- */
- if @type = @dsn_subscriber
- BEGIN
- EXECUTE @retcode = sp_serveroption @subscriber, 'dsn', true
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14042, 16, -1)
- RETURN (1)
- END
- END
-
- /*
- ** Setup remotelogin for subscribing server 'sa' account, if
- ** one does not already exist.
- **/
-
- IF EXISTS (SELECT *
- FROM sysremotelogins srl,
- sysservers ss
- WHERE ss.srvname = @subscriber
- AND srl.remoteserverid = ss.srvid
- AND (srl.remoteusername = 'sa'
- OR (srl.remoteusername IS NULL AND srl.suid = -1)))
- BEGIN
- RETURN (0)
- END
-
- EXECUTE @retcode = sp_addremotelogin @subscriber, repl_subscriber, sa
-
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14042, 16, -1)
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_remoteoption @subscriber, repl_subscriber, sa, trusted, true
-
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14042, 16, -1)
- RETURN (1)
- END
- go
-
- /*
- ** Create replication stored procedures.
- ** Part 1: create codependent procedures.
- */
-
- print ''
- print 'Creating procedure sp_hcchangesubstatus1.'
- go
- CREATE PROCEDURE sp_hcchangesubstatus1
- @publication varchar(30) = '%',
- @article varchar(30) = '%',
- @subscriber varchar(30) = '%'
- AS
-
- DECLARE hCsubstatus CURSOR FOR
- SELECT sub.artid,
- art.objid,
- sub.srvid,
- ss.srvname,
- sub.dest_db,
- sub.status,
- ss.srvstatus
- FROM syssubscriptions sub,
- sysarticles art,
- syspublications pub,
- sysservers ss
- WHERE pub.name LIKE @publication
- AND art.name LIKE @article
- AND ss.srvname LIKE @subscriber
- AND sub.srvid = ss.srvid
- AND sub.artid = art.artid
- AND art.pubid = pub.pubid
- FOR READ ONLY
-
- go
-
- print ''
- print 'Creating procedure sp_hcchangesubstatus2.'
- go
- CREATE PROCEDURE sp_hcchangesubstatus2
- @publication varchar(30) = '%',
- @article varchar(30) = '%',
- @subscriber varchar(30) = '%',
- @previous_status varchar(30),
- @prevstatid tinyint
- AS
-
- DECLARE hCsubstatus CURSOR FOR
- SELECT sub.artid,
- art.objid,
- sub.srvid,
- ss.srvname,
- sub.dest_db,
- sub.status,
- ss.srvstatus
- FROM syssubscriptions sub,
- sysarticles art,
- syspublications pub,
- sysservers ss
- WHERE pub.name LIKE @publication
- AND art.name LIKE @article
- AND ss.srvname LIKE @subscriber
- AND sub.srvid = ss.srvid
- AND sub.artid = art.artid
- AND art.pubid = pub.pubid
- AND sub.status = @prevstatid
- FOR READ ONLY
- go
-
- print ''
- print 'Creating procedure sp_changesubstatus.'
- go
-
- CREATE PROCEDURE sp_changesubstatus (
- @publication varchar (30) = '%', /* publication name */
- @article varchar (30) = '%', /* article name */
- @subscriber varchar(30) = '%', /* subscriber name */
- @status varchar(30), /* subscription status */
- @previous_status varchar(30)=NULL /* previous subscription status */
- ) AS
-
- SET NOCOUNT ON
-
- DECLARE @inactive tinyint
- DECLARE @subscribed tinyint
- DECLARE @active tinyint
- DECLARE @public tinyint
- DECLARE @replicate_bit smallint
- DECLARE @subscriber_bit smallint
- DECLARE @msg varchar(255)
- DECLARE @prevstatid tinyint
- DECLARE @artid int
- DECLARE @tabid int
- DECLARE @srvid smallint
- DECLARE @statusid tinyint
- DECLARE @distributor varchar(30)
- DECLARE @distribdb varchar(30)
- DECLARE @distproc varchar (255)
- DECLARE @pub_db varchar(30)
- DECLARE @dest_db varchar (30)
- DECLARE @sub_name varchar (30)
- DECLARE @sub_status tinyint
- DECLARE @sub_ts binary (8)
- DECLARE @sub_type smallint
- DECLARE @cmd0 varchar (255)
- DECLARE @cmd1 varchar (255)
- DECLARE @cmd2 varchar (255)
- DECLARE @cmd3 varchar (255)
- DECLARE @retcode int
- DECLARE @dsn_bit smallint
-
- /*
- ** Initializations.
- */
-
- SELECT @inactive = 0 /* Const: subscription status 'inactive' */
- SELECT @subscribed = 1 /* Const: subscription status 'subscribed' */
- SELECT @active = 2 /* Const: subscription status 'active' */
- SELECT @public = 0 /* Const: publication status 'public' */
- SELECT @replicate_bit = 64 /* Const: replication bit in sysobjects=0x40 */
- SELECT @subscriber_bit = 4 /* Const: subscription server status */
- SELECT @pub_db = DB_NAME()
- SELECT @dsn_bit = 32
-
- /*
- ** Parameter Check: @publication
- ** Check to make sure that the publication exists, that it's not NULL,
- ** and that it conforms to the rules for identifiers.
- */
-
- IF @publication IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- IF @publication <> '%'
- BEGIN
- EXECUTE @retcode = sp_validname @publication
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
- END
-
- IF NOT EXISTS (SELECT * FROM syspublications WHERE name LIKE @publication)
- BEGIN
- IF @publication = '%'
- RAISERROR (14008, 11, -1)
- ELSE
- RAISERROR (15001, 11, -1, @publication)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @article
- ** Check to make sure that the article exists, that it's not null,
- ** and that it conforms to the rules for identifiers.
- */
-
- IF @article IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The article')
- RETURN (1)
- END
-
- IF @article <> '%'
- BEGIN
- EXECUTE @retcode = sp_validname @article
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
- END
-
- IF NOT EXISTS (SELECT *
- FROM sysarticles a,
- syspublications b
- WHERE a.name LIKE @article
- AND a.pubid = b.pubid
- AND b.name LIKE @publication)
-
- BEGIN
- IF @article = '%'
- RAISERROR (14009, 11, -1, @publication)
- ELSE
- RAISERROR (15001, 11, -1, @article)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @subscriber
- ** Check to make sure that the subscriber exists, that it is not NULL,
- ** and that it conforms to the rules for identifiers.
- */
-
- IF @subscriber IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The subscriber')
- RETURN (1)
- END
-
- IF @subscriber <> '%'
- BEGIN
- EXECUTE @retcode = sp_validname @subscriber
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
- END
-
- IF NOT EXISTS (SELECT *
- FROM master..sysservers
- WHERE srvname LIKE @subscriber
- AND (srvstatus & 4) <> 0)
-
- BEGIN
- IF @subscriber ='%'
- RAISERROR (14064, 11, -1)
- ELSE
- RAISERROR (14063, 11, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @status.
- ** Set the @statusid according to the @status value. Values can be
- ** any of the following:
- **
- ** status statusid
- ** ========= ========
- ** inactive 0
- ** subscribed 1
- ** active 2
- */
-
- IF LOWER(@status) NOT IN ('active', 'subscribed', 'inactive')
- BEGIN
- RAISERROR (14065, 16, -1)
- RETURN (1)
- END
-
- IF LOWER(@status) IN ('active')
- SELECT @statusid = @active
- ELSE IF LOWER(@status) IN ('subscribed')
- SELECT @statusid = @subscribed
- ELSE
- SELECT @statusid = @inactive
-
- /*
- ** Parameter Check: @previous_status.
- ** Set the @prevstatid according to the @previous_status value.
- ** Values can be any of the following:
- **
- ** previous_status prevstatid
- ** =============== ==========
- ** inactive 0
- ** subscribed 1
- ** active 2
- */
-
- IF @previous_status IS NOT NULL
- BEGIN
- IF LOWER(@previous_status) NOT IN ('active', 'subscribed', 'inactive')
- BEGIN
- RAISERROR (14066, 16, -1)
- RETURN (1)
- END
-
- IF LOWER(@status) = LOWER(@previous_status)
- BEGIN
- RAISERROR (14067, 16, -1)
- RETURN (1)
- END
-
- IF LOWER(@previous_status) IN ('active')
- SELECT @prevstatid = @active
- ELSE IF LOWER(@previous_status) IN ('subscribed')
- SELECT @prevstatid = @subscribed
- ELSE
- SELECT @prevstatid = @inactive
- END
-
- /*
- ** Get distribution server information for remote RPC
- ** subscription calls.
- */
-
- EXEC @retcode = sp_helpdistributor @distributor = @distributor OUTPUT,
- @distribdb = @distribdb OUTPUT
-
- IF @@ERROR <> 0
- BEGIN
- RAISERROR (14071, 16, -1)
- RETURN (1)
- END
-
- IF @retcode <> 0 OR @distribdb IS NULL OR @distributor IS NULL
- BEGIN
- RAISERROR (14071, 16, -1)
- RETURN (1)
- END
-
- BEGIN TRANSACTION changesubstatus
-
- /*
- ** Declare cursor containing subscriptions to be updated.
- */
-
- IF @previous_status IS NOT NULL
- EXECUTE sp_hcchangesubstatus2 @publication, @article, @subscriber, @previous_status, @prevstatid
- ELSE
- EXECUTE sp_hcchangesubstatus1 @publication, @article, @subscriber
-
- OPEN hCsubstatus
-
- FETCH hCsubstatus INTO @artid, @tabid, @srvid, @sub_name, @dest_db,
- @sub_status, @sub_type
-
- WHILE (@@fetch_status <> -1)
- BEGIN
- /*
- ** If current status is same as new status, do nothing.
- */
-
- IF @sub_status = @statusid
- BEGIN
- FETCH hCsubstatus INTO @artid, @tabid, @srvid, @sub_name,
- @dest_db, @sub_status, @sub_type
- CONTINUE
- END
-
- /*
- ** Update syssubscription status
- */
- UPDATE syssubscriptions
- SET status = @statusid
- FROM syssubscriptions sub,
- sysarticles art,
- syspublications pub
- WHERE pub.name LIKE @publication
- AND art.artid = @artid
- AND sub.srvid = @srvid
- AND sub.artid = @artid
- AND art.pubid = pub.pubid
- if @@ERROR <> 0
- BEGIN
- CLOSE hCsubstatus
- DEALLOCATE hsubstatus
- ROLLBACK TRANSACTION changesubstatus
- RAISERROR (14053, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Get timestamp of subscription.
- */
- SELECT @sub_ts = timestamp FROM
- syssubscriptions sub,
- sysarticles art,
- syspublications pub
- WHERE pub.name LIKE @publication
- AND art.artid = @artid
- AND sub.srvid = @srvid
- AND sub.artid = @artid
- AND art.pubid = pub.pubid
- IF @sub_ts IS NULL
- BEGIN
- CLOSE hCsubstatus
- DEALLOCATE hCsubstatus
- ROLLBACK TRANSACTION changesubstatus
- RAISERROR (14053, 16, -1)
- RETURN (1)
- END
-
- /*
- ** If activating subscription, update sysarticles, sysobjects and
- ** MSjob_subscriptions.
- */
- IF @statusid = @active
- BEGIN
-
- /*
- ** Update status of article to show it has been activated.
- */
- UPDATE sysarticles SET status = 1 WHERE artid = @artid
- IF @@ERROR <> 0
- BEGIN
- CLOSE hCsubstatus
- DEALLOCATE hCsubstatus
- ROLLBACK TRANSACTION changesubstatus
- RAISERROR (14069, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Turn the replication flag on for this object in the
- ** sysobjects table (make it logbased).
- */
-
- UPDATE sysobjects
- SET category = category | @replicate_bit
- WHERE id = (SELECT objid
- FROM sysarticles
- WHERE artid = @artid)
-
- IF @@ERROR <> 0
- BEGIN
- CLOSE hCsubstatus
- DEALLOCATE hCsubstatus
- ROLLBACK TRANSACTION changesubstatus
- RAISERROR (14068, 16, -1)
- RETURN (1)
- END
-
- END
-
- /*
- ** Update status of all Text\Image columns if
- ** subscriber is non-SQL Server.
- */
- IF (@sub_type & @dsn_bit) <> 0
- BEGIN
- IF @statusid = @subscribed OR @statusid = @active
- BEGIN
- EXEC @retcode = sp_articletextcol @artid, NULL,
- 'nonsqlsub', 'add'
- IF @@ERROR <> 0 OR @retcode <> 0
- BEGIN
- CLOSE hCsubstatus
- DEALLOCATE hCsubstatus
- ROLLBACK TRANSACTION changesubstatus
- RAISERROR (14068, 16, -1)
- RETURN (1)
- END
- END
- ELSE IF @statusid = @inactive
- BEGIN
- EXEC @retcode = sp_articletextcol @artid, NULL,
- 'nonsqlsub', 'drop'
- IF @@ERROR <> 0 OR @retcode <> 0
- BEGIN
- CLOSE hCsubstatus
- DEALLOCATE hCsubstatus
- ROLLBACK TRANSACTION changesubstatus
- RAISERROR (14068, 16, -1)
- RETURN (1)
- END
- END
- END
-
- /*
- ** If deactivating subscription, update sysarticles, sysobjects and
- ** MSjob_subscriptions.
- */
-
- IF @statusid <> @active AND @sub_status = @active
- BEGIN
- /*
- ** Set the article status to 'inactive' if there are
- ** no other active subscriptions on it.
- */
- IF NOT EXISTS (SELECT * FROM syssubscriptions WHERE
- artid = @artid AND status = @active)
- BEGIN
- UPDATE sysarticles SET status = 0 WHERE
- artid = @artid
- IF @@ERROR <> 0
- BEGIN
- CLOSE hCsubstatus
- DEALLOCATE hCsubstatus
- ROLLBACK TRANSACTION changesubstatus
- RAISERROR (14069, 16, -1)
- RETURN (1)
- END
- END
-
- /*
- ** Set the object replication bits to 'inactive' if
- ** there are no other active subscriptions on the
- ** table.
- */
- IF NOT EXISTS (SELECT * FROM syssubscriptions WHERE
- artid IN (SELECT artid FROM sysarticles WHERE
- objid = @tabid) AND status = @active)
- BEGIN
- UPDATE sysobjects
- SET category = category & ~@replicate_bit
- WHERE id = (SELECT objid
- FROM sysarticles WHERE artid= @artid)
- IF @@ERROR <> 0
- BEGIN
- CLOSE hCsubstatus
- DEALLOCATE hCsubstatus
- ROLLBACK TRANSACTION changesubstatus
- RAISERROR (14068, 16, -1)
- RETURN (1)
- END
- END
-
- END
-
- /*
- ** Add the active subscription to the distributor's
- ** subscriptions table if changing status from @inactive
- */
- IF @sub_status = @inactive
- BEGIN
- SELECT @distproc = RTRIM(@distributor) + '.' + RTRIM(@distribdb) + '..sp_MSadd_subscription '
- EXEC @retcode = @distproc @@SERVERNAME, @pub_db, @sub_name, @artid, @dest_db, @statusid, @sub_ts
- IF @@ERROR <> 0 OR @retcode <> 0
- BEGIN
- CLOSE hCsubstatus
- DEALLOCATE hCsubstatus
- ROLLBACK TRANSACTION changesubstatus
- RAISERROR (14070, 16, -1)
- RETURN (1)
- END
- END
- ELSE
- BEGIN
- /*
- ** Drop the deactivated subscription from the distributor's
- ** subscriptions table.
- */
- IF @statusid = @inactive
- BEGIN
- SELECT @distproc = RTRIM(@distributor) + '.' + RTRIM(@distribdb) + '..sp_MSdrop_subscription '
- EXEC @retcode = @distproc @@SERVERNAME, @pub_db, @sub_name, @artid, @dest_db
- IF @@ERROR <> 0 OR @retcode <> 0
- BEGIN
- CLOSE hCsubstatus
- DEALLOCATE hCsubstatus
- ROLLBACK TRANSACTION changesubstatus
- RAISERROR (14070, 16, -1)
- RETURN (1)
- END
- END
- /*
- ** Update subscription status and timestamp in distributor's
- ** subscriptions table.
- */
- ELSE
- BEGIN
- SELECT @distproc = RTRIM(@distributor) + '.' + RTRIM(@distribdb) + '..sp_MSupdate_subscription '
- EXEC @retcode = @distproc @@SERVERNAME, @pub_db, @sub_name, @artid, @statusid, @sub_ts
- IF @@ERROR <> 0 OR @retcode <> 0
- BEGIN
- CLOSE hCsubstatus
- DEALLOCATE hCsubstatus
- ROLLBACK TRANSACTION changesubstatus
- RAISERROR (14070, 16, -1)
- RETURN (1)
- END
- END
- END
-
- /*
- ** Set internal object replication bit to 'inactive' if
- ** there are no other active subscriptions on the
- ** table.
- */
- IF @statusid = @inactive AND @sub_status = @active AND
- NOT EXISTS (SELECT * FROM syssubscriptions WHERE
- artid IN (SELECT artid FROM sysarticles WHERE
- objid = @tabid) AND status = @active)
- BEGIN
- /* Turn off object replication */
- SELECT @cmd1 = 'exec sp_replstatus ' + CONVERT(varchar(10), @tabid) + ', 0'
- EXEC (@cmd1)
- END
-
- /* Turn on object replication */
- IF @statusid = @active
- BEGIN
- SELECT @cmd1 = 'exec sp_replstatus ' + CONVERT(varchar(10), @tabid) + ', 1'
- EXEC (@cmd1)
- END
-
- /*
- ** Get next row.
- */
- FETCH hCsubstatus INTO @artid, @tabid, @srvid, @sub_name, @dest_db,
- @sub_status, @sub_type
-
- END
-
- CLOSE hCsubstatus
- DEALLOCATE hCsubstatus
-
- /*
- ** Force the article cache to be refreshed.
- */
- EXECUTE sp_replflush
- COMMIT TRANSACTION changesubstatus
- go
-
- print ''
- print 'Creating procedure sp_addsubscription.'
- go
-
- CREATE PROCEDURE sp_addsubscription (
- @publication varchar (30), /* publication name */
- @article varchar (30) = 'all', /* article name */
- @subscriber varchar(30), /* subscriber name */
- @destination_db varchar (30) = NULL, /* destination database */
- @sync_type varchar (15) = 'automatic', /* subscription sync type */
- @status varchar(30) = NULL /* subscription status */
- ) AS
-
- SET NOCOUNT ON
-
- /*
- ** Declarations.
- */
-
- DECLARE @artid int
- DECLARE @pre_creation_cmd tinyint
- DECLARE @none tinyint
- DECLARE @automatic tinyint
- DECLARE @cmd varchar(255)
- DECLARE @cmd2 varchar(255)
- DECLARE @inactive tinyint
- DECLARE @manual tinyint
- DECLARE @pubid int
- DECLARE @retcode int
- DECLARE @srvid smallint
- DECLARE @srvstatus smallint
- DECLARE @subscriber_bit smallint
- DECLARE @sync_typeid tinyint
- DECLARE @dsn_bit smallint
- DECLARE @truncate tinyint
- DECLARE @sync_method tinyint
- DECLARE @char_bcp tinyint
-
- /*
- ** Initializations.
- */
-
- SELECT @none = 2 /* Const: synchronization type 'none' */
- SELECT @automatic = 1 /* Const: synchronization type 'automatic' */
- SELECT @manual = 0 /* Const: synchronization type 'manual' */
- SELECT @inactive = 0 /* Const: subscription status 'inactive' */
- SELECT @subscriber_bit = 4 /* Const: subscription server status */
- SELECT @dsn_bit = 32 /* Const: ODBC DSN server status */
- SELECT @truncate = 3 /* Const: truncate pre-creation command */
- SELECT @char_bcp = 1 /* Const: character bcp sync method */
-
- /*
- ** Security Check.
- ** Only the System Administrator (SA) or the Database Owner (dbo) can
- ** add an article to a publication.
- */
-
- IF suser_id() <> 1 AND user_id() <> 1
- BEGIN
- RAISERROR (15000, 14, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @subscriber.
- ** Check if the server exists and that it is a subscription server.
- */
-
- IF @subscriber IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The subscriber')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @subscriber
-
- IF @retcode <> 0
- RETURN (1)
-
- SELECT @srvid = srvid, @srvstatus = srvstatus
- FROM master..sysservers
- WHERE srvname = @subscriber
- AND (srvstatus & @subscriber_bit) <> 0
-
- IF @srvid IS NULL
- BEGIN
- RAISERROR (14010, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @publication.
- ** Check to make sure that the publication exists and that it conforms
- ** to the rules for identifiers.
- */
-
- IF @publication IS NOT NULL
- BEGIN
-
- EXECUTE @retcode = sp_validname @publication
-
- IF @retcode <> 0
- RETURN (1)
-
- IF NOT EXISTS (SELECT * FROM syspublications WHERE name = @publication)
- BEGIN
- RAISERROR (15001, 11, -1, @publication)
- RETURN (1)
- END
-
- END
-
- SELECT @pubid = pubid, @sync_method = sync_method
- FROM syspublications WHERE name = @publication
-
- IF @pubid IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- /*
- ** If the subscriber is an ODBC DSN, only allow subscriptions to
- ** publications with a character mode bcp sync_method.
- */
- IF (@srvstatus & @dsn_bit) <> 0 AND @sync_method <> @char_bcp
- BEGIN
- RAISERROR (14095, 16, -1, @publication, @subscriber)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @article
- ** Check to make sure that the article exists, is not NULL, and
- ** conforms to the rules for identifiers.
- */
-
- IF LOWER(@article) = 'all'
- /*
- ** Get all articles in the publication that are not subscribed to
- ** by the @subscriber
- */
- BEGIN
- SELECT @cmd = ''
- SELECT @cmd = @cmd + 'DECLARE hCx CURSOR FOR '
- SELECT @cmd = @cmd + ' SELECT DISTINCT a.name '
- SELECT @cmd = @cmd + ' FROM sysarticles a, syspublications b '
- SELECT @cmd = @cmd + ' WHERE a.pubid = b.pubid '
- SELECT @cmd = @cmd + ' AND b.name = ''' + @publication + ''''
- SELECT @cmd2 = ' AND NOT EXISTS (SELECT * from syssubscriptions s '
- SELECT @cmd2 = @cmd2 + ' WHERE s.artid = a.artid AND s.srvid = '
- SELECT @cmd2 = @cmd2 + CONVERT(varchar(10), @srvid) + ')' + ' FOR READ ONLY'
- EXECUTE (@cmd + @cmd2)
- OPEN hCx
- FETCH hCx INTO @article
- WHILE (@@fetch_status <> -1)
- BEGIN
- EXECUTE sp_addsubscription @publication = @publication,
- @article = @article,
- @subscriber = @subscriber,
- @destination_db = @destination_db,
- @sync_type = @sync_type
- FETCH hCx INTO @article
- END
- CLOSE hCx
- DEALLOCATE hCx
- RETURN (0)
- END
-
- SELECT @artid = artid, @pre_creation_cmd = pre_creation_cmd
- FROM sysarticles
- WHERE name = @article
- AND pubid = @pubid
-
- IF @article IS NOT NULL
- BEGIN
- EXECUTE @retcode = sp_validname @article
- IF @retcode <> 0
- RETURN (1)
-
- IF NOT EXISTS (SELECT *
- FROM sysarticles
- WHERE artid = @artid
- AND pubid = @pubid)
- BEGIN
- RAISERROR (15001, 11, -1, @article)
- RETURN (1)
- END
- END
-
- IF @artid IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The article')
- RETURN (1)
- END
-
- /*
- ** If the subscriber is an ODBC DSN, do not allow subscriptions to
- ** articles with a "truncate" pre_creation_cmd.
- */
- IF (@srvstatus & @dsn_bit) <> 0 AND @pre_creation_cmd = @truncate
- BEGIN
- RAISERROR (14094, 16, -1, @article, @subscriber)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @sync_type.
- ** Set sync_typeid based on the @sync_type specified.
- **
- ** sync_typeid sync_type
- ** =========== =========
- ** 0 manual
- ** 1 automatic
- ** 2 none
- */
-
- IF LOWER(@sync_type) NOT IN ('automatic', 'manual', 'none')
- BEGIN
- RAISERROR (14052, 16, -1)
- RETURN (1)
- END
-
- IF LOWER(@sync_type) = 'automatic'
- SELECT @sync_typeid = @automatic
- ELSE IF LOWER(@sync_type) = 'manual'
- SELECT @sync_typeid = @manual
- ELSE
- SELECT @sync_typeid = @none
-
- /*
- ** Parameter Check: @destination_db.
- ** Set @destination_db to current database if not specified. Make
- ** sure that the @destination_db conforms to the rules for identifiers.
- */
-
- IF @destination_db IS NULL SELECT @destination_db = DB_NAME()
-
- EXECUTE @retcode = sp_validname @destination_db
-
- IF @retcode <> 0
- RETURN (1)
-
- /*
- ** Add subscription to syssubscriptions
- */
- BEGIN TRAN addsubscription
-
- /*
- ** If no subscription exists, add it to syssubscriptions.
- */
- IF NOT EXISTS (SELECT *
- FROM syssubscriptions
- WHERE srvid = @srvid
- AND artid = @artid)
- BEGIN
- INSERT syssubscriptions (artid,
- srvid,
- dest_db,
- status,
- sync_type,
- timestamp)
- VALUES (@artid,
- @srvid,
- @destination_db,
- @inactive,
- @sync_typeid,
- NULL)
-
- IF @@ERROR <> 0
- BEGIN
- ROLLBACK TRAN addsubscription
- RAISERROR (14057, 16, -1)
- RETURN (1)
- END
- END
- ELSE
- BEGIN
- /*
- ** If is a 'restricted' publication the subscription may already
- ** exist.
- */
- IF EXISTS (SELECT * FROM syspublications WHERE pubid = @pubid
- AND restricted = 0)
- BEGIN
- ROLLBACK TRAN addsubscription
- RAISERROR (14058, 16, -1)
- RETURN (1)
- END
- END
-
- /*
- ** If the @status was not provided determine the default value.
- ** If the @sync_type = 'none' then the subscription defaults to 'active'.
- ** Else the subscription defaults to 'subscribed'.
- */
- IF @status IS NULL
- BEGIN
- IF @sync_typeid = @none
- SELECT @status = 'active'
- ELSE
- SELECT @status = 'subscribed'
- END
-
- /*
- ** Set publication subscription status.
- */
- EXEC @retcode = sp_changesubstatus
- @publication = @publication,
- @article = @article,
- @subscriber = @subscriber,
- @status = @status
-
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- ROLLBACK TRAN addsubscription
- RAISERROR (14057, 16, -1)
- RETURN (1)
- END
-
- COMMIT TRAN addsubscription
- go
-
- print ''
- print 'Creating procedure sp_changearticle.'
- GO
- CREATE PROCEDURE sp_changearticle (
- @publication varchar(30) = NULL, /* Publication name */
- @article varchar(30) = NULL, /* Article name */
- @property varchar(20) = NULL, /* The property to change */
- @value varchar(255) = NULL /* The new property value */
- ) AS
-
- SET NOCOUNT ON
-
- /*
- ** Declarations.
- */
-
- DECLARE @artid int
- DECLARE @cmd1 varchar(255)
- DECLARE @cmd2 varchar(255)
- DECLARE @db varchar(30)
- DECLARE @filter int
- DECLARE @object varchar(30)
- DECLARE @owner varchar(30)
- DECLARE @pubid int
- DECLARE @retcode int
- DECLARE @site varchar(30)
- DECLARE @sync_objid int
- DECLARE @typeid tinyint
- DECLARE @precmdid tinyint
- DECLARE @inactive tinyint
-
- select @inactive = 0
-
- /*
- ** Security Check
- ** Only the System Administrator (SA) or the Database Owner (dbo) can
- ** perform this procedure.
- */
-
- IF suser_id() <> 1 AND user_id() <> 1
- BEGIN
- RAISERROR (15000, 14, -1)
- RETURN (1)
- END
-
- /*
- ** Check to see if the database has been activated for publication.
- */
-
- IF (SELECT category & 1
- FROM master..sysdatabases
- WHERE name = DB_NAME()) = 0
-
- BEGIN
- RAISERROR (14013, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @property.
- ** If the @property parameter is NULL, print the options.
- */
-
- IF @property IS NULL
- BEGIN
- CREATE TABLE #tab1 (properties varchar(30))
- INSERT INTO #tab1 VALUES ('name')
- INSERT INTO #tab1 VALUES ('description')
- INSERT INTO #tab1 VALUES ('sync_object')
- INSERT INTO #tab1 VALUES ('type')
- INSERT INTO #tab1 VALUES ('ins_cmd')
- INSERT INTO #tab1 VALUES ('del_cmd')
- INSERT INTO #tab1 VALUES ('upd_cmd')
- INSERT INTO #tab1 VALUES ('filter')
- INSERT INTO #tab1 VALUES ('dest_table')
- INSERT INTO #tab1 VALUES ('creation_script')
- INSERT INTO #tab1 VALUES ('pre_creation_cmd')
- PRINT ''
- SELECT * FROM #tab1
- RETURN (0)
- END
-
- /*
- ** Parameter Check: @property.
- ** Check to make sure that @property is a valid property in
- ** sysarticles.
- */
- IF @property IS NULL OR LOWER(@property) NOT IN ('name',
- 'description',
- 'sync_object',
- 'type',
- 'ins_cmd',
- 'del_cmd',
- 'upd_cmd',
- 'filter',
- 'dest_table',
- 'creation_script',
- 'pre_creation_cmd')
- BEGIN
- RAISERROR (14022, 16, -1)
- RETURN (1)
- END
-
-
- /*
- ** Parameter Check: @publication.
- ** Make sure that the publication exists.
- */
-
- IF @publication IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @publication
-
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
-
- SELECT @pubid = pubid FROM syspublications WHERE name = @publication
-
- IF @pubid IS NULL
- BEGIN
- RAISERROR (15001, 11, -1, @publication)
- RETURN (1)
- END
- ELSE
-
- /*
- ** Check to see that the article exists in sysarticles.
- ** Fetch the article identification number.
- */
-
- IF @article IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The article')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @article
-
- IF @retcode <> 0
- RETURN (1)
-
- SELECT @artid = artid
- FROM sysarticles
- WHERE name = @article
- AND pubid = @pubid
- IF @artid IS NULL
- BEGIN
- RAISERROR (15001, 11, -1, @article)
- RETURN (1)
- END
-
- /*
- ** Only unsubscribed articles may be modified.
- */
- IF EXISTS (SELECT * FROM syssubscriptions WHERE artid = @artid
- AND status <> @inactive)
- BEGIN
- RAISERROR (14092, 11, -1)
- RETURN (1)
- END
-
- /*
- ** Change the property.
- */
-
- IF LOWER(@property) IN ('name', 'description', 'ins_cmd', 'del_cmd', 'upd_cmd', 'dest_table', 'creation_script')
- BEGIN
-
- IF LOWER(@property) = 'name'
- BEGIN
-
- IF @value IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The article')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @value
-
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
-
- IF EXISTS (SELECT *
- FROM syspublications a, sysarticles b
- WHERE b.name = @value
- AND a.pubid = b.pubid
- AND a.name = @publication)
- BEGIN
- RAISERROR (14016, 16, -1, @value)
- RETURN (1)
- END
-
- END
-
- /*
- ** Check the validity of the destination table. NULL should
- ** get converted to the source table name. Destination table
- ** names can be owner qualified, but not database qualified.
- */
-
- IF LOWER(@property) = 'dest_table'
- BEGIN
- IF @value IS NULL
- SELECT @value = object_name(objid)
- FROM sysarticles
- WHERE artid = @artid
- AND pubid = @pubid
- IF @value LIKE '%.%.%' OR @value LIKE '%.%'
- BEGIN
- EXECUTE sp_namecrack @value,
- @site OUTPUT,
- @db OUTPUT,
- @owner OUTPUT,
- @object OUTPUT
- IF @db IS NOT NULL
- BEGIN
- RAISERROR (14079, 16, -1)
- RETURN (1)
- END
- EXECUTE @retcode = sp_validname @object
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
- END
- ELSE
- BEGIN
- EXECUTE @retcode = sp_validname @value
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
- END
- END
-
- SELECT @cmd1 = 'UPDATE sysarticles '
- IF @value IS NULL
- BEGIN
- SELECT @cmd1 = @cmd1 + ' SET ' + @property + ' = NULL'
- SELECT @cmd2 = ' WHERE artid = ' + STR(@artid)
- SELECT @cmd2 = @cmd2 + ' AND pubid = ' + STR(@pubid)
- EXECUTE (@cmd1 + @cmd2)
- END
- ELSE
- BEGIN
- SELECT @cmd1 = @cmd1 + ' SET ' + @property + ' = '''
- SELECT @cmd2 = ''' WHERE artid = ' + STR(@artid)
- SELECT @cmd2 = @cmd2 + ' AND pubid = ' + STR(@pubid)
- EXECUTE (@cmd1 + @value + @cmd2)
- END
- IF @@ERROR <> 0 RETURN (1)
- END
-
- IF LOWER(@property) = 'sync_object'
- BEGIN
-
- /*
- ** Check for a valid synchronization object.
- */
-
- IF @value IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The synchronization object')
- RETURN (1)
- END
-
- IF @value LIKE '%.%.%' OR @value LIKE '%.%'
- BEGIN
- EXECUTE sp_namecrack @value,
- @site OUTPUT,
- @db OUTPUT,
- @owner OUTPUT,
- @object OUTPUT
-
- EXECUTE @retcode = sp_validname @object
-
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
-
- END
-
- ELSE
- BEGIN
-
- EXECUTE @retcode = sp_validname @value
-
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
- END
-
- SELECT @sync_objid = OBJECT_ID(@value)
- IF @sync_objid IS NULL
- BEGIN
- RAISERROR (15001, 11, -1, @value)
- RETURN (1)
- END
-
- IF NOT EXISTS (SELECT *
- FROM sysobjects
- WHERE type IN ('U', 'V')
- AND id = @sync_objid)
-
- BEGIN
- RAISERROR (14031, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Update the article with the new synchronization object.
- */
-
- UPDATE sysarticles
- SET sync_objid = @sync_objid
- WHERE artid = @artid
- AND pubid = @pubid
-
- IF @@ERROR <> 0 RETURN (1)
-
- END
-
- IF LOWER(@property) = 'type'
- BEGIN
-
- /*
- ** Check to make sure that we have a valid type.
- */
-
- IF LOWER(@value) NOT IN ('logbased', 'logbased manualfilter', 'logbased manualview', 'logbased manualboth')
- BEGIN
- RAISERROR (14023, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Determine the integer value for the type.
- */
- IF LOWER(@value) = 'logbased'
- SELECT @typeid = 1
- ELSE IF LOWER(@value) = 'logbased manualfilter'
- SELECT @typeid = 3
- ELSE IF LOWER(@value) = 'logbased manualview'
- SELECT @typeid = 5
- ELSE IF LOWER(@value) = 'logbased manualboth'
- SELECT @typeid = 7
-
- /*
- ** Update the article with the new type.
- */
-
- UPDATE sysarticles
- SET type = @typeid
- WHERE artid = @artid
- AND pubid = @pubid
-
- IF @@ERROR <> 0 RETURN (1)
-
- END
-
- IF LOWER(@property) = 'filter'
- BEGIN
-
- /*
- ** Check for a valid filter value.
- */
-
- IF @value IS NOT NULL
- BEGIN
-
- IF @value LIKE '%.%.%' OR @value LIKE '%.%'
- BEGIN
- EXECUTE sp_namecrack @value,
- @site OUTPUT,
- @db OUTPUT,
- @owner OUTPUT,
- @object OUTPUT
-
- EXECUTE @retcode = sp_validname @object
-
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
-
- END
-
- ELSE
- BEGIN
-
- EXECUTE @retcode = sp_validname @value
-
- IF @@ERROR <> 0 OR @retcode <> 0
- RETURN (1)
- END
- END
-
- SELECT @filter = OBJECT_ID(@value)
-
- IF @value IS NOT NULL
- BEGIN
-
- IF @filter IS NULL
- BEGIN
- RAISERROR (15001, 11, -1, @value)
- RETURN (1)
- END
-
- IF NOT EXISTS (SELECT *
- FROM sysobjects
- WHERE type = 'RF'
- AND id = @filter)
-
- BEGIN
- RAISERROR (14049, 16, -1)
- RETURN (1)
- END
-
- END
-
- IF @value IS NULL SELECT @filter = 0
-
- /*
- ** Update the article with the new filter.
- */
-
- UPDATE sysarticles
- SET filter = @filter
- WHERE artid = @artid
- AND pubid = @pubid
-
- IF @@ERROR <> 0 RETURN (1)
-
- END
-
- IF LOWER(@property) = 'pre_creation_cmd'
- BEGIN
-
- /*
- ** Check to make sure that we have a valid pre_creation_cmd.
- */
-
- IF LOWER(@value) NOT IN ('none', 'drop', 'delete', 'truncate')
- BEGIN
- RAISERROR (14061, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Determine the integer value for the type.
- */
-
- IF LOWER(@value) = 'none'
- SELECT @precmdid = 0
- ELSE IF LOWER(@value) = 'drop'
- SELECT @precmdid = 1
- ELSE IF LOWER(@value) = 'delete'
- SELECT @precmdid = 2
- ELSE IF LOWER(@value) = 'truncate'
- SELECT @precmdid = 3
-
- /*
- ** Update the article with the new pre_creation_cmd.
- */
- UPDATE sysarticles
- SET pre_creation_cmd = @precmdid
- WHERE artid = @artid
- AND pubid = @pubid
-
- IF @@ERROR <> 0 RETURN (1)
-
- END
-
- /*
- ** Force the article cache to be refreshed with the new definition.
- */
- EXECUTE sp_replflush
-
- /*
- ** Return succeed.
- */
-
- RAISERROR (14025, 10, -1)
- RETURN (0)
- go
-
- print ''
- print 'Creating procedure sp_changesubscriber.'
- go
- CREATE PROCEDURE sp_changesubscriber (
- @subscriber varchar (30),
- @type tinyint = 0,
- @login varchar (30) = NULL,
- @password varchar (30) = NULL,
- @commit_batch_size int = NULL,
- @status_batch_size int = NULL,
- @flush_frequency int = NULL,
- @frequency_type int = NULL,
- @frequency_interval int = NULL,
- @frequency_relative_interval int = NULL,
- @frequency_recurrence_factor int = NULL,
- @frequency_subday int = NULL,
- @frequency_subday_interval int = NULL,
- @active_start_time_of_day int = NULL,
- @active_end_time_of_day int = NULL,
- @active_start_date int = NULL,
- @active_end_date int = NULL,
- @description varchar (255) = NULL
- ) AS
-
- DECLARE @distributor varchar(30)
- DECLARE @distribdb varchar(30)
- DECLARE @distproc varchar (255)
- DECLARE @msg varchar(255)
- DECLARE @retcode int
-
- /*
- ** Check to make sure that the subscriber doesn't already exist.
- */
- IF NOT EXISTS (SELECT *
- FROM master..sysservers
- WHERE srvname = @subscriber)
- BEGIN
- SELECT @msg = 'The server ''' + @subscriber +
- ''' is not a valid subscriber.'
- PRINT @msg
- RETURN (0)
- END
-
- /*
- ** Get distribution server information for remote RPC
- ** subscription calls.
- */
- EXEC @retcode = sp_helpdistributor @distributor = @distributor OUTPUT,
- @distribdb = @distribdb OUTPUT
- IF @@ERROR <> 0 OR @retcode <> 0
- BEGIN
- PRINT 'Unable to update distribution database MSsubscriberinfo table.'
- RETURN (1)
- END
-
- /*
- ** Update MSsubscriber_info
- */
- SELECT @distproc = RTRIM(@distributor) + '.' +
- RTRIM(@distribdb) + '..sp_MSupdate_subscriber_info '
- EXEC @retcode = @distproc
- @@SERVERNAME,
- @subscriber,
- @type,
- @login,
- @password,
- @commit_batch_size,
- @status_batch_size,
- @flush_frequency,
- @frequency_type,
- @frequency_interval,
- @frequency_relative_interval,
- @frequency_recurrence_factor,
- @frequency_subday,
- @frequency_subday_interval,
- @active_start_time_of_day,
- @active_end_time_of_day,
- @active_start_date,
- @active_end_date,
- @description = @description
- IF @@ERROR <> 0 OR @retcode <> 0
- BEGIN
- SELECT @msg = 'The server ''' + @subscriber +
- ''' is not a valid subscriber.'
- PRINT @msg
- RETURN (1)
- END
- go
-
- print ''
- print 'Creating procedure sp_distcounters'
- go
- CREATE PROCEDURE sp_distcounters
- AS
-
- SET NOCOUNT ON
-
- /*
- ** Declarations.
- */
- DECLARE @distributor varchar(30)
- DECLARE @distribdb varchar(30)
- DECLARE @distproc varchar (255)
- DECLARE @retcode int
-
- /*
- ** Get distribution server information for remote RPC
- ** subscription calls. If no distribution information, assume
- ** replication is not being used.
- */
- EXEC @retcode = sp_helpdistributor @distributor = @distributor OUTPUT,
- @distribdb = @distribdb OUTPUT
- IF @@error <> 0 OR @retcode <> 0 OR @distributor IS NULL OR
- @distribdb IS NULL
- RETURN (1)
-
- /*
- ** Request counters from Distribution Server
- */
- SELECT @distproc = RTRIM(@distributor) + '.' + RTRIM(@distribdb) +
- '..sp_MSdistribution_counters '
- EXEC @retcode = @distproc @@SERVERNAME
- go
-
- print ''
- print 'Creating procedure sp_droparticle.'
- go
-
- CREATE PROCEDURE sp_droparticle(
- @publication varchar(30), /* The publication name */
- @article varchar(30) /* The article name */
-
- ) AS
-
- /*
- ** Declarations.
- */
-
- DECLARE @cmd varchar(255)
- DECLARE @objid int
- DECLARE @pubid int
- DECLARE @publish_bit smallint
- DECLARE @retcode int
- DECLARE @filter_name varchar (30)
- DECLARE @view_name varchar (30)
- DECLARE @type tinyint
-
- /*
- ** Initializations.
- */
-
- SELECT @publish_bit = 32 /* Const: publishing server bit */
-
- /*
- ** Security Check.
- ** Only the System Administrator (SA) or the Database Owner (dbo) can
- ** drop an article from a publication.
- */
- IF suser_id() <> 1 AND user_id() <> 1
- BEGIN
- RAISERROR (15000, 14, -1)
- RETURN (1)
- END
-
- /*
- ** Get the @pubid.
- */
-
- SELECT @pubid = pubid FROM syspublications WHERE name = @publication
-
- /*
- ** Parameter Check: @article.
- ** If the @article is 'all', drop all articles for the specified
- ** publication (@publication).
- */
-
- IF LOWER(@article) = 'all'
- BEGIN
- SELECT @cmd = ''
- SELECT @cmd = @cmd + 'DECLARE hC SCROLL CURSOR FOR '
- SELECT @cmd = @cmd + ' SELECT DISTINCT name '
- SELECT @cmd = @cmd + ' FROM sysarticles '
- SELECT @cmd = @cmd + ' WHERE pubid = ' + CONVERT(varchar(10), @pubid)
- EXECUTE (@cmd)
- OPEN hC
- FETCH hC INTO @article
- WHILE (@@fetch_status <> -1)
- BEGIN
- EXECUTE sp_droparticle @publication, @article
- FETCH hC INTO @article
- END
- CLOSE hC
- DEALLOCATE hC
- RETURN (0)
- END
-
- /*
- ** Parameter Check: @article.
- ** The @article name must conform to the rules for identifiers.
- */
-
- IF @article IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The article')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @article
-
- IF @retcode <> 0
- RETURN (1)
-
- /*
- ** Parameter Check: @publication.
- ** The @publication name must conform to the rules for identifiers.
- */
-
- IF @publication IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @publication
-
- IF @retcode <> 0
- RETURN (1)
-
- IF NOT EXISTS (SELECT * FROM syspublications WHERE name = @publication)
- BEGIN
- RAISERROR (15001, 11, -1, @publication)
- RETURN (1)
- END
-
- /*
- ** Ascertain the existence of the article.
- */
-
- IF NOT EXISTS (SELECT *
- FROM sysarticles
- WHERE name = @article
- AND pubid = @pubid)
- BEGIN
- RAISERROR (15001, 11, -1, @article)
- RETURN (1)
- END
-
- /*
- ** Check to make sure that there are no subscriptions on the article.
- */
-
- IF EXISTS (SELECT *
- FROM syssubscriptions, sysarticles
- WHERE sysarticles.name = @article
- AND sysarticles.pubid = @pubid
- AND sysarticles.artid = syssubscriptions.artid)
- BEGIN
- RAISERROR (14046, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Delete article from sysarticles and clear publish bit in
- ** sysobjects.
- */
-
- BEGIN TRAN droparticle
-
- /*
- ** Retrieve the object id of the underlying table.
- */
-
- SELECT @objid = objid, @type = type
- FROM sysarticles
- WHERE name = @article
- AND pubid = @pubid
-
- /*
- ** If this article is the only one that references this object,
- ** then we can safely turn off the publish bit in sysobjects.
- */
-
- IF NOT EXISTS (SELECT *
- FROM sysarticles
- WHERE objid = @objid
- AND NOT (name = @article AND pubid = @pubid))
- BEGIN
- UPDATE sysobjects SET category = category & ~@publish_bit
- WHERE id = (SELECT objid
- FROM sysarticles
- WHERE name = @article
- AND pubid = @pubid)
-
- IF @@ERROR <> 0
- BEGIN
- ROLLBACK TRAN
- RAISERROR (14047, 16, -1, 'the article')
- RETURN (1)
- END
- END
-
- /*
- ** Drop article view if not logbased manualview (type = 5)
- */
- IF (@type & 5) = 1
- BEGIN
- SELECT @view_name = sysobjects.name
- FROM sysarticles, sysobjects
- WHERE sysarticles.name = @article
- AND pubid = @pubid
- AND sync_objid = sysobjects.id
- AND sysobjects.type = 'V'
- END
-
- /*
- ** Drop article filter if not logbased manualfilter (type = 3)
- */
- IF (@type & 3) = 1
- BEGIN
- SELECT @filter_name = sysobjects.name
- FROM sysarticles, sysobjects
- WHERE sysarticles.name = @article
- AND pubid = @pubid
- AND filter = sysobjects.id
- AND sysobjects.type = 'RF'
-
- END
-
- /*
- ** Drop all article columns. This is done to force all Text\Image
- ** column status to be updated.
- */
- EXECUTE @retcode = sp_articlecolumn @publication, @article,
- @operation = 'drop'
- IF @@ERROR <> 0 OR @retcode <> 0
- BEGIN
- ROLLBACK TRAN droparticle
- RETURN (1)
- END
-
- /*
- ** Remove the row from sysarticles.
- */
- DELETE
- FROM sysarticles
- WHERE name = @article
- AND pubid = @pubid
-
- IF @@ERROR <> 0
- BEGIN
- ROLLBACK TRAN
- RAISERROR (14047, 16, -1, 'the article')
- RETURN (1)
- END
-
- COMMIT TRAN droparticle
-
- IF @view_name IS NOT NULL
- exec ('drop view ' + @view_name)
-
- IF @filter_name IS NOT NULL
- exec ('drop procedure ' + @filter_name)
-
- /*
- ** Force the article cache to be refreshed.
- */
- EXECUTE sp_replflush
- go
-
- print ''
- print 'Creating procedure sp_droppublication.'
- go
- CREATE PROCEDURE sp_droppublication(
- @publication varchar(30) /* The publication name */
- ) AS
-
- /*
- ** Declarations.
- */
-
- DECLARE @article varchar(30)
- DECLARE @cmd varchar(255)
- DECLARE @retcode int
- DECLARE @taskid int
- DECLARE @distributor varchar(30)
- DECLARE @distribdb varchar(30)
- DECLARE @distproc varchar (255)
-
- /*
- ** Only the System Administrator (SA) or the Database Owner (dbo) can drop
- ** a publication.
- */
-
- IF suser_id() <> 1 AND user_id() <> 1
- BEGIN
- RAISERROR (15000, 14, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @publication.
- ** If the @publication is 'all', drop all publications. Otherwise,
- ** make sure the @publication is a valid non-null identifier.
- */
-
- IF LOWER(@publication) = 'all'
- BEGIN
- SELECT @cmd = ''
- SELECT @cmd = @cmd + 'DECLARE hC1 SCROLL CURSOR FOR '
- SELECT @cmd = @cmd + ' SELECT DISTINCT name '
- SELECT @cmd = @cmd + ' FROM syspublications '
- SELECT @cmd = @cmd + ' WHERE pubid NOT IN '
- SELECT @cmd = @cmd + '(SELECT pubid FROM sysarticles WHERE artid IN '
- SELECT @cmd = @cmd + '(SELECT artid FROM syssubscriptions))'
- EXECUTE (@cmd)
- OPEN hC1
- FETCH hC1 INTO @publication
- WHILE (@@fetch_status <> -1)
- BEGIN
- EXECUTE sp_droppublication @publication
- FETCH hC1 INTO @publication
- END
- CLOSE hC1
- DEALLOCATE hC1
- RETURN (0)
- END
-
- IF @publication IS NULL
- BEGIN
- RAISERROR (14003, 16, -1)
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @publication
-
- IF @retcode <> 0
- RETURN (1)
-
- /*
- ** Ascertain the existence of the publication and get the taskid.
- */
- SELECT @taskid = taskid
- FROM syspublications
- WHERE name = @publication
- IF @taskid IS NULL
- BEGIN
- RAISERROR (15001, 11, -1, @publication)
- RETURN (1)
- END
-
- /*
- ** Check to make sure that there are no subscriptions on the publication.
- */
-
- IF EXISTS (SELECT *
- FROM syssubscriptions a, sysarticles b, syspublications c
- WHERE c.name = @publication
- AND c.pubid = b.pubid
- AND b.artid = a.artid)
- BEGIN
- RAISERROR (14005, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Delete all articles from the publication.
- */
-
- SELECT @cmd = ''
- SELECT @cmd = @cmd + 'DECLARE hC2 SCROLL CURSOR FOR '
- SELECT @cmd = @cmd + ' SELECT DISTINCT name '
- SELECT @cmd = @cmd + ' FROM sysarticles '
- SELECT @cmd = @cmd + ' WHERE pubid = (SELECT pubid '
- SELECT @cmd = @cmd + ' FROM syspublications '
- SELECT @cmd = @cmd + ' WHERE name = ''' + @publication + ''')'
- EXECUTE (@cmd)
- OPEN hC2
- FETCH hC2 INTO @article
- WHILE (@@fetch_status <> -1)
- BEGIN
- EXECUTE sp_droparticle @publication, @article
- FETCH hC2 INTO @article
- END
- CLOSE hC2
- DEALLOCATE hC2
-
- /*
- ** Delete publication from syspublications.
- */
-
- DELETE
- FROM syspublications
- WHERE name = @publication
-
- IF @@ERROR <> 0
- BEGIN
- RAISERROR (14006, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Get distribution server information for remote RPC call.
- */
- EXEC @retcode = sp_helpdistributor @distributor = @distributor OUTPUT,
- @distribdb = @distribdb OUTPUT
-
- IF @@ERROR <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14071, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Delete sync task of Publication.
- */
- SELECT @distproc = RTRIM(@distributor) + '.msdb..sp_droptask'
- EXECUTE @distproc @id = @taskid
- go
-
-
- print ''
- print 'Creating procedure sp_droppublisher.'
- go
- CREATE PROCEDURE sp_droppublisher (
- @publisher varchar (30), /* publisher server name */
- @type varchar (5) = NULL /* NULL or 'dist' */
- ) AS
-
- DECLARE @distaccount varchar(127)
- DECLARE @proc varchar (255)
- DECLARE @retcode int
- DECLARE @privilege varchar (30)
-
- /*
- ** Parameter Check: @publisher.
- ** Check to make sure that the publisher exists, that the name isn't
- ** NULL, and that the name conforms to the rules for identifiers.
- */
-
- IF @publisher IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publisher')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @publisher
-
- IF @retcode <> 0
- RETURN (1)
-
- /*
- ** Perform special logic if dropping a publisher for a distribution
- ** server.
- */
- IF LOWER(@type) = 'dist'
- BEGIN
- IF NOT EXISTS (SELECT *
- FROM master..sysservers
- WHERE srvname = @publisher
- AND srvstatus & 16 <> 0)
-
- BEGIN
- RAISERROR (14080, 11, -1)
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_serveroption @publisher, 'dpub', false
- IF @@ERROR <> 0 OR @retcode <> 0 RETURN (1)
-
- IF EXISTS (SELECT * FROM master..sysremotelogins
- WHERE remoteserverid = (SELECT srvid FROM master..sysservers
- WHERE srvname = @publisher)
- AND remoteusername = 'sa'
- AND suid = 1) /* 'sa' */
- BEGIN
- EXECUTE @retcode = sp_dropremotelogin @publisher, sa, sa
- IF @@ERROR <> 0 OR @retcode <> 0 RETURN (1)
- END
-
- IF EXISTS (SELECT * FROM master..sysremotelogins
- WHERE remoteserverid = (SELECT srvid FROM master..sysservers
- WHERE srvname = @publisher)
- AND remoteusername = 'probe'
- AND suid = 2) /* 'probe' */
- BEGIN
- EXECUTE @retcode = sp_dropremotelogin @publisher, probe, probe
- IF @@ERROR <> 0 OR @retcode <> 0 RETURN (1)
- END
-
- RETURN (0)
- END
-
- /*
- ** Make sure the server is defined as a 'publisher'.
- */
- IF NOT EXISTS (SELECT *
- FROM master..sysservers
- WHERE srvname = @publisher
- AND srvstatus & 2 <> 0)
-
- BEGIN
- RAISERROR (14080, 11, -1)
- RETURN (1)
- END
-
- /*
- ** Fetch the publisher's distributor account.
- */
-
- SELECT @proc = RTRIM(@publisher) + '.master..sp_helpdistributor '
- EXEC @retcode = @proc @account = @distaccount OUTPUT
- IF @@ERROR <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14071, 16, -1)
- RETURN (1)
- END
-
- /*
- ** If @distaccount = 'LocalSystem' assume 'admin' privilege
- */
- IF @distaccount = 'LocalSystem'
- RETURN (0)
-
- /*
- ** If @distaccount has 'admin' privilege, do not revoke
- */
- EXECUTE @retcode = master.dbo.xp_logininfo @distaccount, 'all',
- @privilege = @privilege output
- IF @@error <> 0 OR @retcode <> 0 RETURN (1)
-
- IF @privilege = 'admin'
- RETURN (0)
-
- /*
- ** Revoke replication privilege to the distributor NT account.
- */
- EXEC @retcode = master.dbo.xp_revokelogin @distaccount
- IF @@ERROR <> 0 OR @retcode <> 0 RETURN (1)
-
- /*
- ** Turn off the server option to indicate that this is a publisher.
- */
- EXECUTE @retcode = sp_serveroption @publisher, 'pub', false
- IF @@ERROR <> 0 OR @retcode <> 0 RETURN (1)
- go
-
- print ''
- print 'Creating procedure sp_dropsubscriber.'
- go
- CREATE PROCEDURE sp_dropsubscriber (
- @subscriber varchar (30) /* The name of the subscriber */
- ) AS
-
- SET NOCOUNT ON
-
- /*
- ** Declarations.
- */
-
- DECLARE @retcode int
-
- /*
- ** Security Check.
- ** Only the System Administrator (SA) or the Database Owner (dbo) can
- ** drop a subscriber
- */
- IF suser_id() <> 1 AND user_id() <> 1
- BEGIN
- RAISERROR (15000, 14, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @subscriber.
- ** Check to make sure that the subscriber exists.
- */
-
- IF @subscriber IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The subscriber')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @subscriber
-
- IF @retcode <> 0
- RETURN (1)
-
- IF NOT EXISTS (SELECT *
- FROM master..sysservers
- WHERE srvname = @subscriber
- AND srvstatus & 4 <> 0)
-
- BEGIN
- RAISERROR (14048, 16, -1, @subscriber)
- RETURN (1)
- END
-
- /*
- ** Drop the remote logins associated with this server.
- */
-
- IF EXISTS (SELECT * FROM master..sysremotelogins
- WHERE remoteserverid = (SELECT srvid FROM master..sysservers
- WHERE srvname = @subscriber)
- AND remoteusername = 'sa'
- AND suid = 16383) /* 'repl_subscriber' */
- BEGIN
- EXECUTE @retcode = sp_dropremotelogin @subscriber,
- 'repl_subscriber', 'sa'
- IF @@ERROR <> 0
- BEGIN
- ROLLBACK TRANSACTION
- RAISERROR (14047, 16, -1, @subscriber)
- RETURN (1)
- END
-
- IF @retcode <> 0
- BEGIN
- ROLLBACK TRANSACTION
- RETURN (1)
- END
- END
-
- /*
- ** Turn off the subscriber server option.
- */
- EXECUTE @retcode = sp_serveroption @subscriber, 'sub', false
- IF @@ERROR <> 0
- BEGIN
- ROLLBACK TRANSACTION
- RAISERROR (14047, 16, -1, @subscriber)
- RETURN (1)
- END
-
- IF @retcode <> 0
- BEGIN
- ROLLBACK TRANSACTION
- RETURN (@retcode)
- END
-
- RAISERROR (14062, 10, -1)
- go
-
- print ''
- print 'Creating procedure sp_dropsubscription.'
- go
- CREATE PROCEDURE sp_dropsubscription (
- @publication varchar (30) = NULL, /* The publication name */
- @article varchar (30) = NULL, /* The article name */
- @subscriber varchar (30) /* The subscriber name */
- ) AS
-
- /*
- ** Declarations.
- */
-
- DECLARE @subscriber_bit smallint
- DECLARE @cmd varchar(255)
- DECLARE @srvid smallint
- DECLARE @artid int
- DECLARE @retcode int
- DECLARE @active tinyint
-
- /*
- ** Initializations.
- */
- SET NOCOUNT ON
- SELECT @subscriber_bit = 4 /* Const: subscription server status */
- SELECT @active = 2 /* Const: subscription status 'active' */
-
- /*
- ** Security Check.
- ** Only the System Administrator (SA) or the Database Owner (dbo) can
- ** add an article to a publication.
- */
-
- IF suser_id() <> 1 AND user_id() <> 1
- BEGIN
- RAISERROR (15000, 14, -1)
- RETURN (1)
- END
-
- /*
- ** If the @subscriber is 'all', the user wants to cancel all subscriptions
- ** to the specified article(s).
- */
-
- IF LOWER(@subscriber) = 'all'
- BEGIN
- SELECT @cmd = ''
- SELECT @cmd = @cmd + 'DECLARE hC1 SCROLL CURSOR FOR '
- SELECT @cmd = @cmd + ' SELECT DISTINCT srvname '
- SELECT @cmd = @cmd + ' FROM master..sysservers a, syssubscriptions b '
- SELECT @cmd = @cmd + ' WHERE srvstatus & ' + CONVERT(char(1), @subscriber_bit) + ' <> 0 '
- SELECT @cmd = @cmd + ' AND a.srvid = b.srvid '
- EXECUTE (@cmd)
- OPEN hC1
- FETCH hC1 INTO @subscriber
- WHILE (@@fetch_status <> -1)
- BEGIN
- EXECUTE sp_dropsubscription @publication = 'all',
- @subscriber = @subscriber
- FETCH hC1 INTO @subscriber
- END
- CLOSE hC1
- DEALLOCATE hC1
- RETURN (0)
- END
-
- /*
- ** Parameter Check: @subscriber.
- ** Check if the server exists and that it is a subscription server.
- */
-
- IF @subscriber IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The subscriber')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @subscriber
-
- IF @retcode <> 0
- RETURN (1)
-
- SELECT @srvid = srvid
- FROM sysservers
- WHERE srvname = @subscriber
- AND (srvstatus & @subscriber_bit) <> 0
-
- IF @srvid IS NULL
- BEGIN
- RAISERROR (14010, 16, -1)
- RETURN (1)
- END
-
- /*
- ** If the @publication is 'all', the user wants to cancel all subscriptions
- ** for all publications associated with the specified @subscriber.
- */
-
- IF LOWER(@publication) = 'all'
- BEGIN
- SELECT @cmd = ''
- SELECT @cmd = @cmd + 'DECLARE hC2 SCROLL CURSOR FOR '
- SELECT @cmd = @cmd + ' SELECT DISTINCT a.name '
- SELECT @cmd = @cmd + ' FROM syspublications a, '
- SELECT @cmd = @cmd + ' sysarticles b, '
- SELECT @cmd = @cmd + ' syssubscriptions c '
- SELECT @cmd = @cmd + ' WHERE c.srvid = ' + CONVERT(char(10), @srvid)
- SELECT @cmd = @cmd + ' AND a.pubid = b.pubid '
- SELECT @cmd = @cmd + ' AND b.artid = c.artid '
- EXECUTE (@cmd)
- OPEN hC2
- FETCH hC2 INTO @publication
- WHILE (@@fetch_status <> -1)
- BEGIN
- EXECUTE sp_dropsubscription @publication = @publication,
- @article = 'all',
- @subscriber = @subscriber
- FETCH hC2 INTO @publication
- END
- CLOSE hC2
- DEALLOCATE hC2
- RETURN (0)
- END
-
- /*
- ** Parameter Check: @publication.
- ** Check to make sure that the publication exists and that it conforms
- ** to the rules for identifiers.
- */
-
- IF @publication IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @publication
-
- IF @retcode <> 0
- RETURN (1)
-
- IF NOT EXISTS (SELECT * FROM syspublications WHERE name = @publication)
- BEGIN
- RAISERROR (15001, 11, -1, @publication)
- RETURN (1)
- END
-
- /*
- ** If the @article is 'all', the user wants to cancel all
- ** subscriptions on this publisher associated with the given @subscriber
- ** and @publication.
- */
-
- IF LOWER(@article) = 'all'
- BEGIN
- SELECT @cmd = ''
- SELECT @cmd = @cmd + 'DECLARE hC3 SCROLL CURSOR FOR '
- SELECT @cmd = @cmd + 'SELECT DISTINCT art.name '
- SELECT @cmd = @cmd + 'FROM sysarticles art, '
- SELECT @cmd = @cmd + 'syssubscriptions sub, '
- SELECT @cmd = @cmd + 'syspublications pub '
- SELECT @cmd = @cmd + 'WHERE sub.srvid = ' + CONVERT(char(10), @srvid)
- SELECT @cmd = @cmd + 'AND sub.artid = art.artid '
- SELECT @cmd = @cmd + 'AND art.pubid = pub.pubid '
- SELECT @cmd = @cmd + 'AND pub.name = ''' + @publication + ''''
- EXECUTE (@cmd)
- OPEN hC3
- FETCH hC3 INTO @article
- WHILE (@@fetch_status <> -1)
- BEGIN
- EXECUTE sp_dropsubscription @publication,
- @article,
- @subscriber
- FETCH hC3 INTO @article
- END
- CLOSE hC3
- DEALLOCATE hC3
- RETURN (0)
- END
-
- /*
- ** Parameter Check: @article
- ** Check if the article exists.
- */
-
- IF @article IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The article')
- RETURN (1)
- END
-
- EXECUTE @retcode = sp_validname @article
-
- IF @retcode <> 0
- RETURN (1)
-
- SELECT @artid = artid
- FROM sysarticles art, syspublications pub
- WHERE pub.name = @publication
- AND art.name = @article
- AND art.pubid = pub.pubid
-
- IF @artid IS NULL
- BEGIN
- RAISERROR (15001, 11, -1, @article)
- RETURN (1)
- END
-
- /*
- ** Check if the subscription exists.
- */
-
- IF NOT EXISTS (SELECT *
- FROM syssubscriptions
- WHERE srvid = @srvid
- AND artid = @artid)
- BEGIN
- RAISERROR (14055, 11, -1, @article, @publication, @subscriber)
- RETURN (1)
- END
-
- BEGIN TRANSACTION dropsubscription
-
- /*
- ** Change the status of the subscription to 'inactive'.
- */
-
- EXECUTE @retcode = sp_changesubstatus @publication,
- @article,
- @subscriber,
- @status = 'inactive'
- IF @@ERROR <> 0 OR @retcode <> 0
- BEGIN
- ROLLBACK TRANSACTION dropsubscription
- RETURN (1)
- END
- /*
- ** Remove subscription from syssubscriptions.
- */
-
- DELETE syssubscriptions
- WHERE artid = @artid
- AND srvid = @srvid
-
- IF @@ERROR <> 0
- BEGIN
- ROLLBACK TRANSACTION dropsubscription
- RAISERROR (14055, 16, -1, @article, @publication, @subscriber)
- RETURN (1)
- END
-
- COMMIT TRANSACTION dropsubscription
-
- /*
- ** If no more replication in database, unmark all replicated
- ** transactions in the database log.
- */
- IF NOT EXISTS (SELECT * FROM syssubscriptions where status = @active)
- BEGIN
- EXEC sp_repldone 0, 0, NULL, 0, 0, 1
- checkpoint
- END
- go
-
- print ''
- print 'Creating procedure sp_dsninfo.'
- go
- CREATE PROCEDURE sp_dsninfo
- @dsn varchar (30),
- @infotype varchar (30) = NULL,
- @login varchar (30) = NULL,
- @password varchar (30) = NULL
- AS
-
- SET NOCOUNT ON
-
- DECLARE @distributor varchar(30)
- DECLARE @distproc varchar (255)
- DECLARE @retcode int
-
- /*
- ** Get distribution server information for remote RPC
- ** subscription calls.
- */
-
- EXEC @retcode = sp_helpdistributor @distributor = @distributor OUTPUT
- IF @@error <> 0 OR @retcode <> 0
- BEGIN
- RAISERROR (14071, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Call xp_dsninfo
- */
- SELECT @distproc = RTRIM(@distributor) + '.master..xp_dsninfo '
- EXEC @retcode = @distproc @dsn, @infotype, @login, @password
- IF @@error <> 0
- BEGIN
- RAISERROR (14071, 16, -1)
- RETURN (1)
- END
-
- go
-
- print ''
- print 'Creating procedure sp_publishdb.'
- go
- CREATE PROCEDURE sp_publishdb @dbname varchar(30),@value varchar (5)
- AS
-
- DECLARE @retcode int
- DECLARE @distributor varchar(30)
- DECLARE @distribdb varchar(30)
- DECLARE @distproc varchar (255)
- DECLARE @taskname varchar (40)
-
- /*
- ** Construct Log Reader task name.
- */
- select @taskname = @@SERVERNAME + '_' + @dbname
-
- /*
- ** Get distribution server information for remote RPC call.
- */
- EXECUTE @retcode = sp_helpdistributor @distributor = @distributor OUTPUT,
- @distribdb = @distribdb OUTPUT
-
- IF @@ERROR <> 0 or @retcode <> 0
- BEGIN
- IF LOWER(@value) = 'true'
- RAISERROR (14036, 16, -1)
- ELSE
- RAISERROR (14038, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Enable the database for publishing.
- */
- IF @value = 'true'
- begin
- /*
- ** Check if the database has already been enabled.
- */
- IF EXISTS (SELECT * FROM sysdatabases
- WHERE name = @dbname
- AND (category & 1) <> 0)
- BEGIN
- RAISERROR (14035, 10, -1, @dbname)
- RETURN (0)
- END
-
- /*
- ** Schedule Log Reader task for the database
- */
- SELECT @distproc = RTRIM(@distributor) + '.msdb..sp_addtask'
- EXECUTE @retcode = @distproc
- @taskname,
- @subsystem = 'LogReader',
- @server = @@SERVERNAME,
- @databasename = @dbname,
- @freqtype = 64, /* Auto-Start */
- @retryattempts = 1440, /* Every minute for 24 hours */
- @retrydelay = 1,
- @command = '-b100 -c100 -i1000',
- @enabled = 1,
- @loghistcompletionlevel = 0
- IF @@ERROR <> 0 or @retcode <> 0
- BEGIN
- RETURN (1)
- END
-
- /*
- ** Add the repl_subscriber user account to the database.
- */
- IF NOT EXISTS (SELECT * FROM sysusers WHERE name = 'repl_subscriber')
- EXECUTE sp_adduser 'repl_subscriber'
- END
-
- else /* Disable the database for publishing. */
- begin
- /*
- ** Check if the database is enabled for publishing.
- */
- IF NOT EXISTS (SELECT * FROM sysdatabases
- WHERE name = @dbname
- AND (category & 1) <> 0)
- BEGIN
- RAISERROR (14013, 10, -1)
- return (0)
- END
- /*
- ** Delete logreader task, continue if drop is not successful
- */
- SELECT @distproc = RTRIM(@distributor) + '.msdb..sp_droptask'
- EXECUTE @distproc @name = @taskname
-
- /*
- ** Remove all subscriptions in the database.
- */
- EXEC sp_dropsubscription @publication = 'all',
- @article = 'all', @subscriber = 'all'
-
- /*
- ** Remove all publications and articles in the database.
- */
- EXEC sp_droppublication @publication = 'all'
-
- /*
- ** Remove all published database jobs from the distribution
- ** database.
- */
- SELECT @distproc = RTRIM(@distributor) + '.' +
- RTRIM(@distribdb) + '..sp_MSremove_published_jobs '
- EXEC @distproc @@SERVERNAME, @dbname
-
- /*
- ** Remove the repl_subscriber user account from the database.
- */
- IF EXISTS (SELECT * FROM sysusers WHERE name = 'repl_subscriber')
- exec sp_dropuser 'repl_subscriber'
- end
-
- return(0)
- go
-
- print ''
- print 'Creating procedure sp_subscribe.'
- go
- CREATE PROCEDURE sp_subscribe (
- @publication varchar(30), /* publication name */
- @article varchar(30) = 'all', /* article name */
- @destination_db varchar (30) = NULL, /* subscriber database */
- @sync_type varchar (15) = 'automatic' /* subscription sync type */
- ) AS
-
- SET NOCOUNT ON
-
- /*
- ** Declarations.
- */
-
- DECLARE @artid int
- DECLARE @none tinyint
- DECLARE @automatic tinyint
- DECLARE @cmd varchar(255)
- DECLARE @inactive tinyint
- DECLARE @manual tinyint
- DECLARE @pubid int
- DECLARE @restricted bit
- DECLARE @retcode int
- DECLARE @srvid smallint
- DECLARE @sync_typeid smallint
- DECLARE @subscriber_bit smallint
-
- /*
- ** Security Check
- ** Only the System Administratr (SA) or the Database Owner (dbo) or
- ** Replication subscriber (repl_subscriber) can subscribe to an article.
- */
-
- IF suser_id() <> 1 AND user_id() <> 1 AND user_id() <> 16383
- BEGIN
- RAISERROR (14093, 14, -1)
- RETURN (1)
- END
-
- /*
- ** Initializations.
- */
-
- SELECT @none = 2 /* Const: synchronization type 'none' */
- SELECT @automatic = 1 /* Const: synchronization type 'automatic' */
- SELECT @manual = 0 /* Const: synchronization type 'manual' */
- SELECT @restricted = 1 /* Const: security option 'restricted' */
- SELECT @inactive = 0 /* Const: subscription status 'inactive' */
- SELECT @subscriber_bit = 4 /* Const: subscription server status */
-
- /*
- ** Check to make sure that this procedure is not being executed on the
- ** publisher (locally).
- */
-
- IF @@REMSERVER IS NULL
- BEGIN
- RAISERROR (14073, 16, -1)
- RETURN (1)
- END
-
- SELECT @srvid = srvid
- FROM master..sysservers
- WHERE srvname = @@REMSERVER
- AND (srvstatus & @subscriber_bit) <> 0
-
- IF @srvid IS NULL
- BEGIN
- RAISERROR (14010, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @publication.
- ** Check to make sure that the publication exists and that it conforms
- ** to the rules for identifiers.
- */
-
- IF @publication IS NOT NULL
- BEGIN
-
- EXECUTE @retcode = sp_validname @publication
-
- IF @retcode <> 0
- RETURN (1)
-
- IF NOT EXISTS (SELECT * FROM syspublications WHERE name = @publication)
- BEGIN
- RAISERROR (15001, 11, -1, @publication)
- RETURN (1)
- END
-
- END
-
- SELECT @pubid = pubid FROM syspublications WHERE name = @publication
-
- IF @pubid IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @article
- ** Check to make sure that the article exists, is not NULL, and
- ** conforms to the rules for identifiers.
- */
-
- IF LOWER(@article) = 'all'
- /*
- ** Get all articles in the publication that are not subscribed to
- ** by the @subscriber
- */
- BEGIN
-
- IF EXISTS (SELECT *
- FROM syspublications
- WHERE name = @publication
- AND restricted = 1)
-
- BEGIN
-
- SELECT DISTINCT 'name' = a.name
- INTO #tab1
- FROM sysarticles a,
- syspublications b,
- syssubscriptions c,
- master..sysservers d
- WHERE a.pubid = b.pubid
- AND b.name = @publication
- AND a.artid = c.artid
- AND c.srvid = d.srvid
- AND c.status = @inactive
- AND d.srvname = @@REMSERVER
-
- CREATE UNIQUE INDEX idx1 ON #tab1 (name)
- SELECT @cmd = 'DECLARE hCx SCROLL CURSOR FOR SELECT name FROM #tab1'
-
- END
-
- ELSE
-
- BEGIN
-
- SELECT DISTINCT 'name' = a.name
- INTO #tab2
- FROM sysarticles a, syspublications b
- WHERE a.pubid = b.pubid
- AND b.name = @publication
- AND NOT EXISTS (SELECT * from syssubscriptions s
- WHERE s.artid = a.artid
- AND s.srvid = @srvid)
-
- CREATE UNIQUE INDEX idx1 ON #tab2 (name)
- SELECT @cmd = 'DECLARE hCx SCROLL CURSOR FOR SELECT name FROM #tab2'
-
- END
-
- /*
- SELECT @cmd = ''
- SELECT @cmd = @cmd + 'DECLARE hCx SCROLL CURSOR FOR '
- SELECT @cmd = @cmd + ' SELECT DISTINCT a.name '
- SELECT @cmd = @cmd + ' FROM sysarticles a, syspublications b '
- SELECT @cmd = @cmd + ' WHERE a.pubid = b.pubid '
- SELECT @cmd = @cmd + ' AND b.name = ''' + @publication + ''''
- */
-
- EXECUTE (@cmd)
- OPEN hCx
- FETCH hCx INTO @article
- WHILE (@@fetch_status <> -1)
- BEGIN
- EXECUTE sp_subscribe @publication = @publication,
- @article = @article,
- @destination_db = @destination_db,
- @sync_type = @sync_type
- FETCH hCx INTO @article
- END
- CLOSE hCx
- DEALLOCATE hCx
- RETURN (0)
- END
-
- IF @article IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The article')
- RETURN (1)
- END
-
- SELECT @artid = artid
- FROM sysarticles
- WHERE name = @article
- AND pubid = @pubid
-
- EXECUTE @retcode = sp_validname @article
- IF @retcode <> 0
- RETURN (1)
-
- IF NOT EXISTS (SELECT *
- FROM sysarticles
- WHERE artid = @artid
- AND pubid = @pubid)
- BEGIN
- RAISERROR (15001, 11, -1, @article)
- RETURN (1)
- END
-
- IF @artid IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The article')
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @sync_type.
- ** Set sync_typeid based on the @sync_type specified.
- **
- ** sync_typeid sync_type
- ** =========== =========
- ** 0 manual
- ** 1 automatic
- ** 2 none
- */
-
- IF LOWER(@sync_type) NOT IN ('automatic', 'manual', 'none')
- BEGIN
- RAISERROR (14052, 16, -1)
- RETURN (1)
- END
-
- IF LOWER(@sync_type) IN ('automatic')
- SELECT @sync_typeid = @automatic
- ELSE IF LOWER(@sync_type) IN ('manual')
- SELECT @sync_typeid = @manual
- ELSE
- SELECT @sync_typeid = @none
-
- /*
- ** Parameter Check: @destination_db.
- ** Set @destination_db to current database if not specified. Make
- ** sure that the @destination_db conforms to the rules for identifiers.
- */
-
- IF @destination_db IS NULL SELECT @destination_db = DB_NAME()
-
- EXECUTE @retcode = sp_validname @destination_db
-
- IF @retcode <> 0
- RETURN (1)
-
- BEGIN TRAN subscribe
-
- /*
- ** If 'public' publication, add the subscription. Anyone can subscribe
- ** to a 'public' publication without intervention from the SA or DBO
- ** of the publishing server.
- */
-
- IF EXISTS (SELECT *
- FROM syspublications
- WHERE pubid = @pubid
- AND restricted = 0)
- BEGIN
-
- /*
- ** If the subscription already exists, don't add it.
- */
-
- IF EXISTS (SELECT *
- FROM syssubscriptions
- WHERE artid = @artid
- AND srvid = @srvid)
- BEGIN
- ROLLBACK TRAN subscribe
- RAISERROR (14058, 16, -1)
- RETURN (1)
- END
-
- /*
- ** The subscription doesn't exist, so let's add it to
- ** syssubscriptions.
- */
-
- INSERT syssubscriptions VALUES (@artid,
- @srvid,
- @destination_db,
- @inactive,
- @sync_typeid,
- NULL)
-
- IF @@ERROR <> 0
- BEGIN
- ROLLBACK TRAN subsribe
- RAISERROR (14057, 16, -1)
- RETURN (1)
- END
-
- END
-
- /*
- ** If 'restricted' publication, update the subscription. A restricted
- ** subscription must already exist in syssubscriptions. It must be
- ** created by the SA or DBO on the publishing server using
- ** sp_addsubscription. All we need to do is set the status to
- ** 'subscribe'.
- */
-
- ELSE
- BEGIN
-
- /*
- ** First, make sure that the SA or DBO on the publishing
- ** server has created the subscription on the restricted
- ** publication.
- */
-
- IF NOT EXISTS (SELECT *
- FROM syssubscriptions sub,
- syspublications pub,
- sysarticles art
- WHERE art.artid = @artid
- AND pub.pubid = @pubid
- AND sub.srvid = @srvid
- AND sub.artid = art.artid
- AND pub.restricted = @restricted)
- /* AND sub.sync_type = @sync_typeid) */
- BEGIN
- ROLLBACK TRAN subscribe
- RAISERROR (14072, 16, -1)
- RETURN (1)
- END
-
- /*
- ** A subscription exists for the restricted publication.
- */
-
- UPDATE syssubscriptions
- SET dest_db = @destination_db,
- sync_type = @sync_typeid
- WHERE srvid = @srvid
- AND artid = @artid
-
- IF @@ERROR <> 0
- BEGIN
- ROLLBACK TRAN subscribe
- RAISERROR (14057, 16, -1)
- RETURN (1)
- END
- END
-
- /*
- ** If a sync is required then update the subscription status to
- ** 'subscribed'. Else, set the subscription status to 'active'.
- */
- if @sync_typeid = @none
- EXEC @retcode = sp_changesubstatus
- @publication = @publication,
- @article = @article,
- @subscriber = @@REMSERVER,
- @status = 'active'
- else
- EXEC @retcode = sp_changesubstatus
- @publication = @publication,
- @article = @article,
- @subscriber = @@REMSERVER,
- @status = 'subscribed'
-
- IF @@ERROR <> 0 OR @retcode <> 0
- BEGIN
- ROLLBACK TRAN subscribe
- RAISERROR (14057, 16, -1)
- RETURN (1)
- END
-
- COMMIT TRAN subscribe
- go
-
- print ''
- print 'Creating procedure sp_unsubscribe.'
- go
- CREATE PROCEDURE sp_unsubscribe (
- @publication varchar(30) = NULL, /* publication name */
- @article varchar(30) = NULL /* article name */
- ) AS
-
- SET NOCOUNT ON
-
- /*
- ** Declarations.
- */
-
- DECLARE @cmd varchar(255)
- DECLARE @pubid int
- DECLARE @artid int
- DECLARE @public tinyint
- DECLARE @srvid smallint
- DECLARE @subscriber_bit smallint
- DECLARE @retcode int
- DECLARE @active tinyint
-
- /*
- ** Security Check
- ** Only the System Administratr (SA) or the Database Owner (dbo) or
- ** Replication subscriber (repl_subscriber) can unsubscribe from an article.
- */
-
- IF suser_id() <> 1 AND user_id() <> 1 AND user_id() <> 16383
- BEGIN
- RAISERROR (14093, 14, -1)
- RETURN (1)
- END
-
- /*
- ** Initializations.
- */
-
- SELECT @public = 0 /* Const: security = 'public'. */
- SELECT @subscriber_bit = 4 /* Const: subscription server status */
- SELECT @active = 2 /* Const: subscription status 'active' */
-
- /*
- ** Check to make sure that this procedure is not being executed on the
- ** publisher (locally).
- */
-
- IF @@REMSERVER IS NULL
- BEGIN
- RAISERROR (14073, 16, -1)
- RETURN (1)
- END
-
- /*
- ** Check if the server exists and that it is a subscription server.
- */
-
- SELECT @srvid = srvid
- FROM sysservers
- WHERE srvname = @@REMSERVER
- AND (srvstatus & @subscriber_bit) <> 0
- IF @srvid IS NULL
- BEGIN
- RAISERROR (14010, 16, -1)
- RETURN (1)
- END
-
- /*
- ** If the @publication is 'all' the user wants to cancel all
- ** @publication @article subscriptions.
- */
-
- IF LOWER(@publication) = 'all'
- BEGIN
-
- SELECT DISTINCT a.name
- INTO #unsubscribe1
- FROM syspublications a,
- sysarticles b,
- syssubscriptions c
- WHERE c.srvid = @srvid
- AND c.artid = b.artid
- AND b.pubid = a.pubid
-
- CREATE UNIQUE INDEX idx1 ON #unsubscribe1 (name)
-
- SELECT @cmd = 'DECLARE hC1 SCROLL CURSOR FOR SELECT * FROM #unsubscribe1'
- EXECUTE (@cmd)
-
- OPEN hC1
- FETCH hC1 INTO @publication
-
- WHILE (@@fetch_status <> -1)
- BEGIN
- EXECUTE sp_unsubscribe @publication, 'all'
- FETCH hC1 INTO @publication
- END
- CLOSE hC1
- DEALLOCATE hC1
- RETURN (0)
- END
-
- /*
- ** Parameter Check: @publication.
- ** Check to make sure that the publication exists.
- */
-
- IF @publication IS NOT NULL
- BEGIN
-
- EXECUTE @retcode = sp_validname @publication
-
- IF @retcode <> 0
- RETURN (1)
-
- IF NOT EXISTS (SELECT * FROM syspublications WHERE name = @publication)
- BEGIN
- RAISERROR (15001, 11, -1, @publication)
- RETURN (1)
- END
-
- END
-
- SELECT @pubid = pubid FROM syspublications WHERE name = @publication
-
- IF @pubid IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The publication')
- RETURN (1)
- END
-
- /*
- ** If the @article is 'all', the user wants to cancel all subscriptions
- ** for the publication.
- */
-
- IF LOWER(@article) = 'all'
- BEGIN
-
- SELECT a.name
- INTO #unsubscribe2
- FROM sysarticles a,
- syssubscriptions b
- WHERE a.pubid = @pubid
- AND b.srvid = @srvid
- AND b.artid = a.artid
-
- CREATE UNIQUE INDEX idx1 ON #unsubscribe2 (name)
-
- SELECT @cmd = 'DECLARE hC2 SCROLL CURSOR FOR SELECT * FROM #unsubscribe2'
- EXECUTE (@cmd)
-
- OPEN hC2
- FETCH hC2 INTO @article
-
- WHILE (@@fetch_status <> -1)
- BEGIN
- EXECUTE sp_unsubscribe @publication, @article
- FETCH hC2 INTO @article
- END
- CLOSE hC2
- DEALLOCATE hC2
- RETURN (0)
- END
-
- /*
- ** Parameter Check: @article.
- ** Check to make sure that the article exists.
- */
-
- SELECT @artid = artid
- FROM sysarticles
- WHERE name = @article
- AND pubid = @pubid
-
- IF @article IS NOT NULL
- BEGIN
- EXECUTE @retcode = sp_validname @article
- IF @retcode <> 0
- RETURN (1)
-
- IF NOT EXISTS (SELECT *
- FROM sysarticles
- WHERE artid = @artid
- AND pubid = @pubid)
- BEGIN
- RAISERROR (15001, 11, -1, @article)
- RETURN (1)
- END
- END
-
- IF @artid IS NULL
- BEGIN
- RAISERROR (14043, 16, -1, 'The article')
- RETURN (1)
- END
-
- IF NOT EXISTS (SELECT *
- FROM syssubscriptions a,
- sysarticles b,
- syspublications c
- WHERE a.srvid = @srvid
- AND a.artid = b.artid
- AND b.pubid = c.pubid
- AND c.pubid = @pubid
- AND a.status <> 0)
- BEGIN
- RAISERROR (14050, 11, -1)
- RETURN (1)
- END
-
- BEGIN TRAN unsubscribe
-
- /*
- ** Change the status of the subscription to 'inactive', then delete
- ** subscription row. If the subscription is a public subscription,
- ** it can safely be deleted.
- */
-
- /*
- ** Change the status of the subscription to 'inactive'.
- */
-
- EXECUTE @retcode = sp_changesubstatus @publication = @publication,
- @article = @article,
- @subscriber = @@REMSERVER,
- @status = 'inactive'
-
- IF @@ERROR <> 0 OR @retcode <> 0
- BEGIN
- ROLLBACK TRAN unsubscribe
- RAISERROR (14056, 16, -1)
- RETURN (1)
- END
-
- /*
- ** If the publication is 'public', delete the subscription.
- */
-
- IF EXISTS (SELECT *
- FROM syspublications
- WHERE pubid = @pubid
- AND restricted = @public)
- BEGIN
-
- DELETE syssubscriptions
- WHERE srvid = @srvid
- AND artid = @artid
-
- IF @@ERROR <> 0
- BEGIN
- ROLLBACK TRAN unsubscribe
- RAISERROR (14056, 16, -1)
- RETURN (1)
- END
- END
-
- COMMIT TRAN unsubscribe
-
- /*
- ** If no more replication in database, unmark all replicated
- ** transactions in the database log.
- */
- IF NOT EXISTS (SELECT * FROM syssubscriptions where status = @active)
- BEGIN
- EXEC sp_repldone 0, 0, NULL, 0, 0, 1
- /* If 'dbo' is unsubscribing, perform a checkpoint to insure
- ** current replication level is recorded.
- */
- IF user_id() = 1
- checkpoint
- END
- go
-
- print ''
- print 'Creating table MSlast_job_info before creating sp_replsync.'
- go
- CREATE TABLE MSlast_job_info (
- publisher varchar ( 30 ),
- publisher_db varchar ( 30 ),
- job_id int,
- publication varchar ( 30 ) NULL,
- article varchar ( 30 ) NULL,
- description varchar (100) NULL
- )
- go
-
- print ''
- print 'Creating procedure sp_replsync.'
- go
- CREATE PROCEDURE sp_replsync (
- @publisher varchar (30), /* publication server name */
- @publisher_db varchar (30), /* publication database name */
- @publication varchar (30), /* publication name */
- @article varchar (30) = '%' /* article name */
- ) AS
-
- SET NOCOUNT ON
-
- DECLARE @msg varchar(255)
-
- /*
- ** Parameter Check: @publisher.
- ** Check to make sure that the publisher exists in the sysservers table
- */
- IF @publisher IS NULL
- BEGIN
- RAISERROR 51000 'The publisher''s name was not provided '
- RETURN (1)
- END
-
- IF NOT EXISTS (SELECT * FROM master..sysservers
- WHERE srvname = @publisher)
- BEGIN
- select @msg = 'Publisher ' + @publisher
- select @msg = @msg + ' is not defined in master..sysservers'
- RAISERROR 51001 @msg
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @publication
- ** Check to make sure that the publication is not NULL, you
- ** are in a subscriber database, and that MSlast_job_info
- ** is waiting on the article sync.
- */
-
- IF @publication IS NULL
- BEGIN
- RAISERROR 51002 'The publication name was not provided'
- RETURN (1)
- END
-
- /*
- ** Parameter Check: @article
- ** Check to make sure that the article is not NULL, you
- ** are in a subscriber database, and that MSlast_job_info
- ** is waiting on the article sync.
- */
-
- IF @article IS NULL
- BEGIN
- RAISERROR 51003 'The article name was not provided'
- RETURN (1)
- END
-
- IF NOT EXISTS(SELECT * FROM sysobjects
- WHERE name = 'MSlast_job_info')
- BEGIN
- select @msg = 'Table MSlast_job_info was not found in database '
- select @msg = @msg + DB_NAME()
- RAISERROR 51004 @msg
- RETURN (1)
- END
-
-
- IF NOT EXISTS(SELECT * from MSlast_job_info
- WHERE publisher = @publisher
- and publisher_db = @publisher_db
- and publication = @publication
- and article like @article)
- BEGIN
- select @msg = 'Replication table MSlast_job_info contains no entry'
- select @msg = @msg + ' waiting on a sync for publication ' + @publication
- IF @article <> '%'
- select @msg = @msg + ' article ' + @article
- RAISERROR 51005 @msg
- RETURN (1)
- END
-
- /*
- ** All Parameters Check Out.
- ** So remove information record for the article in MSlast_job_info.
- */
- delete from MSlast_job_info
- WHERE publisher = @publisher
- and publisher_db = @publisher_db
- and publication = @publication
- and article like @article
-
- /*
- ** If there are no more manual synchronizations pending increment then
- ** job_id in MSlast_job_info.
- */
- IF NOT EXISTS(SELECT * from MSlast_job_info
- WHERE publisher = @publisher
- and publisher_db = @publisher_db
- and publication = @publication)
- BEGIN
- UPDATE MSlast_job_info
- SET job_id = job_id + 1
- WHERE publisher = @publisher
- and publisher_db = @publisher_db
-
- IF @@ERROR <> 0
- BEGIN
- select @msg = 'Update of job_id in table MSlast_job_info failed'
- select @msg = @msg + ' for sp_syncdone ' + @publisher + ', ' + @article
- RAISERROR 51006 @msg
- RETURN (1)
- END
- END
-
- /*
- ** Success
- */
- RETURN (0)
- GO
-
- print ''
- print 'Drop table MSlast_job_info.'
- go
- DROP TABLE MSlast_job_info
- go
-
- print ''
- print 'Creating procedure sp_create_distribution_tables.'
- go
- CREATE PROCEDURE sp_create_distribution_tables
- AS
-
- BEGIN
- IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSjobs' and type = 'U')
- BEGIN
- /****************************************************************************/
- PRINT ''
- PRINT 'Creating Table: dbo.MSjobs'
- PRINT ''
- /****************************************************************************/
- CREATE TABLE MSjobs
- (
- publisher_id smallint,
- publisher_db varchar ( 30 ) ,
- job_id int,
- type tinyint, /* 0- sql cmd 1-noop cmd 2-sql script 3/4-bcp cmd 5-manual sync*/
- xactid_page int,
- xactid_row smallint,
- xactid_ts binary ( 8 ) ,
- entry_time datetime
- )
-
- /* Set category bit to reflect MS objects */
- UPDATE sysobjects SET category = category | 2 WHERE sysstat & 0xf = 3 AND
- name = 'MSjobs'
-
- PRINT ''
- PRINT 'Creating Clustered Index: ucMSjobs'
- PRINT ''
- CREATE UNIQUE CLUSTERED INDEX ucMSjobs ON dbo.MSjobs
- (publisher_db, publisher_id, job_id)
- END
-
- IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSjob_commands' and type = 'U')
- BEGIN
- /****************************************************************************/
- PRINT ''
- PRINT 'Creating Table: dbo.MSjob_commands'
- PRINT ''
- /****************************************************************************/
- CREATE TABLE MSjob_commands (
- publisher_id smallint,
- publisher_db varchar ( 30 ) ,
- job_id int,
- command_id int,
- art_id int,
- incomplete bit,
- command varchar ( 255 ) NULL
- )
- /* Set category bit to reflect MS objects */
- UPDATE sysobjects SET category = category | 2 WHERE sysstat & 0xf = 3 AND
- name = 'MSjob_commands'
-
- PRINT ''
- PRINT 'Creating Clustered Index: ucMSjob_commands'
- PRINT ''
- CREATE UNIQUE CLUSTERED INDEX ucMSjob_commands ON dbo.MSjob_commands
- (publisher_db, publisher_id, job_id, command_id)
- END
-
- IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSsubscriber_jobs' and type = 'U')
- BEGIN
- /****************************************************************************/
- PRINT ''
- PRINT 'Creating Table: dbo.MSsubscriber_jobs'
- PRINT ''
- /****************************************************************************/
- CREATE TABLE MSsubscriber_jobs
- (
- publisher_id smallint,
- publisher_db varchar (30),
- job_id int,
- subscriber_id smallint,
- subscriber_db varchar ( 30 ) ,
- command_id int
- )
-
- /* Set category bit to reflect MS objects */
- UPDATE sysobjects SET category = category | 2 WHERE sysstat & 0xf = 3 AND
- name = 'MSsubscriber_jobs'
-
- PRINT ''
- PRINT 'Creating Clusteredd Index: ucMSsubscriber_jobs'
- PRINT ''
- CREATE UNIQUE CLUSTERED INDEX ucMSsubscriber_jobs ON dbo.MSsubscriber_jobs
- (publisher_db, publisher_id, subscriber_db, subscriber_id, job_id, command_id)
-
- PRINT ''
- PRINT 'Creating NonClustered Index: ncMSsubscriber_jobs'
- PRINT ''
- CREATE NONCLUSTERED INDEX ncMSsubscriber_jobs ON dbo.MSsubscriber_jobs
- (publisher_db, publisher_id, job_id)
- END
-
-
- IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSsubscriber_status' and type = 'U')
- BEGIN
- /****************************************************************************/
- PRINT ''
- PRINT 'Creating Table: dbo.MSsubscriber_status'
- PRINT ''
- /****************************************************************************/
- CREATE TABLE MSsubscriber_status
- (
- publisher_id smallint,
- publisher_db varchar ( 30 ) ,
- job_id int,
- subscriber_id smallint,
- subscriber_db varchar ( 30 ) ,
- completion_time datetime,
- delivery_latency int,
- delivered_jobs int,
- delivery_rate int,
- status int
- )
-
- /* Set category bit to reflect MS objects */
- UPDATE sysobjects SET category = category | 2 WHERE sysstat & 0xf = 3 AND
- name = 'MSsubscriber_status'
-
- PRINT ''
- PRINT 'Creating Clustered Index: ucMSsubscriber_status'
- PRINT ''
- CREATE UNIQUE CLUSTERED INDEX ucMSsubscriber_status on dbo.MSsubscriber_status
- (publisher_db, publisher_id, subscriber_db, subscriber_id, job_id)
-
- END
-
- IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSsubscriber_info' and type = 'U')
- BEGIN
- /****************************************************************************/
- PRINT ''
- PRINT 'Creating Table: dbo.MSsubscriber_info'
- PRINT ''
- /****************************************************************************/
- CREATE TABLE MSsubscriber_info
- (
- publisher varchar (30),
- subscriber varchar (30),
- type tinyint, /* 0: MS SQL Server 1: ODBC Data Source */
- login varchar(30) NULL,
- password varchar(30) NULL,
- commit_batch_size int,
- status_batch_size int,
- flush_frequency int,
- frequency_type int,
- frequency_interval int,
- frequency_relative_interval int,
- frequency_recurrence_factor int,
- frequency_subday int,
- frequency_subday_interval int,
- active_start_time_of_day int,
- active_end_time_of_day int,
- active_start_date int,
- active_end_date int,
- retryattempts int,
- retrydelay int,
- description varchar(255) NULL,
- )
-
- /* Set category bit to reflect MS objects */
- UPDATE sysobjects SET category = category | 2 WHERE sysstat & 0xf = 3 AND
- name = 'MSsubscriber_info'
-
- PRINT ''
- PRINT 'Creating Clustered Index: ucMSsubscriber_info'
- PRINT ''
- CREATE UNIQUE CLUSTERED INDEX ucMSsubscriber_info ON dbo.MSsubscriber_info
- (publisher, subscriber)
- END
- ELSE
- BEGIN
- IF NOT EXISTS (select * from syscolumns
- where name = 'description'
- and id=object_id('MSsubscriber_info'))
- BEGIN
- /****************************************************************************/
- PRINT ''
- PRINT 'Alter Table: dbo.MSsubscriber_info'
- PRINT ''
- /****************************************************************************/
- ALTER TABLE MSsubscriber_info ADD description varchar (255) NULL
- UPDATE MSsubscriber_info SET description = 'SQL Server 6.0'
- END
- END
-
- IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'MSjob_subscriptions' and type = 'U')
- BEGIN
- /****************************************************************************/
- PRINT ''
- PRINT 'Creating Table: dbo.MSjob_subscriptions'
- PRINT ''
- /****************************************************************************/
- CREATE TABLE MSjob_subscriptions
- (
- publisher varchar ( 30 ),
- publisher_id smallint,
- publisher_db varchar ( 30 ) ,
- subscriber varchar ( 30 ),
- subscriber_id smallint,
- art_id int,
- subscriber_db varchar ( 30 ) ,
- status tinyint,
- ts binary (8)
- )
-
- /* Set category bit to reflect MS objects */
- UPDATE sysobjects SET category = category | 2 WHERE sysstat & 0xf = 3 AND
- name = 'MSjob_subscriptions'
-
- PRINT ''
- PRINT 'Creating Clustered Index: ucMSsubscriptions'
- PRINT ''
- CREATE UNIQUE CLUSTERED INDEX ucMSsubscriptions ON dbo.MSjob_subscriptions
- (publisher_db, publisher_id, art_id, subscriber_id)
- END
- END
- GO
-
-
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_repldone')
- exec sp_dropextendedproc 'sp_repldone'
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_repltrans')
- exec sp_dropextendedproc 'sp_repltrans'
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_replcmds')
- exec sp_dropextendedproc 'sp_replcmds'
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_replcounters')
- exec sp_dropextendedproc 'sp_replcounters'
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_replflush')
- exec sp_dropextendedproc 'sp_replflush'
- go
-
- if exists (select * from sysobjects
- where sysstat & 0xf = 4
- and name = 'sp_replstatus')
- exec sp_dropextendedproc 'sp_replstatus'
- go
-
- /*
- ** Add extended stored procedures for replication support.
- */
- sp_addextendedproc 'sp_repldone', 'repldone extended procedure'
- go
-
- sp_addextendedproc 'sp_repltrans', 'repltrans extended procedure'
- go
-
- sp_addextendedproc 'sp_replcounters', 'replcounters extended procedure'
- go
-
- sp_addextendedproc 'sp_replcmds', 'replcmds extended procedure'
- go
-
- sp_addextendedproc 'sp_replflush', 'replflush extended procedure'
- go
-
- sp_addextendedproc 'sp_replstatus', 'replstatus extended procedure'
- go
-
- print ''
- print 'Adding logins and users for replication.'
- print ''
- go
- /*
- ** Add the login and user named 'repl_subscriber'. These are used when a
- ** replication publisher. Use the maximum user id for the login id.
- */
- if not exists (select * from syslogins where name = 'repl_subscriber')
- insert into syslogins (suid,status,accdate,totcpu,totio,spacelimit,
- timelimit,resultlimit,dbname,name,password,language)
- values (16383, 9, getdate(), 0, 0, 0, 0, 0,'master','repl_subscriber',
- pwdencrypt(convert(char(30),@@dbts)),NULL)
- go
-
- if not exists (select * from sysusers where name = 'repl_subscriber')
- exec sp_adduser 'repl_subscriber'
- go
-
- /*
- ** Add the login and user named 'repl_publisher'. This is used when a
- ** replication subscriber.
- */
- if not exists (select * from syslogins where name = 'repl_publisher')
- insert into syslogins (suid,status,accdate,totcpu,totio,spacelimit,
- timelimit,resultlimit,dbname,name,password,language)
- values (16382, 9, getdate(), 0, 0, 0, 0, 0,'master','repl_publisher',
- pwdencrypt(convert(char(30),@@dbts)),NULL)
- go
-
- /*
- ** Add xp_enum_dsn extended procedure
- */
- sp_addextendedproc 'xp_dsninfo','xpsql60.dll'
- go
-
- /*
- ** Add xp_enum_dsn extended procedure
- */
- sp_addextendedproc 'xp_enumdsn','xpsql60.dll'
- go
-
- grant execute on sp_addarticle to public
- go
- grant execute on sp_addpublication to public
- go
- grant execute on sp_addsubscription to public
- go
- grant execute on sp_articlecolumn to public
- go
- grant execute on sp_articlefilter to public
- go
- grant execute on sp_articletextcol to public
- go
- grant execute on sp_articleview to public
- go
- grant execute on sp_changearticle to public
- go
- grant execute on sp_changepublication to public
- go
- grant execute on sp_changesubscription to public
- go
- grant execute on sp_distcounters to public
- go
- grant execute on sp_droparticle to public
- go
- grant execute on sp_droppublication to public
- go
- grant execute on sp_dropsubscription to public
- go
- grant execute on sp_helparticle to public
- go
- grant execute on sp_helparticlecolumns to public
- go
- grant execute on sp_helpdistributor to public
- go
- grant execute on sp_helppublication to public
- go
- grant execute on sp_helppublicationsync to public
- go
- grant execute on sp_helpreplicationdb to public
- go
- grant execute on sp_helpsubscription to public
- go
- grant execute on sp_helpsubscriberinfo to public
- go
- grant execute on sp_replcounters to probe
- go
- grant execute on sp_replstatus to public
- go
- grant execute on sp_subscribe to public
- go
- grant execute on sp_textcolstatus to public
- go
- grant execute on sp_unsubscribe to public
- go
-
- sp_configure 'allow updates',0
- go
- reconfigure with override
- go
-
- print ''
- print 'Checking objects created by instrepl.sql.'
- go
-
- exec sp_check_objects 'repl'
- go
-
- print ''
- print 'instrepl.sql completed successfully.'
- go
-
- dump tran master with no_log
- go
- checkpoint
- go
-