适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 中的 SQL 数据库
如xml(Transact-SQL)一文中所述,SQL Server通过 xml 数据类型提供 XML 数据的本机存储。 您可以选择通过 XML 架构集合将 XSD 架构与 xml 类型的变量或列关联。 XML 架构集合存储导入的 XML 架构,然后用于执行以下操作:
验证 XML 实例
类型化在数据库中存储的 XML 数据
XML 架构集合是一个类似于数据库表的元数据实体。 您可以创建、修改和删除它们。 在 (Transact-SQL) 语句中指定的CREATE XML SCHEMA COLLECTION架构会自动导入到新创建的 XML 架构集合对象中。 可以使用 (Transact-SQL) 语句将其他架构或架构组件导入数据库中ALTER XML SCHEMA COLLECTION的现有集合对象。
如类型化与非类型化 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 组件。Customer是 ELEMENT 组件。
将架构导入数据库时,SQL Server不会存储架构本身。 相反,SQL Server存储各个组件。 也就是说,不会存储 <Schema> 标记,只保留其中定义的组件。 不存储所有的架构元素。 如果 <Schema> 标记包含指定其组件默认行为的属性,则在导入过程中,将把这些属性移动到其中的架构组件,如下表所示。
| 特性名 | 行为 |
|---|---|
| attributeFormDefault | 在架构中所有不存在 form 属性的属性声明上应用此属性,并将其值设置为 attributeFormDefault 属性的值。 |
| elementFormDefault | 在架构中,对所有未设置form属性的元素声明应用该属性,并将其值设为elementFormDefault属性的默认值。 |
| blockDefault | 在所有的元素声明和类型定义中应用 block 属性,当这些声明和定义中尚未存在此属性时,其值会被设置为 blockDefault 属性的值。 |
| finalDefault | 在所有尚未存在该属性的元素声明和类型定义中,final 属性被应用,并将其值设置为 finalDefault 属性的值。 |
| targetNamespace | 有关属于目标命名空间的组件的信息存储在元数据中。 |
对 XML 架构集合的权限
您必须具有必要的权限才能执行下列操作:
创建/加载 XML 架构集合
修改 XML 架构集合
删除 XML 架构集合
使用 XML 架构集合对 xml 类型的列、变量和参数进行类型化,或者在表或列约束中使用它
SQL Server安全模型允许对每个对象拥有 CONTROL 权限。 此权限的被授权者将获得对象的其他所有权限。 对象的所有者也拥有对象的所有权限。
对象上的 CONTROL 权限的所有者和被授权者可以授予对象的任何权限。 指定 WITH GRANT OPTION 时,不属于所有者且没有 CONTROL 权限的用户仍可授予对对象的权限。 例如,假设用户 A 通过 WITH GRANT OPTION 对 XML 架构集合 S 具有 REFERENCES 权限,但对 S 没有其他权限。用户 A 可以授予用户 B REFERENCES 对架构集合 S 的权限。
安全模式也允许使用这些权限来创建和使用 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 架构集合的内容
以下语句枚举关系架构 myCollection 中的 XML 架构集合 dbo 的内容。
SELECT XML_SCHEMA_NAMESPACE (N'dbo', N'myCollection');
可以通过将目标命名空间指定为 XML_SCHEMA_NAMESPACE() 的第三个参数,获取集合中单个 XML 架构作为 xml数据类型实例。 这在下面的示例中显示。
从 XML 架构集合输出指定的架构
以下语句输出目标命名空间为虚构的的 XML 架构,来自关系架构https://www.microsoft.com/was-books中的 XML 架构集合myCollection。
SELECT XML_SCHEMA_NAMESPACE (N'dbo', N'myCollection',
N'https://www.microsoft.com/was-books')
查询 XML 架构
可以按下列方式查询加载到 XML 架构集合的 XML 架构:
针对 XML 架构命名空间的目录视图编写Transact-SQL查询。
创建包含 xml 数据类型列的表以存储 XML 架构并将它们加载到 XML 类型系统。 可以使用 xml 数据类型方法查询 XML 列。 另外,还可以对此列生成 XML 索引。 但是,使用此方法时,应用程序必须保持 XML 列中存储的 XML 架构和 XML 类型系统之间的一致性。 例如,如果从 XML 类型系统中删除 XML 架构命名空间,还必须从表中删除它以保持一致性。