如 xml (Transact-SQL)主題所述,SQL Server 會透過 xml 資料類型提供 XML 資料的原生記憶體。 您可以選擇性地透過 XML 架構集合,將 XSD 架構與類型的變數或資料行 xml 產生關聯。 XML 架構集合會儲存匯入的 XML 架構,然後用來執行下列動作:
驗證 XML 實例
輸入儲存在資料庫中的 XML 數據
請注意,XML 架構集合是元數據實體,例如資料庫中的數據表。 您可以建立、修改和卸除它們。 在 (Transact-SQL) 語句中指定的CREATE XML SCHEMA COLLECTION結構會自動匯入到新建立的 XML 架構集合物件中。 你可以透過使用 ALTER XML SCHEMA COLLECTION (Transact-SQL) 陳述式,將額外的結構或架構元件匯入資料庫中的現有集合物件。
如主題具型別與無型別 XML中所述,儲存在與架構相關聯的欄位或變數中的 XML 稱為具型別 XML,因為架構為實例數據提供了必要的數據類型資訊。 SQL Server 會使用此類型資訊來優化數據記憶體。
查詢處理引擎也會使用架構來進行型別檢查,並將查詢和數據修改優化。
此外,SQL Server 會在具類型的 xml案例中使用相關聯的 XML 架構集合來驗證 XML 實例。 如果 XML 實例符合架構,資料庫會允許實例以其類型資訊儲存在系統中。 否則,該實例將被拒絕。
您可以使用內部函數XML_SCHEMA_NAMESPACE來擷取儲存在資料庫中的架構集合。 如需詳細資訊,請參閱 檢視預存的 XML 架構集合。
您也可以使用 XML 架構集合來輸入 XML 變數、參數和資料行。
用於管理架構集合的 DDL
您可以在資料庫中建立 XML 架構集合,並將其與類型的變數和數據行 xml 產生關聯。 若要管理資料庫中的架構集合,SQL Server 提供下列 DDL 語句:
CREATE XML SCHEMA COLLECTION (Transact-SQL) 將結構元件匯入資料庫。
ALTER XML SCHEMA COLLECTION (Transact-SQL) 修改現有 XML 架構集合中的結構元件。
DROP XML SCHEMA COLLECTION (Transact-SQL) 刪除完整的 XML 結構集合及其所有元件。
要使用 XML 架構集合及其所包含的結構,你必須先使用 陳述 CREATE XML SCHEMA COLLECTION 式來建立集合和結構。 建立架構集合之後,您就可以建立類型的變數和數據行 xml ,並將架構集合與其產生關聯。 請注意,在建立架構集合之後,各種架構元件會儲存在元數據中。 你也可以用 來 ALTER XML SCHEMA COLLECTION 為現有結構新增更多元件,或在現有集合中新增結構。
若要刪除結構描述集合,請使用 DROP XML SCHEMA COLLECTION 陳述式。 這會卸除集合中包含的所有架構,並移除集合物件。 請注意,在你能捨棄結構集合之前,必須先滿足(Transact-SQL)中描述的DROP XML SCHEMA COLLECTION條件。
了解架構元件
當你使用該 CREATE XML SCHEMA COLLECTION 語句時,各種結構元件會被匯入資料庫。 架構元件包括架構元素、屬性和類型定義。 當您使用 DROP XML SCHEMA COLLECTION 陳述式時,會移除整個集合。
CREATE XML SCHEMA COLLECTION 將結構元件儲存到各種系統資料表中。
例如,請考慮下列架構:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="uri:Cust_Orders2"
xmlns="uri:Cust_Orders2" >
<xsd:attribute name="SomeAttribute" type="xsd:int" />
<xsd:complexType name="SomeType" />
<xsd:complexType name="OrderType" >
<xsd:sequence>
<xsd:element name="OrderDate" type="xsd:date" />
<xsd:element name="RequiredDate" type="xsd:date" />
<xsd:element name="ShippedDate" type="xsd:date" />
</xsd:sequence>
<xsd:attribute name="OrderID" type="xsd:ID" />
<xsd:attribute name="CustomerID" />
<xsd:attribute name="EmployeeID" />
</xsd:complexType>
<xsd:complexType name="CustomerType" >
<xsd:sequence>
<xsd:element name="Order" type="OrderType"
maxOccurs="unbounded" />
</xsd:sequence>
<xsd:attribute name="CustomerID" type="xsd:string" />
<xsd:attribute name="OrderIDList" type="xsd:IDREFS" />
</xsd:complexType>
<xsd:element name="Customer" type="CustomerType" />
</xsd:schema>
上一個架構顯示可以儲存在資料庫中的不同元件類型。 這些包括SomeAttribute、SomeType、OrderType、CustomerType、Customer、Order、CustomerID、OrderID、OrderDate、RequiredDate和ShippedDate。
元件類別
儲存在資料庫中的架構元件分為下列類別:
元素
屬性
TYPE (適用於簡單或複雜類型)
屬性群組
MODELGROUP
例如:
SomeAttribute 是 ATTRIBUTE 元件。
SomeType、 OrderType 和 CustomerType 是 TYPE 元件。
客戶 是 ELEMENT 元件。
當您將架構匯入資料庫時,SQL Server 不會儲存架構本身。 相反地,SQL Server 會儲存各種個別元件。 也就是說, <不會儲存架構> 標籤,只會保留其內定義的元件。 不會保留所有架構元素。 <如果 Schema> 標籤包含指定其元件預設行為的屬性,這些屬性會在匯入程式期間移至其中的架構元件,如下表所示。
| 屬性名稱 | 行為 |
|---|---|
| attributeFormDefault | 套用 form 屬性至架構中尚未存在此屬性的所有屬性宣告,並將值設定為 attributeFormDefault 屬性的值。 |
| elementFormDefault | 套用至架構中尚未存在之所有專案宣告的 form 屬性,並將值設定為 elementFormDefault 屬性的值。 |
| blockDefault | 區塊屬性會套用至所有專案宣告和類型定義,其中它尚未存在,且值會設定為 blockDefault 屬性的值。 |
| finalDefault | 最後一個屬性會套用至所有元素宣告和類型定義,其中它尚未存在,且值會設定為 finalDefault 屬性的值。 |
| targetNamespace | 屬於目標命名空間的元件相關信息會儲存在元數據中。 |
XML 架構集合的許可權
您必須具備執行下列作業所需的權限:
建立/載入 XML 架構集合
修改 XML 架構集合
卸除 XML 架構集合
使用 XML 架構集合來輸入類型
xml資料行、變數和參數,或在數據表或數據行條件約束中使用它
SQL Server 安全性模型允許每個物件的 CONTROL 許可權。 此許可權的被授出席者會取得 物件上所有其他許可權。 對象的擁有者也具有 物件的所有許可權。
物件上CONTROL許可權的擁有者和被授出席者可以授與物件的任何許可權。 非擁有者且沒有 CONTROL 權限的使用者,只要指定 WITH GRANT OPTION,仍可授予物件權限。 例如,假設使用者 A 透過 WITH GRANT OPTION 對 XML 結構集合 S 擁有 REFERENCES 權限,但對 S 沒有其他權限。使用者 A 可以授予使用者 B 對結構集合 S 的 REFERENCE 權限。
安全性模型也允許許可權建立和使用 XML 架構集合,或將擁有權從某個使用者傳送到另一個使用者。 下列主題描述 XML 架構集合許可權。
-
本主題討論如何授與許可權以建立 XML 架構集合,以及如何授與 XML 架構集合對象的許可權。
-
本主題討論如何使用撤銷許可權來防止建立 XML 架構集合,以及如何撤銷 XML 架構集合對象的許可權。
-
本主題討論如何拒絕建立 XML 架構集合的許可權,以及拒絕 XML 架構集合物件的許可權。
取得 XML 架構和架構集合的相關信息
XML 架構集合會在目錄檢視中列舉,sys.xml_schema_collections。 XML 架構集合 「sys」 是由系統所定義。 它包含預先定義的命名空間,可用於所有使用者定義 XML 架構集合,而不需要明確載入它們。 此清單包含 xml、xs、xsi、fn 和 xdt 的命名空間。 另外兩個目錄檢視是 sys.xml_schema_namespaces,它會列舉每個 XML 架構集合內的所有命名空間,而 sys.xml_components 會列舉每個 XML 架構中的所有 XML 架構元件。
內建函式XML_SCHEMA_NAMESPACE、schemaName、XmlSchemacollectionName、namespace-uri,會產生xml數據類型實例。 這個實例包含 XML 架構集合中所含架構的 XML 架構片段,但預先定義的 XML 架構除外。
您可以透過下列方式列舉 XML 架構集合的內容:
針對 XML 架構集合,在適當的目錄檢視上撰寫 Transact-SQL 查詢。
使用 內建函式 XML_SCHEMA_NAMESPACE()。 您可以在此函式的輸出上套用
xml資料類型方法。 不過,您無法修改基礎 XML 架構。
下列範例說明這些。
範例:列舉 XML 架構集合中的 XML 命名空間
針對 XML 架構集合 「myCollection」 使用下列查詢:
SELECT XSN.name
FROM sys.xml_schema_collections XSC JOIN sys.xml_schema_namespaces XSN
ON (XSC.xml_collection_id = XSN.xml_collection_id)
WHERE XSC.name = 'myCollection'
範例:列舉 XML 架構集合的內容
下列語句會列舉關係架構 dbo 內 XML 架構集合 「myCollection」 的內容。
SELECT XML_SCHEMA_NAMESPACE (N'dbo', N'myCollection')
藉由將目標命名空間指定為xml的第三個自變數,即可取得集合內的個別 XML 架構做為數據類型實例。 下列範例會顯示這一點。
範例:從 XML 架構集合輸出指定的架構
下列語句會從關係架構 dbo 內的 XML 架構集合 「myCollection」 輸出具有目標命名空間 「https://www.microsoft.com/books」 的 XML 架構。
SELECT XML_SCHEMA_NAMESPACE (N'dbo', N'myCollection',
N'https://www.microsoft.com/books')
查詢 XML 架構
您可以透過下列方式查詢已載入 XML 架構集合的 XML 架構:
針對 XML 架構命名空間的目錄檢視撰寫 Transact-SQL 查詢。
建立包含
xml數據類型數據行的數據表,以儲存 XML 架構,並將它們載入 XML 類型系統。 您可以使用資料類型方法來查詢 XMLxml資料列。 此外,您也可以在此數據行上建置 XML 索引。 不過,使用這種方法,應用程式必須維持儲存在 XML 資料行和 XML 類型系統之 XML 架構之間的一致性。 例如,如果您從 XML 類型系統卸除 XML 架構命名空間,您也必須從資料表卸除它,才能保留一致性。