为什么SQL2005在新建复制找不到存储过程提示错误:2812 的解决方法
当在SQL Server 2005中新建复制时,会使用储存过程,但有时会发生找不到存储过程并提示 2812 错误的情况。这可能是因为在复制的发布服务器和订阅服务器之间出现了问题。
如何解决问题:
在SQL Server管理工具中检查数据库引擎服务的运行状态。如果服务没有运行,可以右键服务,选择“启动”来启动服务。
确保发布服务器和订阅服务器之间存在网络连接,并且可以进行互相访问。在这种情况下,可能需要修改服务器之间的防火墙规则。
如果以上两个步骤都没有解决问题,可以尝试重新创建储存过程。
下面是两个示例:
第一个示例
假设您在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