1

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 
+0

코드를 더 많이 보여야합니다 ...나는'USE Database' 진술을 많이 볼 수 있습니다. 제안은 충분하지 않습니다. –

+0

확인. 나는 대부분의 코드를 에러 처리를 제외한 마이너스 코드를 넣었다. – Afr

답변

0

그것은 문제가 모든 코드를보고하고 스키마를하지 않고 무슨 말을하기 어렵다. 출판물을 만들 래퍼를 만들지 않는 것이 좋습니다. 필요에 따라 필요에 따라 게시 스크립트 생성을 저장하고 실행할 수 있으므로 래퍼가 필요하지 않습니다.

+0

이것은 스토어드 프로 시저의 완전한 코드이며 어떤 스키마에도 의존하지 않는다. 데이터베이스 이름과 복제하려는 테이블이 주어지면 위의 sp가 게시를 만듭니다. 우리는 Stage/Weekly에서 Test/Dev에 대한 매일의 복원을 수행합니다. 래퍼 저장 프로 시저를 사용하면 복원 후 복제 설정 자동화를 쉽게 수행 할 수 있습니다. – Afr

+0

나는 다를 것을 요구할 것입니다. 예를 들어, 귀하의 프로 시저를 실행할 때 얻을 : 메시지 208, 수준 16, 상태 1, 프로 시저 CreatePublicationForDatabase, 줄 74 잘못된 개체 이름 'BunchofTables'. BunchofTables에 의존하는 것 같습니다. –

+0

나는 지금 당신이 말하는 것을 얻습니다. 내 잘못이야. 곧 더 완벽한 코드를 제공 할 것입니다. – Afr

3

죄송합니다. 이전 소식은 알지만 매우 비슷한 상황에 처해있어 그 문제를 해결했습니다. 다른 곳에서는 실행할 수있는 솔루션을 찾지 못했습니다. 나는 다른 사람들을 돕기 위해 나의 경험을 포함하고있다.

내 상황 요약은 트랜잭션 내에서 매니페스트 파일 (일련의 스크립트 이름을 가진 텍스트 파일)의 일련의 스크립트를 실행하는 msbuild 프로세스가 있습니다. 에이전트 작업을 작성하고 구성하기위한 스크립트는 항상 동일한 오류로 인해 사망했습니다. (잘못된 열 이름 "file_exists") 내 실패 스크립트 (들)에 사용

프로세서 수 : 호출을 주석

msdb.dbo.sp_add_category 
msdb.dbo.sp_add_job 
msdb.dbo.sp_add_jobstep 
msdb.dbo.sp_update_job 
msdb.dbo.sp_add_jobschedule 
msdb.dbo.sp_add_jobserver 

스크립트를 완료 할 수 msdb.dbo.sp_add_jobstep합니다.

@ database_name = N '(DatabaseName)'형식의 SQL 명령 변수도 스크립트에 있습니다. 이로 인해 sp_add_jobstep 설명서의 [@ command =] 'command'에있는 "Important"참고에서 언급 한 것과 같이 이스케이프 매크로를 사용하려고하는 잘못된 지시가있었습니다. I가 빌드를 실행하지만, 포함하지 않는 경우

https://msdn.microsoft.com/en-us/library/ms187358.aspx

의 일자리 창출 스크립트가 시작, 그것은 성공합니다.

많은 시행 착오 끝에 나는 procs가 [MSDB]에있는 것으로 자격이 있다고하더라도 실제로 USE 문을 포함하지 않으면 프로세스가 실패합니다. "USE [MSDB] GO"로 스크립트를 시작한 다음 내 빌드 대상 (즉, USE [MyBuildDB] GO)으로 다시 전환하면 더 이상 오류가 발생하지 않습니다.

내 에이전트 작업이 예상대로 만들어지며 빌드 내의 여러 스크립트가 오류없이 실행됩니다.