链接服务器为SQL Server提供了从远程数据源访问数据的能力。使用链接服务器,你可以执行查询、实施数据修改以及执行远程过程调用。远程数据源可以是同类(意思是数据源是另一个SQL Server实例)或异类的(来自其他关系型数据库产品和数据源,比如DB2、Access、Oracle、Excel和文本文件)。跨越多个平台联结或检索数据的查询是跨平台查询。使用跨平台查询,可以访问遗留数据库系统,而不需要对既有的数据源进行合并和迁移。
通过OLE DB访问接口连接远程的数据源。OLE DB由微软开发,是用来提供到各种不同的数据源的一致性访问的一组COM(component object model,组件对象模型)接口。为了建立从SQL Server 2005实例到另一数据源的访问,需要选择适当的OLE DB访问接口。OLE DB访问接口的设计方式决定在分布式查询(SELECT、INSERT、UPDATE或DELETE存储过程执行)中实现何种分布式查询操作。
因此概括的说,链接服务器意思是建立到远程数据源的连接的途径。依赖用来设置链接服务器的OLE DB驱动,可以执行分布式查询来检索数据,或在远程数据源中执行操作。
分布式查询也可以不通过定义链接服务器来运行,例如通过使用T-SQL函数OPENROWSET。除了不通过链接服务器查询远程数据源,在SQL Server 2005增强了OPENROWSET,允许BULK读取ASCII、Unicode以及二进制文件。使用OPENROWSET和BULK,可以从文本文件中读取表状数据,或使用它将ASCII、Unicode或二进制类型文件导入到单个的大数据类型列及单个行中(比如varchar(max)、nvarchar(max)或varbinary(max))。
也是SQL Server 2005中的新特性,微软引入了SYNONYM对象,它允许你通过较短的名称引用长名称的对象。通常在使用长标识符时这是有用的,但在引用了4部分组成的链接服务器名称的分布式查询中,使用较短的名称代替数据源特别有用。
本章包括这些技巧:创建链接服务器、执行分布式查询、使用OPENROWSET和BULK从文本文件中读取以及使用新的SYNONYM对象。
27.1 链接服务器基础
下面一组技巧将展示如何使用链接服务器。特别地,我将展示如何完成下列操作:
l 创建链接服务器连接到另一个SQL Server 2005实例。
l 配置链接服务器的属性。
l 查看SQL Server实例上的配置链接服务器的信息。
l 删除链接服务器。
我将先讨论如何使用系统存储过程sp_addlinkedserver来创建新链接服务器。
27.1.1 为另一SQL Server实例创建链接服务器
链接服务器允许从SQL Server实例中查询外部数据源。外部数据源可以是不同的SQL Server实例,也可以是非SQL Server数据源,比如说Oracle、MS Access、DB2或MS Excel。
使用系统存储过程sp_addlinkedserver来创建链接服务器。语法如下:
表27-1描述了这个系统存储过程的参数。
表27-1 sp_addlinkedserver参数
参 数
描 述
server
链接服务器的本地名称。也允许使用实例名称,例如MYSERVER\SQL1
product_name
OLE DB数据源的产品名。对于SQL Server实例来说,product_name是'SQL Server'
provider_name
这是OLE DB访问接口的唯一可编程标识。当没有指定它时,访问接口名称是SQL Server数据源。SQL Server显式的provider_name是SQLNCLI(Microsoft SQL Native Client OLE DB Provider)。Oracler的是MSDAORA,Oracle 8或更高版本的是OraOLEDB.Oracle。MS Access和MS Excel的是Microsoft.Jet.OLEDB.4.0。IBM DB2的是DB2OLEDB,以及ODBC数据源的是MSDASQL
data_source
这是特定OLE DB访问接口解释的数据源。对于SQL Server,这是SQL Server(servername或servername\instancename)的网络名称。对于Oracle,这是SQL*Net别名。对于MS Access和MSExcel,这是文件的完整路径和名称。对于ODBC数据源,这是系统DSN名称
location
由特定OLE DB访问接口解释的位置
provider_string
OLE DB 访问接口特定的连接字符串。对于ODBC连接,这是ODBC连接字符串。对于MS Excel,这是Excel 5.0
catalog
catalog的定义变化基于OLE DB访问接口的实现。对于SQL Server,这是可选的数据库名称,对于DB2,这个目录是数据库的名称
在多SQL Server实例的网络环境中,链接服务器提供了方便的方式共享SQL Server数据,而不是必须要通过物理地推送或拉回数据和复制架构的方式来实现共享。
提示 在本章中,我讲解了在SQL Server实例之间通信的示例。对于异类的数据源,比如DB2、Access以及Oracle,参数会有很多变化。如果需要更全面的sp_addlinkedserver选项的讲解,请看SQL Server联机丛书中的主题“sp_addlinkedserver (Transact-SQL)”。
连接到异类数据源使用的配置会基于OLE DB访问接口而发生变化。如果你只是连接到不同的SQL Server实例,微软把它变得很简单。在这个示
例中,我展示了创建连接到另一SQL Server实例的链接服务器:
也可以创建连接到SQL Server命名实例的链接服务器,例如:
解析
添加连接到外部数据源的链接服务器允许执行分布式查询(分布式查询将在本章稍后介绍)。当添加SQL Server链接服务器到一个SQL Server实例时,不管它是默认的还是命名的实例,微软都把它变得很简单,只需要server和product_name值。
连接到SQL Server实例的安全性方法是怎样的呢?当创建新的链接服务器时,使用当前用户的登录名安全凭证(SQL或Windows)来链接到链接服务器。也可以创建显示的链接服务器远程登录名映射,稍后会讨论该内容。
27.1.2 配置链接服务器属性
在创建链接服务器之后有许多不同的设置可以用来配置它。表27-2描述了这些设置。
表27-2 链接服务器属性
参 数
描 述
collation compatible
如果你确认SQL Server实例与远程SQL Server拥有相同的排序规则就启用这个设置。由于SQL Server不再需要对数据源之间的字符列执行比较操作,把它们假定为相同的排序规则,这样做可以提升性能
collation name
如果启用了use remote collation并且是非SQL Server的数据源,则collation name指定远程服务器排序规则的名称。这个排序规则名称必须是SQL Server所支持的
connect timeout
指定在超时发生之前到链接服务器的连接会尝试多少秒。如果数值为“0”,sp_ configure的remote query timeout的服务器值用来当作默认值
data access
如果启用,就允许分布式查询访问
lazy schema validation
如果设为true,则架构不会在查询开始时去检测远程表。尽管这样会减少远程查询的负载,但是如果架构发生了变化并且你没有进行架构检测,比如说查询中引用的对象不能与查询命令进行通信,就会生成错误
query timeout
指定查询等待的超时值(秒数)。如果这个值为0,则query wait选项使用sp_configure值
rpc
启用从服务器进行远程过程调用
rpc out
启用远程过程调用到服务器
use remote collation
指定是使用远程服务器排序规则(true)还是本地服务器排序规则(false)
使用系统存储过程sp_serveroption来修改链接服务器属性。语法如下:
表27-3描述了这个系统存储过程的参数。
表27-3 sp_serveroption参数
参 数
描 述
server
配置属性的链接服务器的名称
option_name
要配置的选项
option_value
选项的新值
在这个技巧中,链接服务器JOEPROD\NODE2的查询超时设置将修改为60秒:
解析
在这个技巧中,链接服务器JOEPROD\NODE2的查询超时限制被修改为60秒。称为server的第一个参数指定了链接服务器的名称。第二个参数option_name指定了要配置的选项,第三个参数option_value配置了新值。
27.1.3 查看链接服务器信息
可以使用系统目录视图sysservers查看SQL Server实例中定义的链接服务器。例如:
它返回:
解析
系统目录视图sysservers可以用来检索关于SQL Server实例中定义的链接服务器的信息。可以从sys.servers查看到的其他选项包括:product、provider、data_source、location、provider_string、catalog、is_linked、is_remote_login_enabled、is_rpc_out_enabled、is_data_access_enabled、is_collation_compatible、use_remote_collation和collation_name。is_linked列在查询中限定只返回链接服务器(不包括本地SQL Server实例设置)。
27.1.4 删除链接服务器
系统存储过程sp_dropserver用来删除链接服务器。sp_dropserver的语法如下:
表27-4描述了这个系统存储过程的参数。
表27-4 sp_dropserver的参数
参 数
描 述
server
从SQL Server实例中删除的链接服务器的名称
droplogins
如果指定droplogins,则在删除链接服务器之前要删除登录名映射(在本章稍后描述)
这个技巧展示了删除链接服务器:
解析
这个技巧展示了使用系统存储过程sp_dropserver从你的SQL Server实例中删除链接服务器。在第二个参数中指定的droplogins选项将在删除链接服务器之前删除既有的登录名映射(我将在下面几个技巧中介绍链接服务器登录)。如果在删除登录之前尝试删除链接服务器,你将得到如下消息:
仍有对服务器'JOEPROD'的远程登录或链接登录。
通过OLE DB访问接口连接远程的数据源。OLE DB由微软开发,是用来提供到各种不同的数据源的一致性访问的一组COM(component object model,组件对象模型)接口。为了建立从SQL Server 2005实例到另一数据源的访问,需要选择适当的OLE DB访问接口。OLE DB访问接口的设计方式决定在分布式查询(SELECT、INSERT、UPDATE或DELETE存储过程执行)中实现何种分布式查询操作。
因此概括的说,链接服务器意思是建立到远程数据源的连接的途径。依赖用来设置链接服务器的OLE DB驱动,可以执行分布式查询来检索数据,或在远程数据源中执行操作。
分布式查询也可以不通过定义链接服务器来运行,例如通过使用T-SQL函数OPENROWSET。除了不通过链接服务器查询远程数据源,在SQL Server 2005增强了OPENROWSET,允许BULK读取ASCII、Unicode以及二进制文件。使用OPENROWSET和BULK,可以从文本文件中读取表状数据,或使用它将ASCII、Unicode或二进制类型文件导入到单个的大数据类型列及单个行中(比如varchar(max)、nvarchar(max)或varbinary(max))。
也是SQL Server 2005中的新特性,微软引入了SYNONYM对象,它允许你通过较短的名称引用长名称的对象。通常在使用长标识符时这是有用的,但在引用了4部分组成的链接服务器名称的分布式查询中,使用较短的名称代替数据源特别有用。
本章包括这些技巧:创建链接服务器、执行分布式查询、使用OPENROWSET和BULK从文本文件中读取以及使用新的SYNONYM对象。
27.1 链接服务器基础
下面一组技巧将展示如何使用链接服务器。特别地,我将展示如何完成下列操作:
l 创建链接服务器连接到另一个SQL Server 2005实例。
l 配置链接服务器的属性。
l 查看SQL Server实例上的配置链接服务器的信息。
l 删除链接服务器。
我将先讨论如何使用系统存储过程sp_addlinkedserver来创建新链接服务器。
27.1.1 为另一SQL Server实例创建链接服务器
链接服务器允许从SQL Server实例中查询外部数据源。外部数据源可以是不同的SQL Server实例,也可以是非SQL Server数据源,比如说Oracle、MS Access、DB2或MS Excel。
使用系统存储过程sp_addlinkedserver来创建链接服务器。语法如下:
表27-1描述了这个系统存储过程的参数。
表27-1 sp_addlinkedserver参数
参 数
描 述
server
链接服务器的本地名称。也允许使用实例名称,例如MYSERVER\SQL1
product_name
OLE DB数据源的产品名。对于SQL Server实例来说,product_name是'SQL Server'
provider_name
这是OLE DB访问接口的唯一可编程标识。当没有指定它时,访问接口名称是SQL Server数据源。SQL Server显式的provider_name是SQLNCLI(Microsoft SQL Native Client OLE DB Provider)。Oracler的是MSDAORA,Oracle 8或更高版本的是OraOLEDB.Oracle。MS Access和MS Excel的是Microsoft.Jet.OLEDB.4.0。IBM DB2的是DB2OLEDB,以及ODBC数据源的是MSDASQL
data_source
这是特定OLE DB访问接口解释的数据源。对于SQL Server,这是SQL Server(servername或servername\instancename)的网络名称。对于Oracle,这是SQL*Net别名。对于MS Access和MSExcel,这是文件的完整路径和名称。对于ODBC数据源,这是系统DSN名称
location
由特定OLE DB访问接口解释的位置
provider_string
OLE DB 访问接口特定的连接字符串。对于ODBC连接,这是ODBC连接字符串。对于MS Excel,这是Excel 5.0
catalog
catalog的定义变化基于OLE DB访问接口的实现。对于SQL Server,这是可选的数据库名称,对于DB2,这个目录是数据库的名称
在多SQL Server实例的网络环境中,链接服务器提供了方便的方式共享SQL Server数据,而不是必须要通过物理地推送或拉回数据和复制架构的方式来实现共享。
提示 在本章中,我讲解了在SQL Server实例之间通信的示例。对于异类的数据源,比如DB2、Access以及Oracle,参数会有很多变化。如果需要更全面的sp_addlinkedserver选项的讲解,请看SQL Server联机丛书中的主题“sp_addlinkedserver (Transact-SQL)”。
连接到异类数据源使用的配置会基于OLE DB访问接口而发生变化。如果你只是连接到不同的SQL Server实例,微软把它变得很简单。在这个示
例中,我展示了创建连接到另一SQL Server实例的链接服务器:
也可以创建连接到SQL Server命名实例的链接服务器,例如:
解析
添加连接到外部数据源的链接服务器允许执行分布式查询(分布式查询将在本章稍后介绍)。当添加SQL Server链接服务器到一个SQL Server实例时,不管它是默认的还是命名的实例,微软都把它变得很简单,只需要server和product_name值。
连接到SQL Server实例的安全性方法是怎样的呢?当创建新的链接服务器时,使用当前用户的登录名安全凭证(SQL或Windows)来链接到链接服务器。也可以创建显示的链接服务器远程登录名映射,稍后会讨论该内容。
27.1.2 配置链接服务器属性
在创建链接服务器之后有许多不同的设置可以用来配置它。表27-2描述了这些设置。
表27-2 链接服务器属性
参 数
描 述
collation compatible
如果你确认SQL Server实例与远程SQL Server拥有相同的排序规则就启用这个设置。由于SQL Server不再需要对数据源之间的字符列执行比较操作,把它们假定为相同的排序规则,这样做可以提升性能
collation name
如果启用了use remote collation并且是非SQL Server的数据源,则collation name指定远程服务器排序规则的名称。这个排序规则名称必须是SQL Server所支持的
connect timeout
指定在超时发生之前到链接服务器的连接会尝试多少秒。如果数值为“0”,sp_ configure的remote query timeout的服务器值用来当作默认值
data access
如果启用,就允许分布式查询访问
lazy schema validation
如果设为true,则架构不会在查询开始时去检测远程表。尽管这样会减少远程查询的负载,但是如果架构发生了变化并且你没有进行架构检测,比如说查询中引用的对象不能与查询命令进行通信,就会生成错误
query timeout
指定查询等待的超时值(秒数)。如果这个值为0,则query wait选项使用sp_configure值
rpc
启用从服务器进行远程过程调用
rpc out
启用远程过程调用到服务器
use remote collation
指定是使用远程服务器排序规则(true)还是本地服务器排序规则(false)
使用系统存储过程sp_serveroption来修改链接服务器属性。语法如下:
表27-3描述了这个系统存储过程的参数。
表27-3 sp_serveroption参数
参 数
描 述
server
配置属性的链接服务器的名称
option_name
要配置的选项
option_value
选项的新值
在这个技巧中,链接服务器JOEPROD\NODE2的查询超时设置将修改为60秒:
解析
在这个技巧中,链接服务器JOEPROD\NODE2的查询超时限制被修改为60秒。称为server的第一个参数指定了链接服务器的名称。第二个参数option_name指定了要配置的选项,第三个参数option_value配置了新值。
27.1.3 查看链接服务器信息
可以使用系统目录视图sysservers查看SQL Server实例中定义的链接服务器。例如:
它返回:
解析
系统目录视图sysservers可以用来检索关于SQL Server实例中定义的链接服务器的信息。可以从sys.servers查看到的其他选项包括:product、provider、data_source、location、provider_string、catalog、is_linked、is_remote_login_enabled、is_rpc_out_enabled、is_data_access_enabled、is_collation_compatible、use_remote_collation和collation_name。is_linked列在查询中限定只返回链接服务器(不包括本地SQL Server实例设置)。
27.1.4 删除链接服务器
系统存储过程sp_dropserver用来删除链接服务器。sp_dropserver的语法如下:
表27-4描述了这个系统存储过程的参数。
表27-4 sp_dropserver的参数
参 数
描 述
server
从SQL Server实例中删除的链接服务器的名称
droplogins
如果指定droplogins,则在删除链接服务器之前要删除登录名映射(在本章稍后描述)
这个技巧展示了删除链接服务器:
解析
这个技巧展示了使用系统存储过程sp_dropserver从你的SQL Server实例中删除链接服务器。在第二个参数中指定的droplogins选项将在删除链接服务器之前删除既有的登录名映射(我将在下面几个技巧中介绍链接服务器登录)。如果在删除登录之前尝试删除链接服务器,你将得到如下消息:
仍有对服务器'JOEPROD'的远程登录或链接登录。