Коллекции XML-схем (SQL Server)

Как описано в разделе xml (Transact-SQL), SQL Server обеспечивает собственное хранение XML-данных через xml тип данных . При необходимости можно связать схемы XSD с переменной или столбцом xml типа с помощью коллекции схем XML. Коллекция XML-схем хранит импортированные XML-схемы и используется для решения следующих задач:

  • проверка экземпляров XML;

  • типизация XML-данных, хранимых в базе данных.

Коллекция XML-схем — это сущность класса метаданных, подобная таблице в базе данных. Можно создавать, изменять и удалять эти схемы. Схемы, указанные в инструкции CREATE XML SCHEMA COLLECTION (Transact-SQL) , автоматически импортируются в создаваемую коллекцию XML-схем. Можно импортировать дополнительные схемы или компоненты схем в существующую в базе данных коллекцию при помощи инструкции ALTER XML SCHEMA COLLECTION (Transact-SQL) .

Как описано в разделе Сравнение типизированного и нетипизированного 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>  

В приведенной выше схеме показаны различные типы компонентов, которые могут храниться в базе данных. Это компоненты SomeAttribute, SomeType, OrderType, CustomerType, Customer, Order, CustomerID, OrderID, OrderDate, RequiredDateи ShippedDate.

Категории компонентов

Компоненты схемы, хранящиеся в базе данных, делятся на следующие категории:

  • ELEMENT

  • ATTRIBUTE

  • TYPE (для простых и сложных типов);

  • ATTRIBUTEGROUP;

  • 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 для объекта могут давать любые разрешения на этот объект. Пользователь, не являющийся владельцем и не имеющий разрешения CONTROL, может давать разрешения на объект при использовании параметра WITH GRANT OPTION. Допустим, что пользователь A имеет предоставленное с помощью настройки WITH GRANT OPTION разрешение REFERENCES на коллекцию XML-схем S, но не имеет других разрешений на коллекцию S. В этом случае пользователь A может предоставить пользователю Б разрешение REFERENCES на коллекцию схем S.

Кроме того, модель безопасности допускает создание и использование разрешениями коллекций 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_SCHEMA_NAMESPACE, schemaName, XmlSchemacollectionName, namespace-uri, возвращает xml тип данных instance.. Этот экземпляр содержит фрагменты для XML-схем, содержащихся в коллекции XML-схем, за исключением предопределенных XML-схем.

Перечислить содержимое коллекции XML-схем можно двумя способами:

  • написать запросы Transact-SQL, адресованные соответствующим представлениям каталога, связанным с коллекциями XML-схем;

  • Используйте встроенную функцию 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-схем

Следующая инструкция перебирает содержимое коллекции XML-схем «myCollection» реляционной схемы dbo.

SELECT XML_SCHEMA_NAMESPACE (N'dbo', N'myCollection')  

Отдельные XML-схемы в коллекции можно получить в качестве xml экземпляров типа данных, указав целевое пространство имен в качестве третьего аргумента для XML_SCHEMA_NAMESPACE(). Это показано в следующем примере.

Пример Вывод конкретной схемы из коллекции XML-схем

Следующая инструкция выводит XML-схему с целевым пространством имен "https://www.microsoft.com/books" из коллекции XML-схем "myCollection" реляционной схемы dbo.

SELECT XML_SCHEMA_NAMESPACE (N'dbo', N'myCollection',   
N'https://www.microsoft.com/books')  

Запросы XML-схем

Запрашивать XML-схемы, загруженные в коллекцию XML-схем, можно перечисленными ниже способами.

  • Написать адресованные представлениям каталога запросы Transact-SQL о получении пространств имен XML-схем.

  • Создать таблицу со столбцом данных типа xml для хранения XML-схем и их загрузки в систему типов XML. Данные из XML-столбца можно запросить при помощи методов типа данных xml. Кроме того, можно создать для этого столбца XML-индекс. Однако при этом подходе в приложении нужно поддерживать согласованность между XML-схемами, хранимыми в XML-столбце, и системой типов XML. Например, при удалении пространства имен XML-схемы из системы типов XML для сохранения согласованности необходимо будет удалить его и из таблицы.

См. также:

Просмотр хранимой коллекции схем XML
Предпроцессор схемы для слияния включаемых схем
Требования и ограничения для коллекций схем XML на сервере