如果,你想在一台数据库服务器上,查询另一个台数据服务器的数据该如何做呢?如果,你想在同一台数据服务器上,在不同的数据库之间查询数据,又该怎么办呢?那就让我为你介绍Synonym和openquery吧。

# X0 r( e8 l8 _# V- r
% G: k; J4 B1 W- `  1, 什么是Synonym : N9 R$ s" V$ k* k- z  t& }&
M
  Synonym(同义词)是Sql 2005的新特性。推出已经好几年了。你可以简单的理解Synonym
为其他表的别名。我们使用Northwind数据库为例。比如,看下面的例子
) c$ L" T,
t9 b! N: ]. tCreate Synonym MyCustomers FOR Customers1 P/ [8 c; d! `6 P* F* |  F%
|
  为Customers表创建一个Synonym,叫MyCustomers。
你可以把这个MyCustomers当作一个普通的表,可以对它进行查询,更新,删除和插入。比如
8
k# Q' s6 p. l9 V8 @, U  查询: 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

! F$ n2 d+ n0 f$ ](
o  2, Synonym的应用
& N3 P& j:
Z& S: M5 n! ~8 i; |7 i2 h  在你的程序发布的时候,你突然发现你需要更改某个表名,或字段名。而你的程序已经不可能修改。这时,怎么办呢?那就创建Synonym吧。当然,在
sql2000时代,你可以使用view来做这个事情,或sprocs或udf等。但Synonym有其它所不能的功能,那就是跨数据库,跨服务器。
: Y" `/ A' N) h- e6 g) g* d
, N4 i6 Z: z2 d. R9 K; T  3,Synonym在同一服务器上的不同数据库

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

/ R2 i8 b6 h5 T*
V  先假设已经存在Northwind数据库,然后,再建一个数据库。我们在新的数据库上,创建Customer表的Synonym. 7 l6 j* p1 v% W$ N2 p' U
Create
Synonym MyCustomers For Northiwind.dbo.Customers
5 \. n+ {* w# b' }! u0
?  需要注意的是,后面需要写清那个数据库,那个表,中间dbo为表的owner.
' Z/ I3 ~5 ^' F4 x  然后,运行 Insert into MyCustomers
(CustomersID, CompanyName) values ('Tom', 'MS')
0 g6 ]% ]3 d* [3 N7 L9 L  和Select * from
MyCustomers. 看看是不是真的像普通表那样。
2 g. F5 g2 m& I,
b& q/ p. }$ }9 q; u. B* ]0
C
  4, Synonym在不同服务器上的不同数据库
8 r8 j+ n5
F# i5 y* g" F/
k  假设,我们有一台数据库服务器叫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'
  k3 ^' H. s2 {2 Q) J& H[ , [ @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' ]
