SQL Server 2005事务复制无法发布包含索引创建的存储过程

|| 我在使用SQL Server 2005事务发布时遇到了一个奇怪的问题。问题是这样的:如果发布包含的文章是包含创建索引语句的存储过程,则在尝试将存储过程的模式复制到订户时会引发错误。 这种行为非常奇怪,因为即使注释掉了create index语句,它仍然会给出异常,并且只有将其完全删除后它才有效。 这是返回的确切错误:   尝试执行命令:GRANT EXECUTE ON   [dbo]。[usp_Test]至   [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 ******/
同样,奇怪的是,如果将创建索引语句注释掉,则发布仍将包含相同的错误,但是如果将其完全删除,它将起作用。 现在,我刚刚从发布中删除了所有包含这些创建索引语句的存储过程,但是我希望将它们复制到订阅服务器,以便对过程的任何DDL更新将自动反映在订阅服务器上。 -编辑- 在快照目录中查看,usp_Test的.sch文件包含我之前为存储过程发布的完全相同的代码块...根据返回的错误,似乎快照代理决定不运行CREATE PROCEDURE命令,如果它包含创建索引,但随后继续并尝试运行GRANT EXECUTE命令,这将导致错误。 另外,我的SQL Server确切版本是:   Microsoft SQL Server 2005-   9.00.5254.00(2005 + SP4累积更新1) -结束编辑- 我的问题是,为什么会这样?发布或订阅的配置是否存在问题?像其他人一样经历过吗?我将从哪里开始解决此问题? -更新- 我一直在Technet上与Hilary Cotter交谈...但仍然没有运气。如果我删除了该程序的GRANT EXECUTE权限,则它会使用CREATE INDEX成功创建。因此它将与GRANT EXECUTE或CREATE INDEX一起使用,但不能同时使用。希拉里建议,可能是我域中的某种垃圾邮件设备阻止了快照同时包含这两个关键字的情况下正确传输,但是如果我手动将.sch文件复制到订阅服务器并验证其是否包含预期的内容命令,我仍然遇到相同的问题。     
已邀请:
嗯...什么都没跳出来。出于好奇,快照.sch文件中包含什么?这就是由订阅服务器上的快照代理运行的内容。     
使用以下代码:快照中的存储过程将无法应用:
CREATE NONCLUSTERED INDEX [IX_TempTable] ON [dbo].[#TempTable](ID)
但是,稍微更改语法会导致存储过程的创建没有问题:
ALTER TABLE dbo.#TempTable ADD CONSTRAINT IX_TempTable UNIQUE NONCLUSTERED ( ID )
我无法解释,在花了数小时的时间处理此故障之后,我准备停止寻找解释并为解决此问题做好准备。     

要回复问题请先登录注册