SQL Server 2008 Standard Edition SP3의 트랜잭션 복제를위한 게시를 만들기 위해 래퍼 저장 프로 시저를 만들었습니다. 그러나 프로 시저를 실행할 때 다음 오류가 발생합니다. "file_exists"열은 사용자 정의되지 않습니다. 이 오류는 나에게 이해가되지 않습니다. 이것은 Dev 환경에서 작동하지만 테스트 환경에서는 동일한 코드가 작동하지 않습니다. 데브와 테스트는 내가 말할 수있는 한 동일합니다. 나는 또한 옵션을 명시 적으로 설정하려고 시도했다. 5496 (SELECT @@ OPTIONS). 어떤 도움이라도 대단히 감사합니다. 래퍼 저장 프로 시저 (트랜잭션 복제를위한 게시 만들기)
- 오류Msg 50000, Level 16, State 1, Procedure CreatePublicationForDB, Line 161
Invalid column name 'file_exists'.
은 -
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 '[email protected] +';',
@sp_addpulication VARCHAR(MAX) = ' USE '[email protected] +';',
@sp_addpublication_snapshot VARCHAR(MAX) = ' USE '[email protected] +';',
@sp_addarticle VARCHAR(MAX) = ' USE '[email protected] +';',
@sp_startpublication_snapshot VARCHAR(MAX) = ' USE '[email protected] +';'
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'''[email protected]+ ''',
@optname = N''publish'',
@value = N''true'''
-- Publication
SET @sp_addpulication += '
exec sp_addpublication @publication = N'''[email protected]+ ''',
@description = N''Transactional publication of database '[email protected]+' from Publisher '[email protected]+''',
@sync_method = N''concurrent'',
@retention = 0,
@allow_push = N''true'',
@allow_pull = N''true'',
@allow_anonymous = N'''[email protected]_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'''[email protected]_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'''[email protected]+ ''',
@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'''[email protected]+ ''''
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 '[email protected] + '
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 = '''[email protected] + '''
) f'
)
SELECT @sp_addarticle +=
'exec sp_addarticle
@publication = N''' [email protected] +
''', @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
스크립트
를 시작하고 마지막EXEC CreatePublicationForDB 'TestPublication'
실행 - 다시 위를 실행하려는 경우 드롭 복제를.
exec TestPublication.dbo.sp_droppublication @publication = 'TestPublication'
exec TestPublication.dbo.sp_replicationdboption @dbname = 'TestPublication', @optname = 'publish', @value = 'false'
- 정리 데이터베이스
DROP DATABASE TestPublication
코드를 더 많이 보여야합니다 ...나는'USE Database' 진술을 많이 볼 수 있습니다. 제안은 충분하지 않습니다. –
확인. 나는 대부분의 코드를 에러 처리를 제외한 마이너스 코드를 넣었다. – Afr