SQL Server 2000 Analysis Services 支持許多用於 OLAP 的新的結構功能、安全功能和管理功能選項 — 包括鏈接的多維數據集、計算的單元、命名集和分布式分區的多維數據集。Analysis Services 還包含一些用於開發人員的新功能,例如,通過鑽取浏覽明細數據行的功能,以及允許用戶通過使用操作來作用於多維數據集內的單元的功能。在這兩種情況下,這些特性所提供的功能在過去即使能夠實現,那麼在實現時也是非常困難的。Russ Whitney 在 Mastering OLAP 專欄的 "Analysis Services Drillthrough"(2000 年 6 月發表,InstantDoc ID 85301)一文和 "Analysis Services Actions"(2000 年 7 月發表,InstantDoc ID 8758)一文中,討論了如何將這些功能用於 ADO MD。在本文中,我將說明開發人員如何通過添加鑽取支持和實現操作,來利用用於 Web 應用程序的 Analysis Services。
實現鑽取
在 Microsoft 發布了 SQL Server 7.0 OLAP 服務後,用戶使用最頻繁的功能就是檢索用於計算特定單元的值的基礎數據的功能。舉例來說,如果您需要知道某個單元包括哪些客戶或哪些產品,該功能就顯得非常有用。就其本質而言,OLAP 在實現聚合事實數據表的行的功能(這是它的關鍵優勢)的同時也對明細數據行進行了抽象化,並因此使明細數據行的查找變得很困難。在發布 Analysis Services 之前,面臨這種挑戰的開發人員不得不在多維數據集成員和關系數據庫之間實現元數據映射層(它包含星型架構或雪花型架構)。訪問單元時,代碼既要讀取多維數據集成員信息,又要讀取應用於查詢的任何篩選器。然後,代碼必須生成 SQL 查詢,以便聯接關系數據庫中的多個表、執行查詢並返回結果集。編寫可正確地以這種方式訪問單元的代碼並不輕松。但有了 Analysis Services 以後,您根本就無需編寫或維護這種代碼。
Analysis Services 包含了用來實現鑽取的代碼;第 38 頁的sqlserver/art/OLAPforDevelopersFigure_01.gif" target="_blank">圖 1 顯示了 Analysis Services 如何完成鑽取的高級視圖。客戶端應用程序執行從本地透視表服務傳遞到 OLAP 服務器的 MDX 語句。請記住,透視表服務是 OLE DB 提供程序,它提供緩存、本地多維數據表處理以及到 Analysis (OLAP) 服務器的連接。然後,OLAP 服務器使用多維數據集中的配置選項和安全設置來創建 SQL 語句,並將它發送到保存明細數據的關系數據庫。SQL 語句再通過 OLAP 服務器和透視表服務將返回的 OLE DB 行集發回到客戶端應用程序。通常,客戶端通過 ADO Recordset 對象訪問數據。
要實現鑽取功能,您必須既要執行管理任務,又要執行應用程序特定的任務。從管理員的角度來說,第一個任務是啟用多維數據集的鑽取功能。管理員控制多維數據集鑽取功能的啟用是至關重要的,因為單元常常包含來自數千行甚至數百萬行的數據,因此讓所有用戶不受限制地查詢此數據可能導致網絡瓶頸。要對多維數據集啟用鑽取功能,請啟動“多維數據集編輯器”,然後依次選擇“工具”和“鑽取選項”。在得到的“多維數據集鑽取選項”對話框中,只需選中“啟用鑽取”復選框,如sqlserver/art/OLAPforDevelopersFigure_02.gif" target="_blank">圖 2 所示。Analysis Services 支持常規多維數據集、虛擬多維數據集或鏈接多維數據集的鑽取,但 Analysis Services 不允許您對某類單元使用鑽取,這類單元具有基於計算的成員單元或自定義成員公式的值。
請注意,在圖 2 所示的情況中,您必須啟用鑽取,並且要使列的列表包含來自架構中的事實數據表和維數表的所有列。在此示例中,多維數據集的名稱是 Enrollment,利用該多維數據集,可以針對 Quilogy 技術培訓課程中的學生注冊情況生成報表。根據您在該對話框中所選擇的列,Analysis Services 會在查詢基礎數據時聯接適當的表。圖 2 中的對話框還包含“篩選”選項卡,該選項卡可包含用於限制結果集中的行數的 WHERE 子句。但是,由鑽取動態生成的 WHERE 子句除外。
除了以多維數據集級別啟用鑽取,您還可以對包含一個以上分區的多維數據集中的每個分區的選項進行修改。您可以通過在“磁盤分區向導”(要訪問“磁盤分區向導”,請右擊某個分區,
然後從上下文菜單中選擇“編輯”)中單擊“高級設置”按鈕和“鑽取選項”來訪問與圖 2 中的對話框相類似的對話框。您可以在顯示的“分區鑽取選項”對話框中,更改從該分區創建鑽取數據時所要使用的列和篩選器。可對各個分區設置鑽取選項的功能意味著,如果您對聚合一個以上分區中數據的單元執行鑽取操作,每個分區將返回其自己的結果集,而且那些結果集中的列可以互不相同。應用程序開發人員需要意識到這一行為,這樣他們就可以根據需要來顯示結果。管理員的下一個任務是配置鑽取安全設置,為此,您需要使用“多維數據集角色管理器”對話框,針對您要向其授予訪問權限的角色單擊“鑽取”設置。每個角色都有一個名為“允許鑽取”的安全設置,您可以選擇該設置,以便允許角色執行使用鑽取操作的查詢。
用於開發人員的鑽取
當您啟用鑽取並配置安全設置之後,即可為應用程序實現鑽取。為了說明實現鑽取所需的步驟,我向 Active Server Pages (ASP) 頁面添加了鑽取功能,該頁面基於隨 Analysis Services 提供的 ASPADOComplex.ASP 頁面。此頁面執行一個顯示 Quilogy 地點、在每個地點登記的學生天數和收入金額的查詢(當然數據都是虛構的),如sqlserver/art/OLAPforDevelopersFigure_03.gif" target="_blank">圖 3 所示。
在基於 Web 的應用程序中,在 UI 中提供鑽取支持的最自然的方式是將超級鏈接放在單元上,以便允許用戶單擊該鏈接來顯示明細數據。請注意,圖 3 中的每個單元都包含一個超級鏈接。要生成超級鏈接,可以修改下面的語句,以便包括或更換可輸出單元值的 ASPADOComplex.ASP 代碼:
Response.Write " " _ & cst(k, j).FormattedValue & ""
請注意,超級鏈接調用 Drillthrough.asp 頁面,通過查詢字符串向該頁面傳遞當前列和行成員名稱、多維數據集以及 MDX 語句為生成單元集而所使用的任何 WHERE 子句。ASPADOComplex.asp 頁面中的代碼在 ASP 頁面中創建表行和列標頭時,將行名和列名作為填充的數組進行存儲。下面的代碼從 MDX 語句提取 WHERE 子句,然後將值發送到 Drillthrough.ASP 頁面,sqlmag02/Html/OLAPforDevelopersListing_01.txt" target="_blank">清單 1顯示了該頁面。
intPos = Instr(Session("MDXQuery"),"WHERE") If IntPos > 0 Then strWhere = Mid(Session("MDXQuery"),intPos)
Drillthrough.ASP 創建一個包括 DRILLT
DRILLTHROUGH MAXROWS 5000 SELECT {[Measures].[Days]} ON COLUMNS, {[Location].[All Location].[N].[Cincinnati]}
ON ROWS FROM Enrollment
為了執行 MDX 語句,調用 Connection 對象的 Execute 方法。此示例將 ADOMD.Catalog 對象的 ActiveConnection 屬性設置為服務器和目錄名稱,它們是用戶的會話在調用 Execute 之前就已經包含的名稱。在 Web 應用程序中,Execute 方法的返回值是 ADO 記錄集,而不是像 ADO MD 中那樣的單元集。因為 Web 應用程序中的鑽取可以返回多個記錄集,所以您應該編寫循環中的代碼,以檢索結果,並將結果格式化為 Html 表,如清單 1 中的標注 B 所示。
記錄集對象的 NextRecordset 方法返回為其他分區創建的記錄集,或者,如果不存在其他記錄集,則什麼也不返回。如果您確信其他分區的記錄集包含相同的列,可以使用 ASP 代碼合並結果。不過,在此示例中,PrintTable 過程只將一個附加的 Html 表放在返回用戶的頁面上。sqlserver/art/OLAPforDevelopersFigure_04.gif" target="_blank">圖 4(第 40 頁)顯示了得到的明細數據。
實現操作
開發人員可以利用的第二個 Analysis Services 功能是操作。與鑽取一樣,操作是連接多維數據集與附加數據的紐帶;與鑽取不同的是,操作非常靈活,Analysis Services 並不使它們只限於將單元鏈接到生成它的關系數據。您可以從名稱看出來,操作允許用戶作用於分析,方法是為他們提供用來以多維數據集、維數、級別、成員或單元級別處理數據的選項。基本上,利用操作,用戶可以啟動一個解決問題或提供有關多維數據集中的數據的更多信息的過程。例如,假設 Quilogy 的銷售人員和市場營銷人員可以訪問 Enrollment 多維數據集。當它們通過 ASP 應用程序浏覽多維數據集數據時,一個可能的操作是單擊超級鏈接,以便查看某個課程的教學大綱。教學大綱可能會使他們更好地理解課程的內容,以及它是如何關聯到多維數據集中明顯的銷售趨勢上的。您可以通過以下方法實現此示例:以多維數據集級別創建 URL 操作來提供課程信息。sqlmag02/Html/olapfordevelopers_table1.ASP" target="_blank">表 1顯示了 Analysis Services 中可用的操作類型以及它們的一些可能的用法。與鑽取一樣,實現操作需要兩個步驟。首先,從管理員的角度來看,您必須創建操作;然後,從開發人員的角度來看,您可以修改應用程序,使應用程序能夠識別操作。
要創建操作,可使用多維數據集編輯器。右擊多維數據集的 Actions 文件夾來調用 Action Wizard。該向導將帶領您完成幾個步驟,第一個步驟是確定操作的目標(即整個多維數據集、某個特定級別、維數、單個單元或命名集)。如果您選擇一個維數或某個特定級別,則您還需要確定維數或級別,並指出當用戶單擊標題或實際維數或級別時操作是否可用。在該示例中,Quilogy Education 多維數據集包含一個名為 Course 的維數,它包含 Vendor Name、Product Name 和 CourseNum 級別。CourseNum 標識 Quilogy 提供的課程。例如,微軟官方課程 (Microsoft Official Curriculum, MOC) 的課程編號是 2072。選擇級別後,該向導會顯示您要從中進行選擇的操作類型下拉列表。在此示例中,您希望創建一個 URL 操作。
下一個向導屏幕允許您定義返回客戶端應用程序的操作語法,該語法隨後用於啟動該操作。在此示例中,您需要將操作語法格式化為 URL。此向導屏幕包含一個調用 MDX 生成器的按鈕,這樣您就可以將數據從多維數據集合並到操作語法中。因為在用戶單擊某個課程編號時會啟動此操作,所以,得到的 URL 必須結合課程編號,以便建立到課程教學大綱的鏈接。因此,您需要選擇維數,並使用 CurrentMember 函數和 Name 屬性返回單擊的課程編號。
"http://www.quilogy.com/courses/" + [Course].CurrentMember.Name + ".htm"
然後,您可以為操作命名,操作將出現在 Actions 文件夾中。
用於開發人員的操作
將操作添加到多維數據集後,開發人員方面有兩個主要任務:首先,您必須創建一個接口,這樣,當操作可用時用戶就可以識別,其次,您必須讓用戶調用操作。對於此示例,我修改了前面的 ASPADOComplex.asp 頁面,以便使它能夠識別操作。首先,ASP 頁面必須查詢多維數據集,以確定某個特定成員是否有與其相關聯的操作。
您可以使用 ADO Connection 對象的 OpenSchema 方法來執行此功能。此方法接受一個確定要返回的行集類型的常量,以及一個指定服務器用來創建行集的限制的數組。Analysis Services 通過將常量 adSchemaActions 添加到 OLE DB 規范,然後將它作為第一個參數傳遞到 OpenSchema 來擴展該規范。返回的行集(稱為 MDSCHEMA_ACTIONS 行集)包含每個操作的一行,並包括sqlmag02/Html/olapfordevelopers_table2.ASP" target="_blank">表 2 顯示的列。OpenSchema 的第二個參數是一個數組,它定義了一組施加在表 2 中的列上的限制。表 2 還顯示限制數組的順序,以及該參數是否可選。
接下來,您需要一個 UI 提示,這樣,當操作可用時,用戶就可以識別。為了創建該提示,我向 ASP 頁面添加了服務器端的 DisplayURLAction 過程和相關常量,如第 42 頁的sqlmag02/Html/OLAPforDevelopersListing_02.txt" target="_blank">清單 2 所示。請注意,該過程首先執行 OpenSchema,如清單 2 中的標注 A 所示,以便使用 Array 函數來傳遞 adSchemaActions 常量和限制集。在此示例中,數組指定 Enrollment 多維數據集(第三個參數);URL 操作類型(第五個參數);要查詢操作的成員,該成員傳遞到 DisplayURLAction 過程(第六個參數);操作的范圍(第七個參數)— 在此示例中,操作是成員級別的。請注意,您可以使用空字符串 (" ") 來傳遞可選參數。
如果 OpenSchema 查找操作,則 DisplayURLAction 過程會依靠動態 HTML (DHtml) 來創建映像標記,如清單 2 中的標注 B 所示。映像標記顯示一個可見的 UI 提示(一個映像),以及一個針對為成員定義的每個 URL 操作包含一行的表(最初是隱藏的),如清單 2 中的標注 C 所示。此外,清單 2 中的標注 B 顯示,映像標記的 onClick 屬性被設置為調用一個名為 ShowActions 的客戶端腳本過程。第 42 頁的sqlmag02/Html/OLAPforDevelopersListing_03.ASP" target="_blank">清單 3 顯示的 ShowActions 被傳遞給該表的元素 ID,以便它可以在 block 和 none 之間切換顯示屬性。於是,當用戶單擊映像時,ShowActions 根據設置顯示或隱藏該成員的操作列表。表的類屬性被設
您正在看的SQLserver教程是:用於開發人員的 OLAP。置為 clsActionMenu,該屬性將游標類型設置為 hand,以便提供一個用戶可以通過單擊來獲取操作菜單的可見提示,如清單 2 中的標注 C 所示。表中的每一行均包含一列,該列顯示從行集合返回的 URL 操作,如清單 2 中的標注 C 所示。
該表的 CONTENT 列包含管理員定義的、當多維數據集生成操作時動態創建的 URL。ACTION_NAME 列包含操作的名稱,在此示例中名稱是 Syllabus。該列的 onClick 屬性在清單 2 中的標注 C 中進行設置,以便運行客戶端 InvokeURLAction 過程。當用戶單擊操作時,InvokeURLAction 過程使用 Document Object Model (DOM) 窗口對象的 Open 方法在一個單獨的窗口中打開 URL。
剩下的唯一任務是,將調用定位到 DisplayURLAction。ASPADOComplex.asp 頁面包含重復 MDX 查詢在單元集中生成的軸的循環。當行標頭和列標頭的標題輸出到 ASPADOComplex.ASP 頁面時,下面的語句調用具有成員的 UniqueName 的 DisplayURLAction 過程:
Call DisplayURLAction(cst.Axes(1).Positions(j) .Members(h).UniqueName)
如果 DisplayURLAction 找到了操作,則該過程會將它們的映像添加到 Html 流,並將該流發送到客戶端。得到的頁面顯示 MDX 查詢的結果,該查詢將 Course- Num 成員與為課程 2072 激活的操作一起使用,如sqlserver/art/OLAPforDevelopersFigure_05.gif" target="_blank">圖 5 所示。請注意,每個課程編號正右側的圖標是 URL 操作對此成員來說為存在的可見提示。
新的維數
通過將鑽取支持和操作添加到 OLAP 客戶端應用程序,您可以為用戶提供信息的全新維度。Analysis Services 減少了開發人員以前為 OLAP 服務提供這些選項所需的大量工作。讓我們來看看您怎樣才能將鑽取和操作集成到 Web 應用程序。如果您是要求 Microsoft 添加這些功能的許多開發人員中的一個,我就不必再重復這個建議了。