Microsoft SQL Server Analysis Services 提供許多內部函數,可與多維度表達式 (MDX) 和數據採礦延伸模組 (DMX) 語言搭配使用,其設計目的是完成從標準統計計算到周遊階層成員的所有專案。 但是,如同任何其他複雜且健全的產品,總需要進一步擴充這類產品的功能。
因此,Analysis Services 可讓您將元件新增至 Analysis Services 實例或資料庫。 元件可讓您使用任何通用語言執行平臺 (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) 檔案,前提是偵錯檔案已與元件檔一同載入。 元件檔案會從應用程式定義檔案的位置載入,而複本會連同數據一起儲存在伺服器中。 每次啟動服務時,會使用元件檔案的複本來載入元件。
安全性規格包括許可權集合和執行組件時所使用的冒充。
呼叫 User-Defined 函式
在組件中呼叫使用者定義函式與呼叫內建函數執行方式相同,但您必須使用完全限定名稱。 例如,傳回 MDX 預期類型的使用者定義函數包含在 MDX 查詢中,如下列範例所示:
Select MyAssembly.MyClass.MyStoredProcedure(a, b, c) on 0 from Sales
您也可以使用 CALL 關鍵詞來呼叫使用者定義函數。 您必須針對傳回記錄集或 void 值的使用者定義函數使用 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 程式代碼包裝,這些程式碼會要求對應的許可權,才能啟用資源的存取權。 只有在呼叫堆疊中的所有呼叫端(在元件層級)都有對應的資源許可權時,才會滿足許可權的需求。
針對組件,會使用 PermissionSet 物件上的 Assembly 屬性傳遞授權給執行。 受管理程式代碼接收的許可權是由安全策略所決定。 非 Analysis Services 託管環境中已有三個政策層級生效:企業、電腦與使用者。 程式代碼接收的有效許可權清單是由這三個層級所取得許可權的交集所決定。
Analysis Services 在裝載 CLR 時提供主機層級的安全性原則層級,而此原則層級是三個一律有效的原則層級之下的額外原則層級。 此原則是針對 Analysis Services 所建立的每個應用程式域所設定。
Analysis Services 主機層級政策是由系統元件的 Analysis Services 固定政策,以及使用者元件的使用者指定政策所組成的組合。 Analysis Services 主機原則中由使用者指定的部分,是根據元件擁有者為每個元件指定其中一個許可權範疇而制定的:
| 許可權設定 | 說明 |
|---|---|
Safe |
提供內部計算許可權。 此許可權貯體不會指派許可權來存取 .NET Framework 中任何受保護的資源。 如果沒有使用 PermissionSet 屬性指定任何專案,這是元件的默認許可權貯體。 |
ExternalAccess |
提供與 Safe 設定相同的存取權,並額外能夠存取外部系統資源。 此權限桶無法提供安全上的保證(雖然可以加以保障此情境),但它確實提供可靠性的保證。 |
Unsafe |
不提供任何限制。 此許可權集合下執行的 Managed 程式代碼無法保證安全性或可靠性。 任何許可權,即使是系統管理員所加入的自定義許可權,也會授予在這個信任層級上執行的程式碼。 |
當分析服務裝載 CLR 時,基於堆疊檢查的許可權會在原生分析服務代碼的界限處停止。 Analysis Services 元件中的任何 Managed 程式代碼一律屬於先前所列的三個許可權類別之一。
COM(或非受管)組件例程不支援 CLR 安全模型。
模仿
每當托管代碼存取 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 。 這是因特網來賓帳戶,在伺服器上具有有限的許可權。 在此內容中執行的元件只能存取本地伺服器上的有限資源。
應用程式域
Analysis Services 不會直接公開應用程式域。 由於在同一個應用程式域中執行的一組元件,應用程式域可以在運行時間透過使用 .NET Framework 的命名空間或其他一些方式來彼此探索,並且可以以晚期綁定的方式呼叫它們。 這類呼叫將受限於 Analysis Services 授權型安全性所使用的許可權檢查。
您不應該依賴於在同一個應用程式域中尋找元件,因為應用程式域的邊界和進入每個應用程式域的元件都由實作來定義。