Quantcast
Channel: StackExchange Replication Questions
Viewing all articles
Browse latest Browse all 17268

Wrapper stored procedure to create publication for transactional replication

$
0
0

I have created a wrapper stored procedure to create publication for transactional replication for SQL Server 2008 Standard Edition SP3. But when I execute the procedure I get the following error. The column "file_exists" is not user defined. This error doesn't make any sense to me. This works on Dev environment but same code doesn't work on test environment. Dev and Test are identical as far as I can tell. I also tried to explicitly set options, made them 5496 (SELECT @@OPTIONS). Any help greatly appreciated.

-- error

Msg 50000, Level 16, State 1, Procedure CreatePublicationForDB, Line 161
Invalid column name 'file_exists'.

-- Begin Script

CREATE DATABASE TestPublication

GO
USE TestPublication

CREATE TABLE Orders(
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    ProductID INT,
    UpdatedAt DATETIME,
    UpdatedBy DATETIME
)
GO
CREATE TABLE Products(
ProductID INT PRIMARY KEY,
ProductName VARCHAR(100)
)
GO
CREATE VIEW V_Order
AS
SELECT o.OrderID,o.CustomerID, p.ProductName
FROM Orders o 
JOIN Products p
    ON o.ProductID = p.ProductID

GO
CREATE SCHEMA repl
GO
CREATE TABLE repl.ReplicationTables
(
    DBName sys.sysname NOT NULL DEFAULT('TestPublication'),
    SchemaOwner sys.sysname NOT NULL DEFAULT('dbo'),
    TableName sys.sysname NOT NULL
) 
GO
INSERT INTO repl.ReplicationTables (tablename)
VALUES('Orders'),('Products'),('V_Order')
GO
USE TestPublication
GO
CREATE PROCEDURE CreatePublicationForDB( @databaseName sysname, @publicationName sysname = @databaseName,   @allow_initialize_from_backup NVARCHAR(5) = 'true')
AS
BEGIN

