Поделиться через


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

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

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

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

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

Как сказано в разделе типизированный и нетипизированный XML, код XML, хранимый в столбце или переменной, с которой связана схема, называется типизированным, потому что схема предоставляет необходимую информацию о типах данных экземпляра. В SQL Server эта информация о типах используется для оптимизации хранения данных.

Механизм обработки запросов применяет схемы для проверки типов, а также оптимизации запросов и изменения данных.

Кроме того, в случае типизированного xml SQL Server использует соответствующую коллекцию XML-схем для проверки экземпляра XML. Если экземпляр XML соответствует схеме, база данных позволяет сохранить его в системе с информацией о его типах. В противном случае она отклоняет экземпляр.

Встроенная функция XML_SCHEMA_NAMESPACE позволяет получить коллекцию схем, хранимую в базе данных. Дополнительные сведения см. в разделе Просмотр хранимой коллекции схем XML.

Кроме того, можно использовать коллекцию схем XML для типизации переменных, параметров и столбцов типа XML.

В этом разделе

  • DDL для управления коллекциями схем

  • Основные сведения о компонентах схемы

  • Разрешения на коллекцию схем 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. Этот экземпляр содержит фрагменты для 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-схем на сервере

Основные понятия

Предпроцессор схемы для слияния включаемых схем