SQL Server关联数据库别名

12

是否可以同时拥有LinkedServer,链接数据库和服务器?

我的情况是在一个环境中有这样的设置:

ServerX: DatabaseOne, DatabaseTwo

另一个环境为:

ServerY: MyDatabaseOne, MyDatabaseTwo

现在,DatabaseOne 和 MyDatabaseOne 完全相同,DatabaseTwo 和 MyDatabaseTwo 也是如此。我有一个存储过程,在给定服务器上从一个数据库更新一些基本表至另一个数据库,并且我希望它能够在两个环境中都能工作。我设置了一个链接服务器,这样我的引用可以是:

MyLinkedServer.DatabaseOne.dbo.MyTable 或 MyLinkedServer.MyDatabaseOne.dbo.MyTable

然而,即使这样,我仍然需要更改存储过程以更改数据库名称,以便在切换环境时使用。是否有任何设置数据库别名的方法,使得我可以写成:

SELECT * FROM MyLinkedServer.MyLinkedDatabase.dbo.MyTable

只要每个环境都设置了LinkedServer和(如果可能)LinkedDatabase,存储过程就可以在不更改时切换环境并正常工作?


1
要了解关联服务器和同义词,请参考http://sqlblog.toolsoftonline.com/?p=78 - user6177072
4个回答

22
您可以通过以下步骤为服务器创建别名来避免动态SQL(感谢此篇文章):
1) 第一步:
- 在SQL Server Management Studio中打开Linked Servers然后点击“New Linked Server”。 - 在出现的向导中,选择“General”选项卡。 - 在“Linked server”字段中指定别名。 - 选择SQL Native Client作为提供程序。 - 在“Product Name”字段中添加sql_server(这就是奥妙所在)。 - 在“Data Source”中,指定用作联接服务器的主机名称。
2) 第二步:
- 在“Security”选项卡中,指定正确的安全选项(例如安全上下文)。
3) 第三步:
- 在“Server Options”选项卡中,将“Data Access”、“RPC”、“RPC Out”和“Use Remote Collation”设置为true。
4) 第四步:
- 欣赏效果吧!
您还可以更进一步地跳过在查询表时指定数据库名称,可以为每个对象创建类似以下的同义词。
CREATE SYNONYM [dbo].[DimProduct]
FOR
[AdventureWorksDW].[dbo].[DimProduct]

这将在您的数据库中创建DimProduct的同义词。据我所知,您无法为数据库创建同义词。


4

我认为简短的回答是否定的。我不相信数据库别名目前已得到支持。

动态SQL可以实现它。您可以注入数据库名称等信息并执行查询。


谢谢@Carl,我就感觉答案会是这样。 - Ben
做正确的事情,Ben,使用正确的数据库名称创建另一个实例吧! :) - Will A

4

该页面上的“注记”值得注意(?):“您无法引用位于链接服务器上的同义词。” 您也无法为数据库创建同义词 - 迷惑吗? - Will A
是的,那是我尝试做的第一件事,并注意到它失败了。这意味着,您不能创建一个名为“MyLinkedServer”的链接服务器,然后在该服务器上创建一个同义词“MySyn”,并调用“MyLinkedServer.MySyn”。如果您已经使用同义词,那么您不需要使用LinkedServers,因为您必须在其创建时声明服务器。 - Ben

2

我知道这是一个老问题,但是(至少在SQL 2014中,但我猜在旧版本中也是如此),您可以设置一个带有“别名”的链接服务器,并使用远程查询(OPENQUERY)进行数据库部分。

USE [master]
GO

EXEC master.dbo.sp_addlinkedserver @server = N'MyAliasServer', @srvproduct=N'SQLSERVER', 
             @provider=N'SQLNCLI', @datasrc=N'MyRealServer1', @catalog=N'database1'

当然,您还需要设置安全等内容。之后,您可以运行。
SELECT * FROM OPENQUERY(MyAliasServer, 'select * from dbo.MyTbl')

不需要指定数据库名称(因为它已经在链接服务器连接中定义)。

如果您脚本化链接服务器(上下文菜单),并替换服务器名称/数据库名称,您可以通过删除当前链接服务器并创建另一个链接服务器在两个服务器之间进行切换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接