如果,你想在一台数据库服务器上,查询另一个台数据服务器的数据该如何做呢?如果,你想在同一台数据服务器上,在不同的数据库之间查询数据,又该怎么办呢?那就让我为你介绍Synonym和openquery吧。
1, 什么是Synonym : N9 R$ s" V$ k* k-
z t& }&
M
Synonym(同义词)是Sql
2005的新特性。推出已经好几年了。你可以简单的理解Synonym
为其他表的别名。我们使用Northwind数据库为例。比如,看下面的例子
Create Synonym MyCustomers FOR Customers1
P/ [8 c; d! `6 P* F* | F%
|
为Customers表创建一个Synonym,叫MyCustomers。
你可以把这个MyCustomers当作一个普通的表,可以对它进行查询,更新,删除和插入。比如
查询: Select * from MyCustomers.
7 q7 ?7 D7 O+ ^,
g
插入: Insert
into MyCustomers (CustomersID,
CompanyName) values (‘Tom‘, ‘MS‘) ;
J& U! K) K+ e% V9
q
所有的操作,和普通的表没有区别。 !
d: j#
r8 x- j
2, Synonym的应用
在你的程序发布的时候,你突然发现你需要更改某个表名,或字段名。而你的程序已经不可能修改。这时,怎么办呢?那就创建Synonym吧。当然,在
sql2000时代,你可以使用view来做这个事情,或sprocs或udf等。但Synonym有其它所不能的功能,那就是跨数据库,跨服务器。
3,Synonym在同一服务器上的不同数据库
对于同一服务器上的不同数据库,我们可以使用Synonym,将其他数据库中的表或view或sprocs及udf在本数据库中映射别名。这样,就可以不用更改连接字符串,而在当前对话数据库的情况下,获取其他数据库的数据,并对它进行,查询,更新,删除和插入工作。
先假设已经存在Northwind数据库,然后,再建一个数据库。我们在新的数据库上,创建Customer表的Synonym.
7 l6 j* p1 v% W$ N2 p‘
U
Create
Synonym MyCustomers For Northiwind.dbo.Customers
需要注意的是,后面需要写清那个数据库,那个表,中间dbo为表的owner.
然后,运行 Insert into MyCustomers
(CustomersID, CompanyName) values (‘Tom‘, ‘MS‘)
和Select * from
MyCustomers.
看看是不是真的像普通表那样。
/ p. }$ }9 q;
u. B* ]0
C
4, Synonym在不同服务器上的不同数据库
假设,我们有一台数据库服务器叫SqlTest。上面有个数据库叫Northwind。我们本地还有一台数据库服务器。叫LocalTest.
其上面有一数据库叫Northwind或其他什么的。突然有一天,为了使本地的数据库跑的更快,本地的老数据被移到SqlTest上去了,本地只保存最近更新的。那老数据总还是要用的,怎么样实现不同服务器之间的数据操作呢?那就用Synonym吧。如下) E, m2 E: ]+ l! H$ i& A!
u
Create Synonym MyCustomers For
SqlTest.Northiwind.dbo.Customers
在上一个例子的基础上,加了个机器名字而已。就这么简单?不是吧?那台服务器还不一定知道用户名和密码呢。恩,是的,还要在本地服务器上,注册下远程的服务器。使用sp_addlinkedserver,次存储过程定义如下:2 C% o: f. E0 r$ {‘ H3 z3 x(
^
sp_addlinkedserver [ @server = ] ‘server‘
[ , [ @srvproduct = ]
‘product_name‘ ]3 M8 B/ z. t. _7 e" P,
J.
[
[ , [ @provider = ] ‘provider_name‘ ] _-
n/ z% T8 p) L2 a$ T3 K
[ , [
@datasrc = ] ‘data_source‘ ]
[ , [
@location = ] ‘location‘ ]
[ , [ @provstr = ] ‘provider_string‘
]
[ , [
@catalog = ] ‘catalog‘
]
可以运行下面的脚本,将SqlTest注册到本地-
Y" j5
`6 u‘ J0 i) f% W9 X) W
EXEC sp_addlinkedserver
@server = ‘SqlTest‘,* d, N3 L&
Q \; j!
_ L
@provider = ‘MSDASQL‘,
@provstr =
‘DRIVER={SQL
Server};SERVER=SqlTest;UID=sa;PWD=;‘
这样,就可以把远程数据库当成本地的来使用。 + I6 W% }* \: I, ^$ q1 [/ K7
u
: A‘ a7
@2 R‘ H- ~;
S
5,Synonym的其他功能和用UI创建Synonym
Synonym不光可以对表创建,也可以为view,sprocs,以及udf创建相应的Synonym.
如图:/ s8 |* C/ s0
}
Sql2005的Server Managerment
Studio有这么一项,选择后,会出现下面画面。添入名称等,选择object的类型,你就可以选为View,Table,
Sprocs和udf创建Synonym了。
6,
openquery
相对于Synonym,OpenQuery相对来说,功能就弱了点。其只是在调用其它数据库上的sprocs.比如6 o, _* i& p, o" W! n3
K
select * from openquery([SqlTest], ‘exec
northwind.dbo.[Customers By
City] @param1=N‘‘London‘‘‘) where CustomerID =
‘AROUT‘1 f6 {! L: V: Y)
N$ F- u(
V
这就是在执行SqlTest服务器上的,northwind数据库下的,[Customers By
City]的存储过程。你可以在
Linq To
Sql进阶系列(五)Store Procedure篇
一文中,获得该存储过程。openquery其第一个参数为数据服务器的名称。如果是异地的,也需要在本地注册它,和Synonym相同。你也可以写本地的机器名,那就成了本地跨数据库的操作了。在上面的这个例子中,其语句中有London,是传入存储过程的值。因为其已经被
‘ 引过,在openquery函数下,又要被 ‘ 引。所以,它两头加了两个 ‘‘。 如果有疑问,请参阅SQL 语句中特殊字符的处理及预防sql 注射
‘ b$ m$ x( ]0
b
7, Linq 对Synonym的支持 2
m. d2 S1 ?* b8 s9 X"
a
目前SqlMetal和OR
designer无法对Synonym做映射。但是,用户依然可以通过手工修改dbml
达到映射的目的。Synonym在Linq中的使用。和其他表等没有任何差别。 5
U. H2 m" B5 N1 p$ M- ^
0
W) ~0 u/ y$ W) F6 R; h(
A
结论:通过Synonym,我们可以实现不同数据库,以及不同服务器之间的数据分流。以达到平衡负载的目的,提高效率的目的。