XML スキーマ コレクション (SQL Server)

適用対象: SQL Server Azure SQL DatabaseAzure SQL Managed Instance

xml (Transact-SQL) の記事で説明されているように、SQL Serverは xml データ型を介して XML データのネイティブ ストレージを提供します。 必要に応じて、XML スキーマ コレクションを使って xml 型の変数や列と XSD スキーマを関連付けることができます。 XML スキーマ コレクションにはインポートした XML スキーマが格納され、その後このコレクションを次の操作に使用します。

  • XML インスタンスの検証

  • XML データをデータベースに格納するときの型指定

XML スキーマ コレクションは、データベース内のテーブルのようなメタデータ エンティティです。 XML スキーマ コレクションは作成、変更、削除できます。 CREATE XML SCHEMA COLLECTION (Transact-SQL) ステートメントで指定されたスキーマが、新しく作成される XML スキーマ コレクション オブジェクトに自動的にインポートされます。 ALTER XML SCHEMA COLLECTION (Transact-SQL) ステートメントを使用して、追加のスキーマやスキーマ コンポーネントをデータベース内の既存のコレクション オブジェクトにインポートできます。

型指定された XML と型指定されていない 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>

上記のスキーマは、データベースに格納できる、異なる型のコンポーネントを示しています。 これには、 SomeAttributeSomeTypeOrderTypeCustomerTypeCustomerOrderCustomerIDOrderIDOrderDateRequiredDate、および ShippedDateがあります。

コンポーネント カテゴリ

データベースに格納されるスキーマ コンポーネントは、次のように分類されます。

  • ELEMENT

  • ATTRIBUTE

  • TYPE (単純型用または複合型用)

  • ATTRIBUTEGROUP

  • MODELGROUP

次に例を示します。

  • SomeAttribute は ATTRIBUTE コンポーネントです。

  • SomeTypeOrderType、および CustomerType は TYPE コンポーネントです。

  • Customer は ELEMENT コンポーネントです。

データベースにスキーマをインポートする場合、SQL Serverはスキーマ自体を格納しません。 代わりに、 SQL Server によって個々のさまざまなコンポーネントが格納されます。 つまり、 <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 により、XML スキーマ コレクション S に対して REFERENCES 権限を持っていますが、S に対する他の権限は持っていないとします。ユーザー A は、スキーマ コレクション S に対する REFERENCES 権限をユーザー B に許可することができます。

セキュリティ モデルでは、XML スキーマ コレクションを作成および使用する権限を許可したり、あるユーザーから他のユーザーに所有権を転送することが許可されています。 次の記事では、XML スキーマ コレクションのアクセス許可について説明します。

XML スキーマとスキーマ コレクションに関する情報を取得する

カタログ ビュー sys.xml_schema_collections には XML スキーマ コレクションが列挙されます。 XML スキーマ コレクション sys は、システムによって定義されます。 このコレクションには、すべてのユーザー定義 XML スキーマ コレクションで明示的に読み込むことなく使用できる定義済みの名前空間が含まれています。 この一覧には、および xdtxsixmlxsfn名前空間が含まれています。 他の 2 つのカタログ ビューは であり sys.xml_schema_namespaces、各 XML スキーマ コレクション内のすべての名前空間を列挙し sys.xml_components、各 XML スキーマ内のすべての XML スキーマ コンポーネントを列挙します。

組み込みの関数 XML_SCHEMA_NAMESPACEである は schemaName, XmlSchemacollectionName, namespace-urixml データ型インスタンスを生成します。 このインスタンスには、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() の 3 番目の引数として対象になる名前空間を指定することで、コレクション内の個別の XML スキーマを xmlデータ型のインスタンスとして取得できます。 次の例を参照してください。

XML スキーマ コレクションから指定したスキーマを出力する

次のステートメントは、リレーショナル スキーマ内の XML スキーマ コレクションmyCollectionから、ふりターゲット名前空間https://www.microsoft.com/was-booksを持つ XML スキーマを出力しますdbo

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

XML スキーマのクエリを実行する

XML スキーマ コレクションに読み込んだ XML スキーマには、次のようにしてクエリを実行できます。

  • XML スキーマ名前空間のカタログ ビューに対する Transact-SQL クエリを記述します。

  • xml データ型の列を含むテーブルを作成し、その列に XML スキーマを保存して XML 型のシステムに読み込みます。 その後、 xml データ型のメソッドを使用して XML 列にクエリを実行できます。 また、この列に XML インデックスを作成することもできます。 ただしこの方法を使用する場合は、XML 列に保存されている XML スキーマと XML 型のシステムとの整合性をアプリケーションで保つ必要があります。 たとえば、XML 型のシステムから XML スキーマ名前空間を削除する場合、整合性を保つためにテーブルからもその名前空間を削除する必要があります。

関連項目