7

SQL Server 2005 트랜잭션 게시에 이상한 문제가 발생했습니다. 문제는 다음과 같습니다. 게시에 create index 문이 포함 된 저장 프로 시저라는 기사가 포함되어 있으면 저장 프로 시저의 스키마를 구독자에게 복제하려고 할 때 오류가 발생합니다. 인덱스 작성 문이 을 주석 경우에도 때문에 SQL Server 2005 트랜잭션 복제가 인덱스가 포함 된 저장 프로 시저를 게시하지 못한다 Create

동작

은 여전히 ​​예외를 제공, 매우 이상한이며,이 모두 제거 된 경우에만 작동합니다.

명령이 시도 :

여기에 반환되고있는 정확한 오류입니다 GRANT가 [DBO]에서 실행 [usp_Test] TO [CompanyDatabase_access]

(트랜잭션 시퀀스 번호 :. 0x00000170000008B9000500000000, 명령 ID : 5)

오류 메시지 : 존재하지 않기 때문에 'usp_Test'개체를 찾을 수 없습니다. 또는 권한이 없습니다. (원본 : MSSQLServer, 오류 번호 : 15151) : 존재하지 않는 또는 권한이 없으므로 http://help/15151 객체 'usp_Test', 를 찾을 수 없습니다 지원을받을 수 있습니다. (출처 : 에서 MSSQLServer, 오류 번호 : 15151) 지원을받을 수 : http://help/15151

내가 가입자에 검사 할 때 예상대로, 저장 프로 시저가 생성되지 않았기 때문에 오류가 정확 ...하지만 그였다 게시 목적은 ...

또한 구독자에서 수동으로 저장 프로 시저를 만들 수 있지만 스냅 샷을 생성 할 때 은 기존 저장 프로 시저을 삭제 한 다음 여전히이 오류 메시지를 반환합니다.

그리고이 문제를 만드는 샘플 출판물은 다음과 같습니다.

저장 프로 시저 :

USE [CompanyDatabase] 
GO 

CREATE PROCEDURE [dbo].[usp_Test] 

AS 

