详解在不同的SQL Server数据库之间查询数据


  本文标签:Synonym Openquery SQL Server

  1, 什么是Synonym

  Synonym(同义词)是Sql 2005的新特性  。推出已经好几年了  。你可以简单的理解Synonym 为其他表的别名  。我们使用Northwind数据库为例  。比如,看下面的例子

Synonym MyCustomers FOR Customers

  为Customers表创建一个Synonym,叫MyCustomers  。 你可以把这个MyCustomers当作一个普通的表,可以对它进行查询,更新,删除和插入  。比如

  查询: Select * from MyCustomers.

  插入:  Insert into MyCustomers  (CustomersID, CompanyName) values (Tom, MS)

  所有的操作,和普通的表没有区别  。

  2, Synonym的应用

  在你的程序发布的时候,你突然发现你需要更改某个表名,或字段名  。而你的程序已经不可能修改  。这时,怎么办呢?那就创建Synonym吧  。当然,在sql2000时代,你可以使用view来做这个事情,或sprocs或udf等  。但Synonym有其它所不能的功能,那就是跨数据库,跨服务器  。

  3,Synonym在同一服务器上的不同数据库

  对于同一服务器上的不同数据库,我们可以使用Synonym,将其他数据库中的表或view或sprocs及udf在本数据库中映射别名  。这样,就可以不用更改连接字符串,而在当前对话数据库的情况下,获取其他数据库的数据,并对它进行,查询,更新,删除和插入工作  。

  先假设已经存在Northwind数据库,然后,再建一个数据库  。我们在新的数据库上,创建Customer表的Synonym.

Create Synonym MyCustomers For Northiwind.dbo.Customers 

  需要注意的是,后面需要写清那个数据库,那个表,中间dbo为表的owner.然后,运行 Insert into MyCustomers  (CustomersID, CompanyName) values (Tom, MS)和Select * from MyCustomers. 看看是不是真的像普通表那样  。

  4, Synonym在不同服务器上的不同数据库

  假设,我们有一台数据库服务器叫SqlTest  。上面有个数据库叫Northwind  。我们本地还有一台数据库服务器  。叫LocalTest. 其上面有一数据库叫Northwind或其他什么的  。突然有一天,为了使本地的数据库跑的更快,本地的老数据被移到SqlTest上去了,本地只保存最近更新的  。那老数据总还是要用的,怎么样实现不同服务器之间的数据操作呢?那就用Synonym吧  。如下

Create Synonym MyCustomers For SqlTest.Northiwind.dbo.Customers 

  在上一个例子的基础上,加了个机器名字而已  。就这么简单?不是吧?那台服务器还不一定知道用户名和密码呢  。恩,是的,还要在本地服务器上,注册下远程的服务器  。使用sp_addlinkedserver,次存储过程定义如下:

  
sp_addlinkedserver [ @server = ] server
[ , [ @srvproduct = ] product_name ]
[ , [ @provider = ] provider_name ]
[ , [ @datasrc = ] data_source ]
[ , [ @location = ] location ]
[ , [ @provstr = ] provider_string ]
[ , [ @catalog = ] catalog ]

  可以运行下面的脚本,将SqlTest注册到本地

  
EXEC sp_addlinkedserver 
@server = SqlTest,
@provider = MSDASQL,
@provstr = DRIVER={SQL Server};SERVER=SqlTest;UID=sa;PWD=;

  这样,就可以把远程数据库当成本地的来使用  。

  5,Synonym的其他功能和用UI创建Synonym

  Synonym不光可以对表创建,也可以为view,sprocs,以及udf创建相应的Synonym. 如图:

  
Sql2005的Server Managerment Studio有这么一项,选择后,会出现下面画面  。添入名称等,选择object的类型,你就可以选为View,Table, Sprocs和udf创建Synonym了  。

  6, openquery

  相对于Synonym,OpenQuery相对来说,功能就弱了点  。其只是在调用其它数据库上的sprocs.比如

select * from openquery([SqlTest], exec northwind.dbo.
[Customers By City] @param1=NLondon)where CustomerID = AROUT

  这就是在执行SqlTest服务器上的,northwind数据库下的,[Customers By City]的存储过程  。你可以在Linq To Sql进阶系列(五)Store Procedure篇 一文中,获得该存储过程  。openquery其第一个参数为数据服务器的名称  。如果是异地的,也需要在本地注册它,和Synonym相同  。你也可以写本地的机器名,那就成了本地跨数据库的操作了  。在上面的这个例子中,其语句中有London,是传入存储过程的值  。因为其已经被 引过,在openquery函数下,又要被 引  。所以,它两头加了两个   。 如果有疑问,请参阅SQL 语句中特殊字符的处理及预防sql 注射

  7, Linq 对Synonym的支持

  目前SqlMetal和OR designer无法对Synonym做映射  。但是,用户依然可以通过手工修改dbml 达到映射的目的  。Synonym在Linq中的使用  。和其他表等没有任何差别  。

  结论:通过Synonym,我们可以实现不同数据库,以及不同服务器之间的数据分流  。以达到平衡负载的目的,提高效率的目的  。