热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mssqlSQL分布式查询处理方法

SQLServer不允许使用OPENROWSET和OPENDATASOURCE进行即席分布式查询。此选项设置为1时,SQLServer允许进行即席访问。如果此选项未设置或设置为0,则SQLServer不允许进行即席访问。即席分布式查询使用OPENROWSET和OPENDATASOURCE函数连接到使用OLEDB的远程数据源。OPE
SQL Server 不允许使用 OPENROWSET 和 OPENDATASOURCE 进行即席分布式查询。此选项设置

为 1 时,SQL Server 允许进行即席访问。如果此选项未设置或设置为 0,则 SQL Server

不允许进行即席访问。

即席分布式查询使用 OPENROWSET 和 OPENDATASOURCE 函数连接到使用 OLE DB 的远程数据

源。OPENROWSET 和 OPENDATASOURCE 只应在引用不常访问的 OLE DB 数据源时使用。对于将

要经常访问的数据源,应定义链接服务器。

安全说明:
允许使用临时名称意味着到 SQL Server 的任何经过身份验证的登录名均可访问该访问接口

。SQL Server 管理员应对任何本地登录名都能安全访问的访问接口启用此功能。有关详细信

息,请参阅访问外部数据中的 DisallowAdhocAccess 选项。

示例
下面的示例启用即席分布式查询,然后使用 OPENROWSET 函数查询名为 Seattle1 的服务器


sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO

SELECT a.*
FROM OPENROWSET('SQLNCLI', 'Server=Seattle1;Trusted_COnnection=yes;',
'SELECT GroupName, Name, DepartmentID
FROM AdventureWorks2008R2.HumanResources.Department
ORDER BY GroupName, Name') AS a;
GO


在 Microsoft SQL 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 for SQL 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 函数的参

数中提取相同的信息。

推荐阅读
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • 像跟踪分布式服务调用那样跟踪Go函数调用链 | Gopher Daily (2020.12.07) ʕ◔ϖ◔ʔ
    每日一谚:“Acacheisjustamemoryleakyouhaven’tmetyet.”—Mr.RogersGo技术专栏“改善Go语⾔编程质量的50个有效实践” ... [详细]
  • 14亿人的大项目,腾讯云数据库拿下!
    全国人 ... [详细]
  • 【技术分享】一个 ELF 蠕虫分析
    【技术分享】一个 ELF 蠕虫分析 ... [详细]
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
  • 问题描述:域名已经备案,我全部都有,也在后台配置了,但是手机预览,还是请求失败,PC端是可以请求 ... [详细]
  • C++程序员视角下的Rust语言
    自上世纪80年代初问世以来,C就是一门非常重要的系统级编程语言。到目前为止,仍然在很多注重性能、实时性、偏硬件等领域发挥着重要的作用。C和C一样&#x ... [详细]
  • angular2/4 使用[innerHTML]时样式不生效
    首先默认情况下,innerHTML会被认为是不安全的,因此屏蔽掉了样式。不生效场景我们通过innerHTML引入一段html格式的文本, ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
author-avatar
越野之族_205
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有