Microsoft SQL Server Analysis Services提供許多內建函數來搭配多維度運算式使用, (MDX) 和資料採礦延伸模組 (DMX) 語言,其設計目的是要完成從標準統計計算到周遊階層中成員的所有專案。 但是,就如同其他複雜且強固的產品一樣,總是有進一步擴充產品功能的需求。
因此,Analysis Services 可讓您將元件新增至 Analysis Services 實例或資料庫。 組件可讓您使用任何 Common Language Runtime (CLR) 語言 (例如 Microsoft Visual Basic .NET 或 Microsoft Visual C#) 來建立外部使用者自訂函數。 您也可以使用元件物件模型 (COM) 自動化語言 (例如 Microsoft Visual Basic 或 Microsoft Visual C++)。
重要
COM 組件可能會造成安全性風險。 由於此風險和其他考慮,SQL SERVER 2008 Analysis Services (SSAS) 中已淘汰 COM 元件。 在未來的版本中,可能不再支援 COM 組件。
組件可以讓您延伸 MDX 和 DMX 的商務功能。 您可以將您想要的功能建置到程式庫中,例如動態連結程式庫 (DLL) ,並將程式庫新增為 Analysis Services 實例或 Analysis Services 資料庫的元件。 程式庫中的公用方法便公開給 MDX 和 DMX 運算式、程序、計算、動作,以及用戶端應用程式,作為使用者自訂函數。
具有新程序和函數的組件可加入到伺服器。 您可以使用組件來增強或加入伺服器未提供的自訂功能。 藉由使用組件,便可以將新的功能加入多維度運算式 (MDX)、資料採礦延伸模組 (DMX) 或預存程序。 組件會從自訂應用程式執行所在的位置載入,而且會將組件二進位檔案的複本連同資料庫資料儲存在伺服器中。 當移除組件時,複製的組件也會從伺服器中移除。
組件可以有兩種不同類型:COM 和 CLR。 CLR 組件是使用 .NET Framework 程式設計語言 (如 C#、Visual Basic .NET、Managed C++) 開發的組件。 COM 組件是必須在伺服器上註冊的 COM 程式庫。
組件可加入 Server 或 Database 物件。 伺服器組件可由連接到伺服器或伺服器中任何物件的任何使用者所呼叫。 資料庫組件只能由連接到資料庫的 Database 物件或使用者所呼叫。
簡單 Assembly 物件是由基本資訊 (名稱和識別碼)、檔案集合和安全性規格所組成。
檔案集合指的是載入的組件檔案以及其對應的偵錯 (.pdb) 檔案 (如果這些偵錯檔案與組件檔案一起載入)。 組件檔案會從應用程式定義檔案的位置載入,而且會將複本連同資料儲存在伺服器中。 組件檔案的複本是用在每次啟動服務時載入組件。
安全性指定包含用來執行組件的權限集合和模擬。
呼叫使用者自訂函數
在組件中呼叫使用者自訂函數的方式,與呼叫內建函數的方式相同,只不過您需要使用完整名稱。 例如,傳回 MDX 所預期類型的使用者自訂函數,會包含在 MDX 查詢中,如下列範例所示:
Select MyAssembly.MyClass.MyStoredProcedure(a, b, c) on 0 from Sales
使用者自訂函數亦可使用 CALL 關鍵字呼叫。 針對會傳回資料錄集或空值的使用者自訂函數,您必須使用 CALL 關鍵字;但如果使用者自訂函數是取決於 MDX 或 DMX 陳述式或指令碼內容中的物件 (例如目前的 Cube 或資料採礦模型),則不可使用 CALL 關鍵字。 在 MDX 或 DMX 查詢之外呼叫函數的常見用途是使用 AMO 物件模型來執行管理功能。 例如,如果您想要在 MDX 陳述式中使用 MyVoidProcedure(a, b, c)
函數,就應使用下列語法:
Call MyAssembly.MyClass.MyVoidProcedure(a, b, c)
組件的使用讓通用程式碼只需要開發一次,並儲存於單一位置,以簡化資料庫的開發。 用戶端軟體發展人員可以建立 Analysis Services 的函式程式庫,並與其應用程式一起散發。
元件和使用者定義函式可以複製 Analysis Services 函式程式庫或其他元件的函式名稱。 只要您使用使用者定義函數的完整名稱呼叫,Analysis Services 就會使用正確的程式。 基於安全性目的,以及排除在不同類別庫中呼叫重複名稱的機會,Analysis Services 會要求您只針對預存程式使用完整名稱。
若要從特定 CLR 組件呼叫使用者自訂函數,該使用者自訂函數將置於組件名稱、完整類別名稱,以及程序名稱之後,如下所示:
AssemblyName。FullClassName。ProcedureName (Argument1、 Argument2、 ...)
為了與舊版 Analysis Services 的回溯相容性,也可以接受下列語法:
AssemblyName!FullClassName!ProcedureName(Argument1, Argument2, ...)
如果 COM 程式庫支援多重介面,則介面識別碼也可以用來解析程序名稱,如下所示:
AssemblyName!InterfaceID!ProcedureName(Argument1, Argument2, ...)
安全性
組件的安全性是以 .NET Framework 安全性模型為基礎,它是一種程式碼存取安全性模型。 .NET Framework 支援程式碼存取安全性機制,而這個機制假設執行階段可以主控完全信任和部份信任的程式碼。 受 .NET Framework 程式碼存取安全性保護的資源,一般都是以 Managed 程式碼包裝,而 Managed 程式碼在存取資源前會要求對應的權限。 唯有在呼叫堆疊中所有的呼叫者 (在組件層級) 都具有對應的資源權限時,權限的要求才會被滿足。
針對組件,執行的權限會透過 PermissionSet
物件的 Assembly
屬性傳遞。 Managed 程式碼所接收的權限是由實行中的安全性原則決定。 非 Analysis Services 裝載環境中已經有三種原則層級有效:企業、電腦和使用者。 程式碼所接收的有效權限清單是由這三個層級所取得的權限交集決定。
Analysis Services 會在裝載 CLR 時提供主機層級的安全性原則層級;此原則是低於三個原則層級的額外原則層級,且一律有效。 此原則是針對 Analysis Services 所建立的每個應用程式域所設定。
Analysis Services 主機層級原則是系統元件的 Analysis Services 固定原則,以及使用者元件的使用者指定原則的組合。 Analysis Services 主機原則的使用者指定部分是以元件擁有者為基礎,為每個元件指定三個許可權貯體之一:
權限設定 | 描述 |
---|---|
Safe |
提供內部計算權限。 這個權限值區不會指派權限,來存取 .NET Framework 中的所有受保護資源。 如果未使用 PermissionSet 屬性指定任何權限,這就會是組件的預設權限值區。 |
ExternalAccess |
提供和 Safe 設定相同的存取權,並附帶存取外部系統資源的能力。 這個權限值區不提供安全性保證 (雖然是可以確保此情況的安全),但是可以提供可靠性的保證。 |
Unsafe |
不提供限制。 在此權限設定下執行的 Managed 程式碼,無法提供安全性或可靠性的保證。 任何權限,即使是管理員納入的自訂權限,皆可被授與在本信任層級執行的程式碼。 |
當 Analysis Services 裝載 CLR 時,堆疊逐步解說型許可權檢查會以原生 Analysis Services 程式碼在界限停止。 Analysis Services 元件中的任何 Managed 程式碼一律屬於先前所列的三個許可權類別之一。
COM (或 Unmanaged) 組件常式不支援 CLR 安全性模型。
模擬
每當 Managed 程式碼存取 Analysis Services 外部的任何資源時,Analysis Services 都會遵循與元件屬性設定相關聯的 ImpersonationMode
規則,以確保存取發生在適當的 Windows 安全性內容中。 由於使用許可權設定的 Safe
元件無法存取 Analysis Services 外部的資源,因此這些規則僅適用于使用 ExternalAccess
和 Unsafe
許可權設定的元件。
如果目前的執行內容對應到 Windows 已驗證的登入,而且與原始呼叫端的內容相同, (也就是說,) 中間沒有 EXECUTE AS,Analysis Services 會在存取資源之前模擬 Windows 已驗證的登入。
如果有中繼 EXECUTE AS 變更了來自原始呼叫者的內容,對外部資源存取的嘗試就會失敗。
可將 ImpersonationMode
屬性設定為 ImpersonateCurrentUser
或 ImpersonateAnonymous
。 預設值是 ImpersonateCurrentUser
,會用來以目前使用者的網路登入帳戶執行組件。 ImpersonateAnonymous
如果使用設定,執行內容會對應至伺服器上的 Windows 登入使用者帳戶IUSER_servername。 這是網際網路 Guest 帳戶,在伺服器上的權限有限。 在這個內容中執行的組件,在本機伺服器上只能存取有限的資源。
應用程式定義域
Analysis Services 不會直接公開應用程式域。 因為組件集是在相同的應用程式網域中執行,所以應用程式網域可以在執行時期使用 .NET Framework 中的 System.Reflection
命名空間或其他方式,來發現彼此,也可用延遲繫結方式呼叫它們。 這類呼叫將受限於 Analysis Services 授權型安全性所使用的許可權檢查。
因為應用程式網域界限和每個網域中的組件都是由實作所定義,所以您不應該依賴在同一應用程式網域中尋找組件。