查詢手法可以使在網路上減輕WBEM管理環境的負擔,確切的傳送查詢請求的方法和接收查詢結果,是定義 [CIM Operation Over HTTP Specification] 的一部份。
CIM 查詢語言已經廣泛的使用在 [CIM Operation over HTTP Specification[,查詢定義透過 ExecuteQuery CIM opration 從物件取回實體層(instance-level)的資料結果,並且定義指示 (Indication) 發生時的情況,和要取回的資料,如同以下:
我們可以從圖9.1中藍色圈圈的部份輸入查詢語言。
在接下來的章節,我們將會介紹一種查詢語言,稱為WBEM Query Language(WQL),並且要如何篇寫WQL。
WBEM Query Language (WQL)是在 Query Language (ANSI SQL) 裡的一個小子集, WQL是用來支援WBEM在Solaris/WMI的平台,下面的表格顯示出傳統的SQL概算相對應於WQL。
SQL | WQL |
---|---|
Table | CIM 類別 (class) |
Row | CIM 實體 (instance) |
Column | CIM property |
在DMTF組織,有兩種標準規格語言,另一種語言稱作CIM Query Language (CQL)。因為WQL比CQL普遍流行,在以下的章節中,我們將會著重在如何寫WQL。
在WBEM Service實作時,WQL是一種取回結果的語言,你可以使用WQL去取回以CIM 資料模組型態的資料。在CIM模組裡,物件的相關資訊是存在CIM 類別和CIM 實體。CIM的實體包含屬性,屬性有一個名字、資料型態、內容值。WBEM客戶端使用WQL去查詢和過濾資料。當資料是存在一個特別的資料提供者,CIMON會傳送使用者的查詢到適合的資料提供者,使得使用者可以搜尋某一個類別的實體,或所有的類別含有一個特別的名稱領域(namespace)。
例如,你可以搜尋所有Solaris_DiskDrive類別的實體中Storage_Capacity的屬性:
select * from Solaris_DiskDrive where Storage_Capacity = 1000
WBEM Service SDK 支援 WQL,且可以使用簡單 select語法,但不包括 join。下面的表格說明WQL的重要字。
關鍵字 | WQL 含意 |
---|---|
SELECT | 所要查詢的屬性 |
WHERE | 縮小查詢範圍 |
FROM | 所要查詢屬性所在的類別名稱 |
NOT | 非空值的比較 |
OR | 比較兩個情況,當超過一個邏輯運算出現時OR要置於AND之後 |
AND | 比較兩個情況,如果都成立,回傳值為真 |
LIKE | 產生提供符合最小資訊的結果 |
你可以使用 SELECT 句子取回單一個類別和它子類別的實體,你也可以針對屬性取回和滿足條件情況下取回,SELECT句子的語法如下:
SELECT list FROM class WHERE conditio
下面的表格顯示使用 SELECT 句子使用參數的例子。
範例 | 查詢描述 |
---|---|
SELECT * FROM class | 選擇某類別和它子類別中所有的實體,所有的實體會包含所有的屬性 |
SELECT PropertyA FROM class | 選擇某類別和它子類別中實體含有屬性A |
SELECT PropertyA, PropertyB FROM class WHERE PropertyB=20 | 選擇某類別和它子類別中實體含有屬性A、屬性B,並且屬性B 等於20。所以每個取回的實體只含屬性A、屬性B |
FROM 字句定義符合查詢字串中的實體所在的類別,目前不支援JOIN的語法,所以只能從單一個類別取回資料。
FROM 由一個概念類別fromExp表達,目前NonJoinExp只能直接對fromExp的字類別。NonJoinExp 子類別表達SELECT 操作執行只在單一個CIM 類別。下面顯示一個使用FROM的例子。
SELECT * FROM class
WHERE縮小查詢的範圍,句子中包含一個情況的敘述,敘述中可包含屬性、關鍵字、運算子、整數。把WHERE加到SELECT後面的語法如下:
SELECT CIMinstance FROM CIMclass WHERE conditional_expression
在WHERE句型中的conditional_expression 採取下面的行式:
property operator constant
句子中包含一個情況的敘述,敘述中可包含屬性、關鍵字、運算子、整數。把 WHERE 加到 SELECT 後面的語法如下:
SELECT instance FROM class [WHERE constant operator property]
下面顯示在 conditional_expression 使用參數的例子。下面的查詢只會取回 Solaris_Printer 類別中,已經是準備好的printer的實體:
SELECT * FROM Solaris_Printer WHERE Status = `ready'
這個例子會取回 Solaris_FileSystem 類別中帶有 Name 為 `home' 或為 `file' 的所有實體:
SELECT * FROM Solaris_FileSystem WHERE Name= `home' OR Name= `files'
這個例子會取回Solaris_FileSystem類別中帶有Name為’home’或為’file’的所有實體,且AvailableSpace > 2000000 和 FileSystem = `Solaris':
SELECT * FROM Solaris_FileSystem WHERE (Name = `home' OR Name = `files') AND AvailableSpace > 2000000 AND FileSystem = `Solaris'
根據標準規格,我們列出當使用者執行查詢請求時,發生的錯誤訊息。
錯誤訊息 | 描述 |
---|---|
CIM_ERR_ACCESS_DENIED | 使用者沒有權限使用查詢的動作。 |
CIM_ERR_INVALID_PARAMETER | 輸入的參數不對。 |
CIM_ERR_FAILED | 一般的錯誤訊息。 |
CIM_ERR_NOT_SUPPORTED | WBEM沒有支援這樣的功能。 |
CIM_ERR_INVALID_NAMESPACE | Namespace不存在。 |
CIM_ERR_QUERY_LANGUAGE_NOT_SUPPORTED | 使用的查詢語言不支援 |
CIM_ERR_INVALID_QUERY | 非何法的查詢語言。 |
在本章中,我們介紹了CIM模型查詢語言的基本概念,客戶端開發者可利用該查詢語言更方便的開發應用程式,CIM查詢語言相當類似於應用於資料庫開發的Structured Query Language (SQL),也因為SQL的普及,CIM查詢語言也能廣泛的被接受使用,此外,藉由傳送複雜的查詢語句給WBEM伺服器,可降低客戶端與伺服器間的溝通負荷。