XML 架构集合 (SQL Server)

如主题 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) 语句将其他架构或架构组件导入数据库中的现有集合对象。

如主题中所述, Typed 与 Untyped 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>  

上一架构显示可以存储在数据库中的不同类型的组件。 这些内容包括SomeAttributeSomeTypeOrderTypeCustomerTypeCustomerOrderCustomerIDOrderIDOrderDateRequiredDateShippedDate

组件类别

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

  • 元素

  • 属性

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

  • 属性组

  • MODELGROUP

例如:

  • SomeAttribute 是一个 ATTRIBUTE 组件。

  • SomeTypeOrderTypeCustomerType 是 TYPE 组件。

  • 客户 是 ELEMENT 组件。

将架构导入数据库时,SQL Server 不会存储架构本身。 相反,SQL Server 存储各个组件。 也就是说, <架构> 标记不会存储,只会保留其中定义的组件。 不会保留所有架构元素。 <如果架构>标记包含指定其组件的默认行为的属性,则这些属性将在导入过程中移动到其中的架构组件,如下表所示。

属性名称 行为
attributeFormDefault 应用于架构中尚未存在的所有属性声明的 表格 属性,并将属性的值设置为 attributeFormDefault 的值。
elementFormDefault 格式 属性应用于架构中所有尚未存在该属性的元素声明,并将值设置为 elementFormDefault 属性的值。
默认阻止 属性应用于所有元素声明和类型定义(如果这些元素尚未包含此属性),并将其值设为blockDefault属性的值。
finalDefault 应用于所有尚未拥有的元素声明和类型定义的最终属性,并将该值设置为 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 架构和架构集合的信息

在目录视图 sys.xml_schema_collections 中列出了 XML 架构集合。 XML 架构集合“sys”由系统定义。 它包含可在所有用户定义 XML 架构集合中使用的预定义命名空间,而无需显式加载它们。 此列表包含 xml、xs、xsi、fn 和 xdt 的命名空间。 另外两个目录视图是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/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 类型系统中。 可以使用 xml 数据类型方法查询 XML 列。 此外,还可以在此列上生成 XML 索引。 但是,使用此方法,应用程序必须保持 XML 列和 XML 类型系统中存储的 XML 架构之间的一致性。 例如,如果从 XML 类型系统中删除 XML 架构命名空间,则还必须从表中删除该命名空间才能保持一致性。

另请参阅

查看存储的 XML 架构集合
预处理模式以合并所含模式
服务器上的 XML 架构集合的要求和限制