CREATE TABLE #TempTable(ID INT) 
CREATE NONCLUSTERED INDEX [IX_TempTable] ON [dbo].[#TempTable](ID) 
SELECT 'Test' 
GO 

GRANT EXECUTE ON [dbo].[usp_Test] TO [CompanyDatabase_access] 
GO 

간행물 스크립트 :

-- Adding the transactional publication 
use [CompanyDatabase] 
exec sp_addpublication 
    @publication = N'Replication Test', 
    @description = N'Publication of database ''CompanyDatabase''.', 
    @sync_method = N'concurrent', 
    @retention = 0, 
    @allow_push = N'true', 
    @allow_pull = N'true', 
    @allow_anonymous = N'false', 
    @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'false', 
    @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'false', 
    @enabled_for_p2p = N'false', 
    @enabled_for_het_sub = N'false' 
GO 

-- Adding the transactional articles 
use [CompanyDatabase] 
exec sp_addarticle 
    @publication = N'Replication Test', 
    @article = N'usp_Test', 
    @source_owner = N'dbo', 
    @source_object = N'usp_Test', 
    @type = N'proc schema only', 
    @description = N'', 
    @creation_script = N'', 
    @pre_creation_cmd = N'drop', 
    @schema_option = 0x0000000048000001, 
    @destination_table = N'usp_Test', 
    @destination_owner = N'dbo', 
    @status = 16 
GO 

-- Adding the transactional subscriptions 
use [CompanyDatabase] 
exec sp_addsubscription 
    @publication = N'Replication Test', 
    @subscriber = N'OtherDatabaseServer', 
    @destination_db = N'CompanyDatabase', 
    @subscription_type = N'Pull', 
    @sync_type = N'automatic', 
    @article = N'all', 
    @update_mode = N'read only', 
    @subscriber_type = 0 
GO 

구독 스크립트 :

/****** Begin: Script to be run at Subscriber ******/ 
use [CompanyDatabase] 
exec sp_addpullsubscription 
    @publisher = N'DatabaseServer', 
    @publication = N'Replication Test', 
    @publisher_db = N'CompanyDatabase', 
    @independent_agent = N'True', 
    @subscription_type = N'pull', 
    @description = N'', 
    @update_mode = N'read only', 
    @immediate_sync = 0 

exec sp_addpullsubscription_agent 
    @publisher = N'DatabaseServer', 
    @publisher_db = N'CompanyDatabase', 
    @publication = N'Replication Test', 
    @distributor = N'DatabaseServer', 
    @distributor_security_mode = 1, 
    @distributor_login = N'', 
    @distributor_password = N'', 
    @enabled_for_syncmgr = N'False', 
    @frequency_type = 64, 
    @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, 
    @alt_snapshot_folder = N'', 
    @working_directory = N'', 
    @use_ftp = N'False', 
    @job_login = null, 
    @job_password = null, 
    @publication_type = 0 
GO 
/****** End: Script to be run at Subscriber ******/ 

다시, 이상한 일이 게시 여전히를 포함하는 것입니다 create index 문이 주석 처리 된 경우와 동일한 오류가 발생하지만 제거 된 경우 작동합니다. 오 게져.

지금은 게시판에서 이러한 create index 문을 포함하는 모든 저장 프로 시저를 제거했지만 구독자에게 복제하여 프로 시저에 대한 DDL 업데이트가 자동으로 반영되도록하고 싶습니다. 가입자.

- 편집 - 스냅 샷 디렉토리에 상대가

, usp_Test의는 .sch 파일은 내가 이전에 저장 프로 시저 게시 된 동일한 코드 블록을 포함 ... 오류에 따라 반환, 그것은 것 같아 스냅 샷 에이전트는 CREATE PROCEDURE 명령에 create index가 포함되어 있으면 실행하지 않기로 결정하지만 계속 진행하고 오류를 발생시키는 GRANT EXECUTE 명령을 실행하려고 시도합니다.

또한, SQL 서버의 내 정확한 버전은 다음과 같습니다

마이크로 소프트 SQL 서버 2005 - 9.00.5254.00 (2005 + SP4 누적 업데이트 1)

- END 편집 -

제 질문은 왜 이런 일입니까? 저의 간행물이나 구독 구성에 문제가 있습니까? 다른 누구도 이와 같은 경험을 했습니까? 이 문제를 해결하기 위해 어디서부터 시작해야합니까?

- UPDATE -

내가 TechNet의 힐러리 코터 이야기 봤는데 ... 아직도 행운. 프로 시저에 대한 GRANT EXECUTE 권한을 제거하면 CREATE INDEX와 함 2 성공적으로 작성됩니다. 따라서 GRANT EXECUTE 또는 CREATE INDEX와 함께 작동하지만 둘 다 사용할 수는 없습니다. 힐러리는 내 도메인에 스팸 어플라이언스가 그 키워드가 둘 다 포함되어있을 때 스냅 샷이 올바르게 전송되는 것을 막는 일부 유형의 스팸 어플라이언스 일지 모르지만, 수동으로 .sch 파일을 구독자에게 복사하고 예상되는 URL이 포함되어 있는지 확인합니다. 명령, 나는 여전히 같은 문제가 있습니다.

답변

1

:

ALTER TABLE dbo.#TempTable ADD CONSTRAINT IX_TempTable UNIQUE NONCLUSTERED (ID) 

: 구문이 약간 문제없이 만들 수있는 저장 프로 시저의 원인 변경,

CREATE NONCLUSTERED INDEX [IX_TempTable] ON [dbo].[#TempTable](ID) 

그러나 : 스냅 샷 저장 프로 시저 적용에 실패합니다 나는 그것을 설명 할 수 없다. 그리고이 결함에 문자 그대로의 시간을 보낸 후에, 나는 단지 설명을 찾는 것을 그만두고이 해결책을 해결할 준비가되어있다.

2

음 ... 아무것도 나를 밖으로 뛰어 오르고있어. 호기심에서 스냅 샷 .sch 파일에 무엇이 있습니까? 구독자의 스냅 샷 에이전트가이를 실행합니다. 다음 코드와

+0

좋은 생각 ... .sch 파일을 체크인하고 결과로 질문을 업데이트했습니다. –

+0

나는 당신이 보는 행동을 설명 할 수 없다. sp_addarticle의 @schema_option 매개 변수에 0x01이 설정되어 있습니다. 앞으로 구독자에서 수동으로 proc을 만들고 @pre_creation_cmd를 'none'으로 설정하여 스냅 숏을 실행할 때 proc을 삭제하지 않도록하는 것이 좋습니다. 그게 너를 가야 해. –