关键词

为什么SQL2005在新建复制找不到存储过程提示错误:2812 的解决方法

为什么SQL2005在新建复制找不到存储过程提示错误:2812 的解决方法

当在SQL Server 2005中新建复制时,会使用储存过程,但有时会发生找不到存储过程并提示 2812 错误的情况。这可能是因为在复制的发布服务器和订阅服务器之间出现了问题。

如何解决问题:

  1. 检查数据库引擎服务的运行状态

在SQL Server管理工具中检查数据库引擎服务的运行状态。如果服务没有运行,可以右键服务,选择“启动”来启动服务。

  1. 检查发布服务器和订阅服务器的连接

确保发布服务器和订阅服务器之间存在网络连接,并且可以进行互相访问。在这种情况下,可能需要修改服务器之间的防火墙规则。

  1. 重新创建储存过程

如果以上两个步骤都没有解决问题,可以尝试重新创建储存过程。

下面是两个示例:

第一个示例

假设您在Master数据库中新建了复制,但在NewDB数据库中找不到储存过程。您可以按照下列步骤操作:

USE [master]
GO
EXEC dbo.sp_addpublication 
    @publication = N'PublicationName', 
    @description = N'', 
    @sync_method = N'native', 
    @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'true', 
    @allow_sync_tran = N'false', 
    @autogen_sync_procs = N'false', 
    @validate = 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

在这个例子中,我们使用“dbo.sp_addpublication”储存过程创建了一个发布。我们可以用类似的方法重新创建其他可能出现问题的储存过程。

第二个示例

看下面的语句:

exec master.sys.sp_MSacquirePublisherLocalForSub

可以使用以下语句重新创建此储存过程:

USE [master]
GO
IF EXISTS ( SELECT  * FROM    sys.objects
            WHERE   [object_id] = OBJECT_ID(N'[sys].[sp_MSacquirePublisherLocalForSub]')
                    AND [type] IN (N'P', N'PC') ) 
    DROP PROCEDURE [sys].[sp_MSacquirePublisherLocalForSub]
GO
USE [distribution]
GO
IF EXISTS ( SELECT  * FROM    sys.objects
            WHERE   [object_id] = OBJECT_ID(N'[dbo].[MSacquirePublisherLocalForSub]')
                    AND [type] IN (N'P', N'PC') ) 
            DROP PROCEDURE [dbo].[MSacquirePublisherLocalForSub]
GO
USE [master]
GO

CREATE PROCEDURE [sys].[sp_MSacquirePublisherLocalForSub](@publisher
sysname, @publisher_db sysname, @publication sysname)

AS

SET NOCOUNT ON

DECLARE @retcode INT
DECLARE @distproc sysname

-- parameter check
IF (@publisher IS NULL) OR (@publisher_db IS NULL)
     OR (@publication IS NULL)
BEGIN
    RAISERROR (20054, 16, -1)
    RETURN (1)
END

-- Make sure there is no overlap between the publication database and the
-- distribution database
IF UPPER(@publisher_db) = UPPER(DB_NAME())
BEGIN
    RAISERROR (21262, 16, -1, '@publisher_db')
    RETURN (1)
END
IF UPPER(@publisher_db) = UPPER(masteR.sys.sp_get_qdistrib_info())
BEGIN
    RAISERROR (21262, 16, -1, '@publisher_db')
    RETURN (1)
END

-- EXEC @retcode = sp_get_mysubscription @publisher, @publisher_db, @publication
-- IF (@@error != 0) OR (@retcode != 0)
--     RETURN (@retcode)

EXEC @retcode = master..sp_MSget_version @@servername, @distproc OUT, 1
IF @@error != 0
    RETURN (1)

在这个示例中,我们使用相同的名称和相似的语法重新创建“sys.sp_MSacquirePublisherLocalForSub”储存过程。

本文链接:http://task.lmcjl.com/news/14137.html

展开阅读全文