0 I: w% m8 n4 _&
V) e8 J- g% J; V$ n[ , [ @location = ] 'location' ]
  S; Z! y! t. F[ , [ @provstr = ] 'provider_string'
]
( z5 {: a+ G* O& X2 u  X: d[ , [
@catalog = ] 'catalog' ]
( M& _3 H+ Q6
F可以运行下面的脚本,将SqlTest注册到本地- Y" j5
`6 u' J0 i) f% W9 X) W
EXEC sp_addlinkedserver
2 [5 N2 {$ q* s5 y4 S@server = 'SqlTest',* d, N3 L& Q  \; j!
_  L
@provider = 'MSDASQL',
$ |+ k3 O%
b- O. y1 R+ m@provstr = 'DRIVER={SQL
Server};SERVER=SqlTest;UID=sa;PWD=;'
; V3 n% z)
S0 |( I7 ]7 ?! v4 x  这样,就可以把远程数据库当成本地的来使用。 + I6 W% }* \: I, ^$ q1 [/ K7
u
: A' a7 @2 R' H- ~;
S
  5,Synonym的其他功能和用UI创建Synonym
4 _(
c. y# p$ q  K% |  Synonym不光可以对表创建,也可以为view,sprocs,以及udf创建相应的Synonym.
如图:/ s8 |* C/ s0 }

$ c) [2 o' L% e( R  Sql2005的Server Managerment
Studio有这么一项,选择后,会出现下面画面。添入名称等,选择object的类型,你就可以选为View,Table,
Sprocs和udf创建Synonym了。
% b6 _' e9 E-
R
) E4 a1 {2 [: @. U7 g6 Y  6,
openquery
0 _) Y; G& i4 u7 f6 P' S7 `7 e+ {-
s  相对于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]的存储过程。你可以在

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

5 p+ Y0 u7 k' }# V, @  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,我们可以实现不同数据库,以及不同服务器之间的数据分流。以达到平衡负载的目的,提高效率的目的。

数据库中使用 Synonym和openquery的更多相关文章

  1. 由浅入深讲解数据库中Synonym的使用方法

    1.Synonym的概念 Synonym(同义词)是SQL Server 2005的新特性.推出已经有几年的时间了.我们可以简单的理解Synonym为其他表的别名.本文中使用Northwind数据库为 ...

  2. 通过jdbc获取数据库中的表结构

    通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类   1.JDBC中通过MetaData来获取具体的表的相关信息.可以查询数据库中的有哪些表,表有哪些字段,字段的属性等等.Met ...

  3. mysql数据库中查询时间

    项目中要对数据按时间处理,在数据库中,时间处理的格式如 2014-12-09 06:30:17 时间查询出来如下所示: 现在要查询具体有哪天的数据,应用substring函数,SQL如下: ) as ...

  4. 使用SignalR和SQLTableDependency跟踪数据库中记录的变动

    原文地址:查看 SqlTableDependency是一个组件用来接收数据库的通知,包含在数据表上该记录的值的Inserted.Deleted或者Update操作. 备注:原文提供示例代码下载,但是j ...

  5. 通过 jdbc 分析数据库中的表结构和主键外键

    文章转自:http://ivan4126.blog.163.com/blog/static/20949109220137753214811/ 在某项目中用到了 hibernate ,大家都知道 hib ...

  6. Oracle数据库中的重要对象

    数据库中的重要对象:表.视图.序列.函数.存储过程.索引.同义词1.表:用PL/SQL Developer 软件打开 Scott的DEPT表查看SQL,可以看见DEPT表创建的脚本-- Create ...

  7. 通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类

    http://www.cnblogs.com/lbangel/p/3487796.html 1.JDBC中通过MetaData来获取具体的表的相关信息.可以查询数据库中的有哪些表,表有哪些字段,字段的 ...

  8. SQLServer中同义词Synonym的用法

    以前一直认为SqlServer中的同义词(Synonym)没有什么用处,所以也一直没有去查它的语法格式.今天碰到一个问题,用Synonym来解决再好不过了.问题是这样子的,我的系统中用到了多个数据库, ...

  9. 在SQL2008查找某数据库中的列是否存在某个值

    在SQL2008查找某数据库中的列是否存在某个值 --SQL2008查找某数据库中的列是否存在某个值 create proc spFind_Column_In_DB ( @type int,--类型: ...

随机推荐

  1. pl/sql programming 05 循环迭代处理

    使用循环应考虑的因素 1. 循环什么时候结束 2. 什么时候测试是否该结束循环 3. 采用这种循环的原因 1. 普通循环(简单循环) 使用场合, 不能确定循环执行多少次, 要求循环至少执行一次. 另外 ...

  2. Z-偏移量

    使用Z-偏移量 在一个三维场景中,我们可以对共面的多边形使用z-偏移量来使它们不再共面.这项技术通常用于在场景中正确的显示阴影.例如,一堵墙上的阴影与这堵墙的深度值是相同的,如果我们先渲染了墙再来渲染 ...

  3. Android开源库--ActiveAndroid(active record模式的ORM数据库框架)

    Github地址:https://github.com/pardom/ActiveAndroid 前言 我一般在Android开发中,几乎用不到SQLlite,因为一些小数据就直接使用Preferen ...

  4. 【笨嘴拙舌WINDOWS】tagTEXTMETRIC结构

    tagTEXTMETRIC用于定义在window输出文字时字的大小,其结构如下: 我在窗体上写了两句话,来详细解剖该结构(在MM_TEXT模式下输出) tmHeight表示一行文字的高度.改例中值为1 ...

  5. js中encode、decode的应用说明

    escape 方法 返回一个可在所有计算机上读取的编码 String 对象. function escape(charString : String) : String 参数 charString 必 ...

  6. asp.net下通过泛解析和伪静态实现二级域名的实现方法

    在net中微软已经为我们留下了接口,让我们为所欲为了. 首先我们可以通过一张图大概了解下.net的生命周期. 从 上图可以看出来,针对每个不同用户的请求,服务器都会创建一个新的HttpContext实 ...

  7. 2016年4月TIOBE编程语言排行榜 Visual Basic正渐行渐远

    COBOL, BASIC 和 FORTRAN 很长一段时间作为主力开发语言被使用.有很多软件使用这些语言来编写,并且发展的不亦乐乎.然而经过多年的发展,COBOL和FORTRAN逐渐被抛弃, 而得益于 ...

  8. Hadoop实战课程

    Hadoop生态系统配置Hadoop运行环境Hadoop系统架构HDFS分布式文件系统MapReduce分布式计算(MapReduce项目实战)使用脚本语言Pig(Pig项目实战)数据仓库工具Hive ...

  9. jquery 连写注释;siblings() 方法;jQuery 的3种滑动方法;slideUp()向上滑动;slideDown()向下滑动;slideToggle()来回滑动

    首先我们看两个连写注释 第一个:   /* 点击头像,显示基本资料 */ $(".f-chatTit a.avatar").click(function(){ $(this).hi ...

  10. Couchbase的web管理员后台 查看缓存提示警告 Warning: Editing of document with size more than 2.5kb is not allowed的解决方法

    这个警告仅仅只会发生在web管理员后台,实际在缓存中的数据是不会有影响的(好像默认单个key对应的缓存大小是20M) 但是有时候我们就是想在web后台里面看看到底保存了什么数据,怎么能突破这个限制呢? ...