创建指向自身的链接服务器


14

我正在尝试servername\instancename使用以下调用在SQL Server 2014实例上创建链接服务器:

EXEC master.dbo.sp_addlinkedserver 
    @server = N'servername\instancename',
    @srvproduct=N'SQL Server'

我收到错误消息:

Msg 15028, Level 16, State 1, Procedure sp_addlinkedserver, Line 82
The server 'servername\instancename' already exists.

根据MSDN的说法,这在SQL Server 2005中可以正常工作。

链接服务器不必是SQL Server的另一个实例,

因此,我不确定最近的版本中有哪些更改不允许这样做。使用UI会生成类似的消息:

您不能将本地SQL Server创建为链接服务器。

我知道请求是一件奇怪的事情,但是它要支持一些在2005年有效的旧代码(以前在单独的实例上使用)。文档指出它应该可以,但是不能。有什么方法可以使其在2014年正常工作,还是我必须修改基础代码?


1
实际上,它甚至都不起作用。您可以在本地服务器上使用4部分标识符。
Kris Gruttemeyer 2014年

为什么要尝试创建到本地服务器的链接服务器?哪一部分不起作用?也许那就是您应该问的问题...
亚伦·贝特朗

1
遗留代码是为通过链接服务器连接的不同实例编写的。在历史上的某个时候,两个实例合并为一个实例,但是代码和链接服务器保持不变。我的目标是按原样支持代码,因为a)我不知道转换代码涉及什么,并且b)主要开发人员希望将来能够支持将数据库分发到单独的实例。
mathewb 2014年

3
您可能需要考虑同义词。然后,如果将对象移动到其他服务器,则只需拖放并重新创建同义词即可,而不必触摸代码。
亚伦·伯特兰

谢谢亚伦。我认为这正是我想要的。一个数据库使用同义词,因此我只需要删除/创建它们就可以从四部分名称中删除服务器名称。然后,我可以完全消除链接服务器。如果以后再移动数据库,则可以将链接的服务器名称重新添加到同义词中。得到它了。
mathewb 2014年

Answers:


20

事实证明,我能够使它使用不同的参数。

EXEC master.dbo.sp_addlinkedserver
    @server = N'LinkedServerName', 
    @srvproduct=N'', 
    @provider=N'SQLNCLI', 
    @provstr=N'DRIVER={SQL Server};Server=(local)\InstanceName; Initial Catalog=DBNAME;uid=user;pwd=password;'

11

与其在代码内部处理链接服务器引用,不如考虑一次性进行代码投资,其中涉及在当前拥有链接服务器的任何位置使用同义词

所以代替:

SELECT whatever FROM someserver.somedb.dbo.mytable;

您有一个同义词:

CREATE SYNONYM dbo.mytablepointer FOR someserver.somedb.dbo.mytable;

那么您的代码就是:

SELECT whatever FROM dbo.mytablepointer;

然后,如果将对象移动到其他服务器,则只需拖放并重新创建同义词即可,而无需触摸代码:

DROP SYNONYM dbo.mytablepointer;
CREATE SYNONYM dbo.mytablepointer FOR otherserver.somedb.dbo.mytable;

3

运行此命令-您将能够将本地服务器用作链接服务器,而无需更改代码

EXEC sp_addlinkedserver @server = 'LinkedServerName',
                        @provider ='SQLNCLI',
                        @datasrc ='LocalServerName',
                        @srvproduct = 'SQL'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.