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


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

Применимо к:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL в базе данных Microsoft Fabric

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

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

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

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

  • ЭЛЕМЕНТ

  • атрибут

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

  • ATTRIBUTEGROUP

  • MODELGROUP.

Например:

  • SomeAttribute — это компонент ATTRIBUTE.

  • SomeType, OrderTypeи CustomerType являются компонентами TYPE.

  • Customer является компонентом ELEMENT.

При импорте схемы в базу данных SQL Server не сохраняет саму схему. Вместо этого SQL Server хранит различные компоненты. То есть <тег схемы> не хранится, сохраняются только компоненты, определенные в нем. Все элементы схемы не сохраняются. <Если тег схемы> содержит атрибуты, определяющие поведение компонентов по умолчанию, эти атрибуты перемещаются в компоненты схемы в процессе импорта, как показано в следующей таблице.

Имя атрибута Поведение
attributeFormDefault Атрибут form применяется ко всем объявлениям атрибутов в схеме, где его еще нет. Ему присваивается значение, равное значению атрибута attributeFormDefault .
elementFormDefault Атрибут form применяется ко всем объявлениям элементов в схеме, где его еще нет. Ему присваивается значение, равное значению атрибута elementFormDefault .
по умолчанию блокировать Атрибут 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 для сохранения согласованности необходимо будет удалить его и из таблицы.