huanghan 2010-04-19
1、分布式查询的概念
·链接到外部数据源要做的工作只不过是:配置好链接服务器的名字、以及相应的位置和登录信息,这样SQLServer就可以存取链接服务器上的数据了。
·链接是一个单向配置,如果服务器A链接到服务器B,意味着A知道如何登录和访问B。而对于B而言,A只不过是另一个普通用户而已。
·链接服务器可以是SQLServer或者任何其他的OLEDB和ODBC数据源。只要相应的OLEDB提供程序或者ODBC驱动程序支持,分布式查询可以检索和修改(insert、delete、update)相应数据源中的数据。
·SQLServer查询可以通过引用预先配置好的链接服务器或直接在查询代码中指定链接的方法来引用外部数据。
2、存取本地SQLServer上的数据库
·当你存取同一个服务器上另一个数据库中的数据时,由于处理数据时使用的是同一个SQLServer引擎,所以尽管所查询的数据位于本地数据库之外,这样的查询仍然不是真正的分布式查询。
·只要在被引用的表前加上数据库名,就可以存取同一个服务器上的另一个数据库了。
3、链接到外部数据源
·用企业管理器建立链接:服务器-->安全性-->链接服务器-->右键“新建”,链接实际上就是定义如何登录到另一个服务器。
·用T-SQL创建链接:
系统存储过程作用说明
sp_addlinkedserver建立链接
创建链接服务器要两部分完成,建立链接和登录信息
sp_dropserver删除链接服务器
sp_linkedservers显示链接服务器
sp_addlinkedsrvlogin建立登录信息安全问题被分解为两部分:映射的登录和没有映射的登录
sp_droplinkedsrvlogin删除登录信息
sp_serveroption链接服务器选项
示例代码22-1
--建立连接服务器mssql版本
execsp_addlinkedserver
--要创建的链接服务器名称
'link_mssql',
--产品名称mssql
'ms',
--oledb字符
'sqloledb',
--数据源,要链接的服务器
'zhou'
go
--创建链接服务器上远程登录之间的映射
execsp_addlinkedsrvlogin
'link_mssql',
'false',
null,
--远程服务器的登陆用户名
'sa',
--远程服务器的登陆密码
'sa'
go
--查询数据
select*fromlink_mssql.测试.dbo.学员
execsp_linkedservers
示例代码22-2
--建立连接服务器access版本
execsp_addlinkedserver
--要创建的链接服务器名称
'link_access',
--产品名称
'access',
--oledb字符
'microsoft.jet.oledb.4.0',
--数据源
--格式:
--盘符:\路径\文件名
--\\网络名\共享名\文件名(网络版本)
'D:\wwwroot\asp\user.mdb'
go
--创建链接服务器上远程登录之间的映射
--链接服务器默认设置为用登陆的上下文进行
--现在我们修改为连接链接服务器不需使用任何登录或密码
execsp_addlinkedsrvlogin
'link_access',
'false'
go
--查询数据
select*fromlink_access...admin
execsp_linkedservers
示例代码22-3
--建立连接服务器excel版本
execsp_addlinkedserver
--要创建的链接服务器名称
'link_excel',
--产品名称
'ex',
--oledb字符
'microsoft.jet.oledb.4.0',
--数据源
--格式:
--盘符:\路径\文件名
--\\网络名\共享名\文件名(网络版本)
'D:\wwwroot\Excel\book.xls',
null,
--oledb提供程序特定的连接字符串
'excel5.0'
go
----创建链接服务器上远程登录之间的映射
--链接服务器默认设置为用登陆的上下文进行
--现在我们修改为连接链接服务器不需使用任何登录或密码
execsp_addlinkedsrvlogin'link_excel','false'
go
--查询数据
select*fromlink_excel...sheet1$
execsp_linkedservers
4、开发分布式查询
·本地-分布式查询:是从外部数据源取回数据,然后在本地SQLServer上执行查询。由于是在本地SQLServer上执行查询,所以它用的是T-SQL语法。
·直接传递-分布式查询:它在外部数据源上执行查询,并把结果返回给SQLServer。使用传递查询的最主要的理由是为了减少服务器(外部数据源)和客户(SQLServer)之间的通信量。要注意,直接传递需要使用外部数据源上查询语法。
建立链接的方式本地SQLServer外部数据源(直接传递)
链接服务器由四部分构成的名字
由四部分构成的名字
OpenQuery()
在查询中声明链接OpenDataSource()OpenRowSet()
示例代码22-4
--本地-分布式查询(链接服务器)
select*fromlink_mssql.测试.dbo.学员
select*fromlink_access...admin
select*fromlink_excel...sheet1$
--本地-分布式查询(在查询中声明链接)
select*fromOpenDataSource('sqloledb','DataSource=zhou;UserID=sa;Password=sa').测试.dbo.学员
select*fromOpenDataSource('microsoft.jet.oledb.4.0','DataSource=D:\wwwroot\asp\user.mdb;UserID=;Password=')...admin
select*fromOpenDataSource('microsoft.jet.oledb.4.0','DataSource=D:\wwwroot\Excel\book.xls;UserID=;Password=')...sheet1$
--直接传递-分布式查询(链接服务器)
select*fromOpenQuery(link_mssql,'select*fromzhou.测试.dbo.学员')
select*fromOpenQuery(link_access,'select*fromadmin')
select*fromOpenQuery(link_excel,'select*from[sheet1$]')
--直接传递-分布式查询(在查询中声明链接)
select*fromOpenRowSet('sqloledb','zhou';'sa';'sa','select*fromzhou.测试.dbo.学员')
select*fromOpenRowSet('microsoft.jet.oledb.4.0','D:\wwwroot\asp\user.mdb';'admin';'','select*fromadmin')
5、分布式事务
·事务对数据的完整性非常重要。如果在这种逻辑工作单元中包含了对本地SQLServer以外的数据的修改,标准的事务处理机制就无法实现事务的原子性。如果事务的执行过程中发生了错误,必须有一种机制可以回滚已完成的那部分操作,否则整个数据库会处于不一致的状态。
·SQLServer用分布式事务处理协调器(DistributedTransactionCoordinator,DTC)来处理涉及多个服务器的事务的提交与回滚。
·分布式事务处理协调器是与SQLServer相互独立的服务。使用SQLServer服务管理器可以启动和停止DTC。一台服务器上只能运行一个DTC实例,无论有多少SQLServer实例安装或者运行在这台服务器上。这个服务的执行程序是msdtc.exe,必须在启动了DTC之后,才能执行分布式事务,否则事务就会失败。
语法说明
setxact_aborton
begindistributedtransaction
...
committransaction
用来检查DTC服务是否可用的begindistributedtransaction命令不是必须的。因为,系统将会自动地把用begintran开始的事务提升为分布式事务,并在执行分布式查询时自动检查DTC是否可以用。但我们推荐使用begindistributedtransaction命令,这样就可以在事务开始时检查DTC是否可用。如果DTC不可用,系统就会自动生成8501号错误。
示例代码22-5
setxact_aborton
begindistributedtransaction
insertinto
OpenRowSet('microsoft.jet.oledb.4.0','D:\wwwroot\asp\user.mdb';'admin';'','selectusername,passwordfromadmin')
(username,password)values('2','henhen')
if@@error<>0
begin
rollback
raiserror('链接服务器microsoft.jet.oledb.4.0出错!%i',15,1,@@error)
end
insertinto
OpenRowSet('microsoft.jet.oledb.4.0','D:\wwwroot\asp\user.mdb';'admin';'','select[id]fromadmin')
(id)values('2')
if@@error<>0
begin
rollback
raiserror('链接服务器sqloledb出错!%i',15,1,@@error)
end
committransaction
这里是网上找的,感觉他这边的sql的效率不高,但作为了解这方面的需要,就留下了。
@server=‘LinkServer‘, --链接服务器别名。@datasrc=‘192.168.1.1‘ --要访问的的数据库所在的服务器的ip. ‘******‘ --要访问的数据库,用户的密码