top
Loading...
SQLServer2000分布式查詢:OLEDB連接

概述和術語

在 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 接口:ICommandICommandTextIColumnsInfoICommandPropertiesIAccessor

  • 提供程序支持的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 對象必須支持其所有的強制接口:IRowsetIRowsetIndexIAccessorIColumnsInfoIRowsetInfoIConvertTypes

  • 對帶索引基本表打開的行集(通過使用 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 DirectoryService 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提供程序時執行的高級步驟。

  1. SQL Server 創建數據源對象。SQL Server使用提供程序的ProgID來建立數據源對象(DSO)的實例。ProgID被指定為鏈接服務器配置信息的 provider_name 參數,或在使用特殊名稱時被指定為 OPENROWSET 函數的第一個參數。SQL Server 通過 OLE DB 服務組件接口 IDataInitialize 創建提供程序的 DSO 實例。這使服務組件管理器可以在提供程序的本地功能上集成其服務(例如回滾和支持更新)。另外,通過 IDataInitialize 建立提供程序的實例還允許 OLE DB 服務組件為它們提供連接池,這樣可減少連接和初始化的開銷。

    在SQL Server 的進程中還是在一個獨立的進程中創建給定提供程序的實例,可以根據需要進行配置。在獨立的進程中創建實例能夠保護SQL Server 進程免受提供程序故障的影響。但同時還存在著與在SQL Server 進程外組織 OLE DB 調用有關的性能開銷。通過設置提供程序選項 Allow In Process,可以將提供程序配置為進程內實例或進程外實例。有關設置提供程序選項的詳細信息,請參閱SQL Server Books Online。要學習更多有關 OLE DB 服務組件和建立會話池的知識,請參閱提供程序的 OLE DB 文檔。
  2. 初始化數據源。

    創建 DSO 之后,如果服務器的配置選項remotelogin timeout 大于 0,IDBProperties 接口將設置 DBPROP_INIT_TIMEOUT 初始化屬性;該屬性為必需的屬性。

    如果在鏈接服務器定義或 OPENROWSET 函數的第二個參數中指定或隱含了下列屬性,則它們將被設置:
    • DBPROP_INIT_PROVIDERSTRING

    • DBPROP_INIT_DATASOURCE

    • DBPROP_INIT_LOCATION

    • DBPROP_INIT_CATALOG

    • DBPROP_AUTH_USERID

    • DBPROP_AUTH_PASSWORD
    設置了這些屬性后,將調用 IDBInitialize::Initialize
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