概述和术语
在 MicrosoftSQL Server 2000 中,分布式查询允许SQL Server用户访问基于SQL Server的服务器以外的数据(位于其他运行SQL Server的服务器或是具有OLE DB接口的其他数据源中)。OLE DB提供了统一的方式来访问异类数据源中的列表数据。
在本文中,分布式查询是指任何引用了一个或多个外部OLE DB数据源中表或行集的SELECT、INSERT、UPDATE或DELETE语句。
远程表是指存储于 OLE DB 数据源中并且不在执行查询的SQL Server 所在服务器上的表。一个分布式查询可以访问一个或多个远程表。
OLE DB提供程序类别
根据OLE DB提供程序在SQL Server的分布式查询中的功能,我们将它们划分为如下类别。根据定义,它们并非互相排斥;某种提供程序可能属于一个或多个类别:
SQL 命令提供程序
索引提供程序
简单表提供程序
非SQL 命令提供程序
SQL 命令提供程序
凡是以SQL标准语法(SQL Server 认可)支持 Command对象的提供程序,都属于此类别。下面是 OLE DB 提供程序被SQL Server 视为SQL 命令提供程序的必要条件:
提供程序必须支持 Command 对象及其所有强制 OLE DB 接口:ICommand、ICommandText、IColumnsInfo、ICommandProperties 和 IAccessor。
提供程序支持的SQL 语法必须至少是SQL 子集。提供程序必须通过 DBPROP_SQLSUPPORT 属性来报告语法。
SQL 命令提供程序的示例为:Microsoft OLE DB Provider forSQL Server 和 Microsoft OLE DB Provider for ODBC。
索引提供程序
索引提供程序支持并提供与OLE DB对应的索引,同时还允许基于索引对基本表执行查找。下面是 OLE DB 提供程序被SQL Server 视为索引提供程序的必要条件:
提供程序必须以 TABLES、COLUMNS 和 INDEXES 架构行集支持 IDBSchemaRowset 接口。
提供程序必须支持通过 IOpenRowset 打开索引中的行集(通过指定索引名和相应的基本表名称)。
Index 对象必须支持其所有的强制接口:IRowset、IRowsetIndex、IAccessor、IColumnsInfo、IRowsetInfo 和 IConvertTypes。
对带索引基本表打开的行集(通过使用 IOpenRowset)必须支持 IRowsetLocate 接口,以便根据书签在行上定位。
如果一个OLE DB提供程序满足以上条件,用户可以设置提供程序选项 Index As Access Path,以允许SQL Server 使用提供程序的索引来执行查询。默认情况下,除非该选项已被设置,否则SQL Server 不会尝试使用提供程序的索引。
注意:SQL Server支持多个影响SQL Server访问OLE DB提供程序的方法的选项。可以使用SQL Server 企业管理器中的“链接服务器属性”对话框来设置这些选项。
简单表提供程序
简单表提供程序通过IOpenRowset接口来表现根据基本表打开行集的方式。这些提供程序既不是SQL 命令提供程序也不是索引提供程序;而是SQL Server 分布式查询所能处理的提供程序中最简单的一类。
对于此类提供程序,SQL Server 仅能在分布式查询运行过程执行表扫描操作。
非SQL 命令提供程序
该类提供程序支持 Command对象及其所有强制接口,但不支持SQL Server 认可的SQL 标准语法。
非SQL 命令提供程序的两个示例是:Microsoft OLE DB Provider for Indexing Service 和 Microsoft Windows NT®Active Directory™Service Interfaces (ADSI) OLE DB Provider。
Transact-SQL 子集
如果提供程序支持所需的 OLE DB 接口,下列 Transact-SQL 语句类别都可以用于分布式查询。
除了将远程表作为目的表的 SELECT INTO 语句外,其他所有的 SELECT 语句都可以使用。
如果提供程序支持插入操作所需的接口,INSERT 语句可以用于远程表。有关 INSERT 语句的 OLE DB 要求的详细信息,请查阅本文后面的INSERT语句。
如果提供程序满足 OLE DB 接口在特定表上的要求,UPDATE 和 DELETE 语句也可以用于远程表。有关更新或删除远程表时 OLE DB 接口必须满足的要求和条件,请参阅本文后面的UPDATE和DELETE。
游标支持
如果提供程序支持所需的 OLE DB 功能,则分布式查询支持快照和键集两种游标。分布式查询不支持动态游标。用户请求的分布式查询的动态游标将自动降级为键集游标。
快照游标在游标打开时被写入,而且结果集保持不变;对基本表的更新、插入和删除操作不会反映到游标中。
键集游标在游标打开时被写入,而且结果集在游标的整个生存期中保持不变。但是,如果更新或删除基本表中的行,当访问这些行时,能够在游标中看到变化。如果对基本表的插入操作可能影响游标成员,则这种变化则是不可见的。
如果提供程序满足更新和删除远程表的条件,则可以通过使用分布式查询中定义的游标以及对远程表的引用来更新和删除远程表,例如:table UPDATE | DELETE <远程表> WHERE CURRENT OF <游标名称>。有关详细信息,请参阅本文后面的UPDATE和DELETE 语句。
支持键集游标的要求
如果满足所有 Transact-SQL 语法的条件,而且满足以下两种情况之一,那么在分布式查询中就支持键集游标:
在查询中,OLE DB 提供程序支持所有远程表上的可重用书签。可重用书签可以从给定表的某个行集中隐去,然后用于同一表中的其他行集上。对可重用书签的支持是通过 IDBSchemaRowset 的 TABLES_INFO 架构行集来指定的,方法是将 BOOKMARK_DURABILITY 列设置为 BMK_DURABILITY_INTRANSACTION 或某种更高的持久性。
所有的远程表都通过 IDBSchemaRowset 接口的 INDEXES 行集来列出唯一键。应该存在一个索引项,其中的 UNIQUE 列设置为 VARIANT_TRUE。
包含OpenQuery 函数的分布式查询不支持键集游标。
支持可更新键集游标的要求
通过在分布式查询上定义的键集游标,可以更新或删除远程表,例如:UPDATE | DELETE< 远程表>WHERE CURRENT OF <游标名称>。下面是在分布式查询中允许使用可更新游标的条件:
如果提供程序也满足对远程表进行更新和删除操作的条件,就允许使用可更新游标。有关详细信息,请参阅本文后面的UPDATE 和 DELETE 语句。
所有的可更新键集游标操作必须位于使用可复读或更高的隔离级别的用户定义事务中。此外,提供程序必须以 ITransactionJoin 接口支持分布式事务处理。
OLE DB 提供程序交互阶段
所有分布式查询的执行方案都有六种操作:
建立连接和检索属性操作,指定SQL Server 连接 OLE DB 提供程序的方法以及将用到提供程序的哪些属性。
表名解析和检索元数据操作,指定SQL Server 将远程表名称(指定时使用两种方法之一:基于链接服务器的名称或特殊名称)解析为提供程序中相应数据对象的方法。这也包括SQL Server 为编译和优化分布式查询从提供程序检索的表元数据。
事务管理操作,指定所有与 OLE DB 提供程序的事务相关的交互。
数据类型处理操作,该操作指定在执行分布式查询过程中,当SQL Server从OLE DB提供程序获得数据或向其导出数据时SQL Server 处理 OLE DB 数据类型的方法。
错误处理操作,指定SQL Server 使用从提供程序获得的扩展错误信息的方法。
安全性操作,指定SQL Server 安全性和提供程序安全性的交互方式。
建立连接和检索属性
SQL Server 使用 OPENROWSET 功能支持两种远程数据对象命名协议:基于链接服务器的四段式名称和特殊名称。
基于链接服务器的名称
链接服务器是对OLE DB数据源的抽象。基于链接服务器的名称分为四段:<链接服务器>.<目录>.<架构>.<对象>,其中<链接服务器>是链接服务器的名称。SQL Server 将<链接服务器>视为OLE DB提供程序和连接属性(用于向提供程序标识数据源)的来源。其他三个名称段被OLE DB数据源解释为对特定远程表的标识。
特殊名称
特殊名称是基于 OPENROWSET 或 OPENDATASOURCE 函数的名称。它包括在分布式查询中每次引用远程表时的所有连接信息(包括所使用的 OLE DB 提供程序、用于标识数据源的属性、用户 ID 和密码)。
默认情况下,只允许系统管理员使用特殊名称。要使用基于 OLE DB 提供程序的特殊名称,应将提供程序的 DisallowAdhocAccess 选项设置为 0。
如果使用链接服务器名称,SQL Server 将在链接服务器定义中为 OLE DB 提供程序提取提供程序的名称和初始化属性。如果使用特殊名称,SQL Server 将从 OPENROWSET 函数的参数中提取相同的信息。
有关使用四段式名称建立链接服务器和基于特殊名称的语法的详细说明,请参阅SQL Server Books Online。
连接 OLE DB 提供程序
以下是SQL Server连接OLE DB提供程序时执行的高级步骤。
SQL Server 创建数据源对象。SQL Server使用提供程序的ProgID来建立数据源对象(DSO)的实例。ProgID被指定为链接服务器配置信息的 provider_name 参数,或在使用特殊名称时被指定为 OPENROWSET 函数的第一个参数。 SQL Server 通过 OLE DB 服务组件接口 IDataInitialize 创建提供程序的 DSO 实例。这使服务组件管理器可以在提供程序的本地功能上集成其服务(
文章来源于领测软件测试网 https://www.ltesting.net/
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073