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

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Как описано в статье 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) .

Как описано в статье Typed vs. 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>

В приведенной выше схеме показаны различные типы компонентов, которые могут храниться в базе данных. Это компоненты 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 сохраняет различные отдельные компоненты. То есть <тег схемы> не хранится, сохраняются только компоненты, определенные в нем. Все элементы схемы не сохраняются. <Если тег схемы> содержит атрибуты, определяющие поведение компонентов по умолчанию, эти атрибуты перемещаются в компоненты схемы в процессе импорта, как показано в следующей таблице.

Attribute name Поведение
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. Коллекция sys схем XML определяется системой. Она содержит предопределенные пространства имен, которые можно использовать во всех пользовательских коллекциях XML-схем, не загружая их явно. Этот список содержит пространства имен для xml, xs, и xsifnxdt. Два других представления каталога — это sys.xml_schema_namespacesперечисление всех пространств имен в каждой коллекции схем XML и sys.xml_componentsперечисление всех компонентов схемы XML в каждой схеме XML.

Встроенная функция XML_SCHEMA_NAMESPACEschemaName, XmlSchemacollectionName, namespace-uri, дает экземпляр типа данных XML. Этот экземпляр содержит фрагменты для XML-схем, содержащихся в коллекции XML-схем, за исключением предопределенных XML-схем.

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

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

  • Используйте встроенную функцию XML_SCHEMA_NAMESPACE(). К результатам этой функции можно применять методы типа данных xml . Однако нельзя изменить базовые xml-схемы.

Все это поясняют следующие примеры.

Примеры

Перечисление пространств имен XML в коллекции схем XML

Используйте следующий запрос для коллекции myCollectionсхем XML:

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-схемы из коллекции можно получить как экземпляры типа данных xl , указав целевое пространство имен в качестве третьего аргумента функции XML_SCHEMA_NAMESPACE(). Это показано в следующем примере.

Вывод указанной схемы из коллекции XML-схем

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

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

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

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

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

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

См. также