BEGIN TRY
SET ANSI_WARNINGS ON
SET ANSI_PADDING ON
SET ANSI_NULLS ON
SET ARITHABORT ON
SET QUOTED_IDENTIFIER ON
SET ANSI_NULL_DFLT_ON ON
SET CONCAT_NULL_YIELDS_NULL ON 
        DECLARE @sp_replicationdboption varchar(MAX) = ' USE '+@databaseName +';',
                @sp_addpulication VARCHAR(MAX) = ' USE '+@databaseName +';', 
                @sp_addpublication_snapshot VARCHAR(MAX) = ' USE '+@databaseName +';', 
                @sp_addarticle VARCHAR(MAX) = ' USE '+@databaseName +';',
                @sp_startpublication_snapshot VARCHAR(MAX) = ' USE '+@databaseName +';'

        DECLARE @allow_anonymous NVARCHAR(5) = CASE WHEN @allow_initialize_from_backup = 'false' OR @allow_initialize_from_backup IS NULL THEN 'true' ELSE 'false' END

        DECLARE @immediate_sync NVARCHAR(5) = @allow_anonymous, @publisher sysname = @@SERVERNAME
        -- set up database publication
        SET @sp_replicationdboption += '
        exec sp_replicationdboption @dbname = N'''+@databaseName+ ''', 
                                @optname = N''publish'', 
                                @value = N''true'''
        -- Publication
        SET @sp_addpulication += '
        exec sp_addpublication @publication = N'''+@publicationName+ ''', 
                            @description = N''Transactional publication of database '+@databaseName+' from Publisher '+@publisher+''', 
                            @sync_method = N''concurrent'', 
                            @retention = 0, 
                            @allow_push = N''true'', 
                            @allow_pull = N''true'', 
                            @allow_anonymous = N'''+@allow_anonymous+ ''' , 
                            @enabled_for_internet = N''false'', 
                            @snapshot_in_defaultfolder = N''true'', 
                            @compress_snapshot = N''false'', 
                            @ftp_port = 21, 
                            @ftp_login = N''anonymous'', 
                            @allow_subscription_copy = N''false'', 
                            @add_to_active_directory = N''false'', 
                            @repl_freq = N''continuous'', 
                            @status = N''active'', 
                            @independent_agent = N''true'', 
                            @immediate_sync =  N'''+@immediate_sync+ ''' , 
                            @allow_sync_tran = N''false'', 
                            @autogen_sync_procs = N''false'', 
                            @allow_queued_tran = N''false'', 
                            @allow_dts = N''false'', 
                            @replicate_ddl = 1, 
                            @allow_initialize_from_backup =  N'''+COALESCE(@allow_initialize_from_backup, 'false')+ ''' , 
                            @enabled_for_p2p = N''false'', 
                            @enabled_for_het_sub = N''false'''

        IF @allow_initialize_from_backup = 'false'
        BEGIN
            -- publication snapshot
            SET @sp_addpublication_snapshot +='
            exec sp_addpublication_snapshot @publication = N'''+@publicationName+ ''', 
                                        @frequency_type = 1, 
                                        @frequency_interval = 0, 
                                        @frequency_relative_interval = 0, 
                                        @frequency_recurrence_factor = 0, 
                                        @frequency_subday = 0, 
                                        @frequency_subday_interval = 0, 
                                        @active_start_time_of_day = 0, 
                                        @active_end_time_of_day = 235959, 
                                        @active_start_date = 0, 
                                        @active_end_date = 0, 
                                        @job_login = null, 
                                        @job_password = null, 
                                        @publisher_security_mode = 1'

            SET @sp_startpublication_snapshot+=' exec sys.sp_startpublication_snapshot @publication = N'''+@publicationName+ ''''
        END
        -- Articles
        IF OBJECT_ID('tempdb..#t') IS NULL
            BEGIN
                PRINT 'creating temp table t'
                CREATE TABLE #t (NAME sysname,objectid INT, sch_owner sysname  NULL, article sysname NOT NULL, isIndexed BIT NULL, IsSchemaBound BIT NULL, TYPE CHAR(2) NULL)
            END
        INSERT INTO #t(NAME,objectid, sch_owner,isIndexed,IsSchemaBound, TYPE,article)
        EXEC('
        USE '+@databaseName + '
        SELECT f.Name, f.object_id,f.sch, f.IsIndexed,f.IsSchemaBound, f.type,CASE WHEN ROW_NUMBER() OVER (PARTITION BY f.name ORDER BY f.sch) > 1 THEN f.name + CAST((ROW_NUMBER() OVER (PARTITION BY f.name ORDER BY f.sch) - 1) AS VARCHAR(2)) ELSE f.name END AS Article
        FROM(
        SELECT t.Name, t.object_id,t.sch, IsIndexed,IsSchemaBound, type
        FROM 
            (SELECT DBName, SchemaOwner, TableName
            FROM TestPublication.repl.ReplicationTables
            GROUP BY DBName, SchemaOwner, TableName )rt JOIN
        (SELECT o.Name, o.object_id,s.name AS sch,  objectproperty(o.object_id, ''IsIndexed'') AS IsIndexed,objectproperty(o.object_id, ''IsSchemaBound'') AS IsSchemaBound, o.type
        FROM
        sys.objects o
        JOIN sys.schemas s ON o.schema_id = s.schema_id
        WHERE o.type IN (''U'',''V'')
            AND ObjectProperty(o.object_id, ''IsMSShipped'') = 0
            AND (ObjectProperty(o.object_id, ''TableHasPrimaryKey'') = 1 OR ObjectProperty(o.object_id, ''TableHasPrimaryKey'') IS NULL)
        ) t ON rt.tablename = t.name AND rt.SchemaOwner = t.sch
        WHERE rt.DBName = '''+@databaseName + '''
        ) f'
        )
        SELECT @sp_addarticle += 
                'exec sp_addarticle 
                @publication = N''' +@databaseName +
                ''', @article = N''' +t.article+
                ''', @source_owner = N''' +t.sch_owner +
                ''', @source_object = N''' + t.NAME +
                ''', @type = N''' +
                CASE WHEN t.type = 'U' THEN 'logbased'
                     WHEN t.type = 'V' AND (IsIndexed = 1 OR IsSchemaBound = 1 )THEN 'indexed view schema only'
                     WHEN t.type = 'V' AND IsIndexed = 0 THEN 'view schema only' END

                    +''', @description = null,@creation_script = null,@pre_creation_cmd = N''drop'', 
                @schema_option = '+
                    CASE WHEN t.type = 'U' THEN '0x000000000803509F'
                     WHEN t.type = 'V' THEN '0x0000000008000001' END+
                ',@destination_table = N'''+t.Name+
                ''',@destination_owner = N'''+t.sch_owner+''''+
                CASE WHEN t.TYPE = 'U' THEN
                        ', @identityrangemanagementoption = N''manual'',@vertical_partition = N''false'',
                @ins_cmd = N''CALL sp_MSins_'+t.sch_owner+''+t.Name+
                ''', @del_cmd = N''CALL sp_MSdel_'+t.sch_owner+''+t.Name+''',
                @upd_cmd = N''SCALL sp_MSupd_'+t.sch_owner+''+t.Name+''''
                        ELSE ''
                    END
                    +';'

        FROM #t t

        PRINT 'Now running sp_replicationdboption'
        PRINT @sp_replicationdboption
        EXEC(@sp_replicationdboption)

        PRINT 'Now running sp_addpulication'
        PRINT @sp_addpulication
        EXEC(@sp_addpulication)

        IF @allow_initialize_from_backup = 'false'
        BEGIN
            PRINT 'Now running sp_addpulication_snapshot and starting snapshot'
            PRINT @sp_addpublication_snapshot
            EXEC(@sp_addpublication_snapshot)
            EXEC(@sp_startpublication_snapshot)
        END

        PRINT 'Now running sp_addarticles'
        PRINT @sp_addarticle
        EXEC(@sp_addarticle)

    -- exec sp_droppublication @publication = N'Products'   
    END TRY

    BEGIN CATCH
        IF @@trancount > 0
            ROLLBACK

            DECLARE @ERROR_SEVERITY INT, @ERROR_STATE INT, @ERROR_MESSAGE NVARCHAR(4000)
            SELECT @ERROR_SEVERITY = ERROR_SEVERITY(), @ERROR_STATE = ERROR_STATE(), @ERROR_MESSAGE = ERROR_MESSAGE()
            RAISERROR(@ERROR_MESSAGE, @ERROR_SEVERITY, @ERROR_STATE)
    END CATCH


END
GO

and finally execute

EXEC CreatePublicationForDB 'TestPublication'

-- drop replication in case you want to run the above again.

exec TestPublication.dbo.sp_droppublication @publication = 'TestPublication'
exec TestPublication.dbo.sp_replicationdboption @dbname = 'TestPublication', @optname = 'publish', @value = 'false'

-- cleanup database

DROP DATABASE TestPublication

Viewing all articles
Browse latest Browse all 17268

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>