链接服务器
对于有的数据库管理员来说,可能以前没接触过链接服务器,这不用担心。只要从如下几个方面去学习,就能够对链接服务器有一个全面的认识,并顺利在企业中进行部署。
一、 了解数据源
通常,链接服务器用于处理分布式查询。当客户端应用程序通过链接服务器执行分布式查询时,SQL Server 将分析命令并向 OLE DB 发送请求。行集请求的形式可以是对该访问接口执行查询或从该访问接口打开基表。
如上图所示,客户端需要访问数据,这个数据存储的位置或者格式就叫做数据源。但是由于数据存储的格式多种多样,如果访问不同格式的数据,客户端需要采用不同的应用程序,显然会非常的麻烦。为此在客户端与数据源之间,就有了数据库引擎和数据库接口。在SQLServer2008链接服务器中,提供了“OLEDB访问接口”和“OLEDB数据源”接口。一般来说,“OLE DB 访问接口”是管理特定数据源并与其交互的 DLL。“OLE DB 数据源”标识可通过 OLE DB 访问的特定数据库。虽然通过链接服务器定义查询的数据源通常是数据库,但 OLE DB 访问接口对各种文件和文件格式仍可用。这些文件和文件格式包括文本文件、电子表格数据和全文内容搜索的结果。
所以SQLServer2008链接数据器有时候更像是一个数据源文件管理的平台。其可以跟各种各样的数据源文件打交道,可以对远程服务器上的数据源文件执行相关的命令。为此企业的信息化应用中,如果包含了多种数据源文件,如即有SQL Server数据库、Oracle数据库,或者早期应用的Access数据库、文本文件等等。有了链接服务器之后,可以免去转换的麻烦。而直接通过链接服务器来访问这些数据源文件。可以将SQL Server链接服务器当作一个平台,统一来管理各种各样的数据源文件。
二、 提高链接服务器的访问安全
无论采取何种方式来访问数据源文件,安全都是至关重要的。特别是对于一些敏感的数据与行业,如化工、金融企业等等,对于数据访问的安全都提出了比较严格的要求。
如上图所示,从客户端到链接服务器,再从链接服务器到数据源文件,中间有很多可以攻击的环节。那么链接服务器有没有提供比较高的安全机制,来保障这个远程访问的安全呢?答案是肯定的。
在SQLServer2008中,其提出了一种比较新的安全机制,即登录名映射。如上图所示,当客户端通过链接服务器访问数据源文件时,发送服务器必须提供登录名与密码以辨别自己的身份并进行链接。链接服务器在这个过程中采用了登录名映射的安全机制。所谓链接服务器登录名映射指的是为特定的链接服务器和本地登录名建立远程登录名和远程密码。这说起来比较复杂,不过通过实例的话可以理解的更加清楚。如现在链接服务器需要连接到远程的Access数据库进行相关的操作。在链接之前,管理员需要先通过使用存储过程来添加登录名映射。如链接服务器上有一个用户名admin1,那么可以为这个用户名建立一个admin2的映射。当用户以本地登录名admin1访问远程数据文件的时候,在网络上传输的用户名是admin2,而不是admin1。虽然这个登录名映射的工作原理比较简单,但是却能够极大的提高链接服务器访问数据的安全性。绝大部分数据库管理员都建议通过这个登录名映射机制来提高远程访问数据的安全。
例如:使用远程密码"my pwd"为链接服务器 S1 建立了一个从本地登录 U1 到远程登录 U2 的映射。如果本地登录 U1 执行分布式查询来访问链接服务器 S1 中存储的表,当 SQL Server 连接到链接服务器 S1 时,U2 和 my pwd 将作为用户 ID 和密码传递到该服务器。
三、 链接服务器的主要应用
链接服务器配置使 SQL Server 可以对远程服务器上的 OLE DB 数据源执行命令。链接服务器具有以下优点:
访问远程服务器。
能够对企业内的异类数据源发出分布式查询、更新、命令和事务。
能够以相似的方式确定不同的数据源。
不过个人认为,链接服务器在企业中的应用主要有两种。
一是可以通过链接服务器来实现分布式查询。也就是说,企业中可能同时有多台SQL Server服务器,来实现负载均衡的功能。此时可以通过数据库链接服务器将企业内部的多台链接服务器合并起来,以实现分布式查询。可以说这是在SQL Server环境下实现分布式查询的最经典的配置。虽然还可以通过其他的方式来实现分布式查询,如通过复制等等。但是采用其他的技术都没有采用链接服务器那样来的灵活、易于管理。笔者相信,大部分数据库管理员都有与笔者相同的感觉。
二是通过链接服务器来访问不同的数据源文件。企业的信息化建设有一个逐步发展的过程。一开始可能执行的信息化管理比较简单,没有采用比较专业的数据库。如有不少简单的信息化管理系统,采用的是Excle表格或者文本文件作为数据源的载体。他们跟企业后来采用的正规数据库可能会格格不入。此时数据库管理员就会遇到集成的问题。让各个数据源相对独立、各自为政,还是把他们集成起来呢?如果将其他的数据源文件全部转换为数据库文件,会有一定的难度与工作量。此时就可以通过链接服务器将多个数据源文件进行统一管理。也就是说,用户在通过客户端进行访问的时候,是感觉不到数据源有所不同。用点专业的术语,就是说数据源文件对于终端用户来说是透明的,主要通过链接服务器来判断数据源的格式并按照一定的格式进行转换。
四、管理链接服务器定义
设置链接服务器时,请在 SQL Server 中注册连接信息和数据源信息。完成注册后,可以用单个逻辑名称来引用该数据源。
可以使用存储过程和目录视图来管理链接服务器定义:
通过执行 sp_addlinkedserver 创建链接服务器定义。
通过对 sys.servers 系统目录视图执行查询,查看有关在 SQL Server 的特定实例中定义的链接服务器的信息。
通过执行 sp_dropserver 删除链接服务器定义。还可以使用此存储过程删除远程服务器。
还可以使用 SQL Server Management Studio 来定义链接服务器。在对象资源管理器中,右键单击“服务器对象”,选择“新建”,再选择“链接服务器”。通过右键单击链接服务器名称并选择“删除”,可以删除链接服务器定义。
对链接服务器执行分布式查询时,请对每个要查询的数据源指定由四个部分组成的完全限定的表名。此由四个部分组成的名称的格式应该是
linked_server_name.catalog.schema.object_name。
实例:链接另一个SQL Server数据库
这个界面是登录映射,就是将本机的sa 和密码 映射为远程的sa和密码,不是本地用户的密码。但不一定非得是sa用户。如果没有指定登录的话,也可以“使用此安全上下文件建立连接”。
使用命令如下:
sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]
[ , [ @provider= ] 'provider_name' ]
[ , [ @datasrc= ] 'data_source' ]
[ , [ @location= ] 'location' ]
[ , [ @provstr= ] 'provider_string' ]
[ , [ @catalog= ] 'catalog' ]
说明: 可以参考一下联机丛书
[ @server = ] 'server' 要创建的链接服务器的名称。
[ @srvproduct = ] 'product_name' 要添加为链接服务器的 OLE DB 数据源的产品名称。product_name 的数据类型为 nvarchar(128),默认值为 NULL。如果为 SQL Server,则不必指定 provider_name、data_source、location、provider_string 和 catalog。
[ @provider = ] 'provider_name' 与此数据源对应的 OLE DB 访问接口的唯一编程标识符 (PROGID)。对于当前计算机中安装的指定 OLE DB 访问接口,provider_name 必须唯一。provider_name 的数据类型为 nvarchar(128),默认值为 NULL;但如果忽略 provider_name,则使用 SQLNCLI。SQLNCLI 是 SQL 本机 OLE DB 访问接口。
[ @datasrc = ] 'data_source' 由 OLE DB 访问接口解释的数据源的名称。
[ @location = ] 'location' 由 OLE DB 访问接口解释的数据库的位置。
[ @provstr = ] 'provider_string' OLE DB 访问接口特定的连接字符串,它可标识唯一的数据源。
[ @catalog = ] 'catalog' 与 OLE DB 访问接口建立连接时所使用的目录。
实例:链接SQL Server
第一步:建立链接服务器:
sp_addlinkedserver @server='192.168.137.22',@srvproduct='SQL Server'
如果链接的是SQL Server默认实例,则其他的参数可以省略,如果是命名实例,则:@datasrc='服务器名\实例名'
第二步:建立登录:
sp_addlinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname'
[ , [ @useself = ] 'useself' ]
[ , [ @locallogin = ] 'locallogin' ]
[ , [ @rmtuser = ] 'rmtuser' ]
[ , [ @rmtpassword = ] 'rmtpassword' ]
当用户登录到本地服务器并执行分布式查询,以访问链接服务器上的表时,本地服务器必须登录链接服务器上,代表该用户访问该表。使用 sp_addlinkedsrvlogin 来指定本地服务器用于登录链接服务器的登录凭据。
说明:
[ @rmtsrvname = ] 'rmtsrvname' 应用登录映射的链接服务器的名称。
[ @useself = ] 'useself' 确定用于连接远程服务器的登录名。值为 true 时指定登录使用自己的凭据连接 rmtsrvname,忽略 rmtuser 和 rmtpassword 参数。false 指定使用 rmtuser 和 rmtpassword 参数连接指定 locallogin 的 rmtsrvname。
[ @locallogin = ] 'locallogin' 本地服务器上的登录。
[ @rmtuser = ] 'rmtuser' 当 useself 为 false 时,表示用于连接 rmtsrvname 的用户名。
[ @rmtpassword = ] 'rmtpassword' 与 rmtuser 关联的密码。
代码如下:
exec sp_addlinkedserver '192.168.137.22','SQL Server'
exec sp_addlinkedsrvlogin '192.168.137.22','false','sa','sa','nieh'
实例:链接本地ACCESS数据库,将access文件存放在本机的c:\nieh.mdb
建立过程如下图所示:
然后测试:
由于 Access 数据库没有目录和架构名称,所以需要使用服务器名...表名
如:select * from [192.168.137.10]...client
实例:使用命令链接本机Access数据库,同上
sp_addlinkedserver '链接服务器名', '产品名', 'Microsoft.Jet.OLEDB.4.0', 'Access数据库路径及文件名'
sp_addlinkedserver @server = N'192.168.137.10', @srvproduct=N'Access',
@provider=N'Microsoft.Jet.OLEDB.4.0', @datasrc=N'c:\nieh.mdb'
sp_addlinkedsrvlogin @rmtsrvname = N'192.168.137.10', @locallogin = NULL ,
@useself = N'False'
删除 链接服务器
EXEC sp_dropserver @server=N'192.168.137.10', @droplogins='droplogins'
GO
实例:如果Access有密码
第一步,给Access加密
独占方式打开文件:
点击:打开 之后,再如下图操作;
设置密码后,关闭即可!在此我的密码设置为123
第二步,创建链接服务器
如果通过命令,则如下所示:
sp_addlinkedserver @server = N'srv_lnk', @srvproduct=N'Access',
@provider=N'Microsoft.Jet.OLEDB.4.0', @datasrc=N'c:\nieh.mdb',@provstr=';pwd=123'
sp_addlinkedsrvlogin @rmtsrvname = N'srv_lnk', @locallogin = NULL ,
@useself = N'False'
select * from srv_lnk...client --查看
sp_dropserver '192.168.137.10','droplogins' --删除
实例:链接远程Access数据库,即Access文件不在本机
可以将对方的access文件所在目录,映射为本地的一个网络磁盘。即可解决。
实例: 链接 本地Excel 文件
如下图操作:
测试:
select * from exl...sheet1$
关于命令方式,在此不再介绍了。
五、 链接服务器部署的注意事项
链接服务器的很大一个应用主要在于处理分布式查询。当客户端应用程序通过链接服务器执行分布式查询的时候,SQL Server数据库引擎将会分析相关的命令,然后才会向OLE DB接口发送请求。然后OLE DB接口再去打开对应的基表,查询相关的结果。在这里需要注意一点,为了让查询出来的结果能够正确的通过链接服务器返回到客户端那边,这里有一个技术上的限制条件,即数据源的OLE DB访问接口必须与SQL Server实例位于同一服务器上。也就是说,OLEDB访问接口与SQL Server实例不能够分开在不同的服务器上,否则的话,就容易造成一些难以预料的情况。
其次需要注意的是,在SQL Server2008链接服务器中,除了可以使用微软自带的OLE DB接口之外,还可以采用第三方的访问接口。不过需要提醒的是,此时运行SQL Server服务的帐户必须具有对安装访问接口的目录以及其所有子目录的读取权限和执行权限。这主要是因为我们在部署SQL Server数据库的时候,出于安全与管理的需要,往往会为其单独的设置一个用户,而不是用操作系统的管理员用户。如果用户在部署第三方访问接口的时候,采用的是管理员帐户或者其他的非Sql Server帐户,那么就必须要注意,让运行SQL Server服务的帐户具有安装有访问接口的目录以及所有子目录的读取权限和执行权限。往往需要管理员帐户或者部署第三方访问接口的帐户对其进行授权。否则的话,链接服务器可能无法正常访问特定的数据源。