XML 架构集合 (SQL Server)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

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 语句:

若要使用 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>

以上架构显示了可以存储在数据库中的不同类型的组件。 其中包括 SomeAttributeSomeTypeOrderTypeCustomerTypeCustomerOrderCustomerIDOrderIDOrderDateRequiredDate以及 ShippedDate

组件类别

数据库中存储的架构组件分为下列类别:

  • ELEMENT

  • ATTRIBUTE

  • TYPE(用于简单或复杂类型)

  • ATTRIBUTEGROUP

  • MODELGROUP

例如:

  • SomeAttribute 是 ATTRIBUTE 组件。

  • SomeTypeOrderTypeCustomerType 是 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 架构集合 S 的 REFERENCES 权限。

安全模式也允许使用这些权限来创建和使用 XML 架构集合或将所有权从一个用户传递到另一个用户。 以下文章介绍了 XML 架构集合权限。

获取有关 XML 架构和架构集合的信息

XML 架构集合在目录视图 sys.xml_schema_collections 中枚举出来。 XML 架构集合 sys 由系统定义。 它包含无需显式加载即可在所有用户定义的 XML 架构集合中使用的预定义命名空间。 此列表包含 xmlxsxsifnxdt 的命名空间。 另外两个目录视图是 sys.xml_schema_namespaces(该视图枚举每个 XML 架构集合中的所有命名空间)和 sys.xml_components(该视图枚举每个 XML 架构中的所有 XML 架构组件)。

内置函数 XML_SCHEMA_NAMESPACEschemaName, 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/was-books 的 XML 架构。

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 架构命名空间,还必须从表中删除它以保持一致性。

另请参阅