如 xml (Transact-SQL)主題所述,SQL Server 會透過 xml 資料類型提供 XML 資料的原生記憶體。 您可以選擇性地透過 XML 架構集合,將 XSD 架構與類型的變數或資料行 xml 產生關聯。 XML 架構集合會儲存匯入的 XML 架構,然後用來執行下列動作:
驗證 XML 實例
輸入儲存在資料庫中的 XML 數據
請注意,XML 架構集合是元數據實體,例如資料庫中的數據表。 您可以建立、修改和卸除它們。 CREATE XML SCHEMA COLLECTION (Transact-SQL) 語句中指定的架構會自動匯入新建立的 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 語句。 這會卸除集合中包含的所有架構,並移除集合物件。 請注意,您必須先符合 DROP XML SCHEMA COLLECTION (Transact-SQL)中所述的條件,才能卸載架構集合。
了解架構元件
當您使用 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許可權的擁有者和被授出席者可以授與物件的任何許可權。 指定WITH GRANT OPTION時,不是擁有者且沒有CONTROL許可權的使用者仍然可以授與對象的許可權。 例如,假設使用者 A 具有 XML 架構集合 S 的 REFERENCES 許可權,透過 WITH GRANT OPTION,但在 S 上沒有其他的許可權。使用者 A 可以將 REFERENCES 許可權授予給架構集合 S 的使用者 B。
安全性模型也允許許可權建立和使用 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_SCHEMA_NAMESPACE()的第三個自變數,即可取得集合內的個別 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 架構命名空間,您也必須從資料表卸除它,才能保留一致性。