Db2 による XML タイプ修飾子からの XML スキーマの選択方法

XML タイプ修飾子には複数の XML スキーマを指定できます。 XML 列に挿入するか、または XML 列を更新すると、Db2 妥当性検査を実行する XML スキーマを 1 つ選択します。

Db2 は、以下のプロセスで、使用する XML スキーマを決定します。

  • 更新操作の場合、XML タイプ修飾子に指定されている XML スキーマが既に更新前の文書の妥当性検査に使用されている場合、Db2 は同じ XML スキーマを使用して更新後の文書の妥当性検査を行います。
  • 妥当性検査対象文書 (XML インスタンス文書 ) のルート・エレメント・ノードの名前空間の名前に一致するターゲット名前空間を持つ XML スキーマが 1 つのみの場合、Db2 はこの XML 文書の妥当性検査に使用するスキーマとしてその XML スキーマを選択します。
  • ルート・エレメントの名前空間の名前に一致するターゲット名前空間を持つ XML スキーマが複数存在する場合、Db2スキーマ・ロケーション・ヒントを使用して XML スキーマを選択します。 XML インスタンス文書のルート・エレメント・ノードには xsi:schemaLocation 属性を指定できます。 この属性では、1 つ以上の URI 参照のペアが空白文字で区切られています。 各ペアの 1 番目のメンバーは名前空間の名前、2 番目のメンバーはその名前空間に対応する適切なスキーマ文書を検索する場所を記述する URI です。 各ペアの 2 番目のメンバーは、1 番目のメンバーに指定されている名前空間の名前に関するスキーマ・ロケーション・ヒントです。

    例えば、次のスキーマ・ロケーション属性があるとします。

    xsi:schemaLocation="http://www.example.com/PO2 http://www.example.com/PO4.xsd"
    このペアの 1 番目のメンバー (http://www.example.com/PO2) は、名前空間の名前です。 このペアの 2 番目のメンバー (http://www.example.com/PO4.xsd) は、スキーマ・ロケーション・ヒントを示す URI です。

    Db2 は、スキーマ・ロケーション・ヒントを使用して、次のように XML スキーマを選択します。

    1. ルート・エレメント・ノードに xsi:schemaLocation 属性が含まれている場合、Db2 は、その属性値から、ルート・エレメント・ノードの名前空間名に一致する名前空間名を持つスキーマ・ロケーション・ヒントを検索します。
    2. Db2 がスキーマの場所のヒントを見つけた場合、 Db2 は、そのヒントを使用して、スキーマの場所のURIがスキーマの場所のヒントと同一であるXMLスキーマを特定します。 Db2 入力文書をそのスキーマに対して検証します。
    3. ルート・エレメントに xsi:schemaLocation 属性が含まれていない場合、または xsi:schemaLocation 属性に、ルート・エレメント・ノードの名前空間名に一致する名前空間名を持つスキーマ・ロケーション・ヒントが含まれていない場合、Db2 は、ターゲット名前空間が同じであり、かつ最新の登録タイム・スタンプを持つ XML スキーマを使用します。
    推奨 :インスタンス文書にスキーマの場所のヒントを含めることで、正しいXMLスキーマの特定を簡素化します。
  • XML インスタンス文書のルート・エレメントに名前空間名が含まれていない場合、妥当性検査で使用できるのは、ターゲット名前空間名がない XML スキーマのみになります。 Db2 XMLスキーマを次のように選択します
    1. XML タイプ修飾子に、ターゲット名前空間を持たない XML スキーマが 1 つだけある場合、Db2 はこの XML スキーマを妥当性検査に使用します。
    2. XML タイプ修飾子に、ターゲット名前空間を持たない XML スキーマが複数あり、XML インスタンス文書に xsi:noNamespaceSchemaLocation 属性が含まれている場合、Db2 は、スキーマ・ロケーション・ヒントである xsi:noNamespaceSchemaLocation の値を使用して XML スキーマを選択します。
    3. ルート・エレメントに xsi:noNamespaceSchemaLocation 属性が含まれていないか、またはスキーマ・ロケーション・ヒントが XML タイプ修飾子のどの XML スキーマのスキーマ・ロケーション URI とも一致しない場合、Db2 は、ターゲット名前空間を持たない XML スキーマの中で、最新の登録タイム・スタンプを持つ XML スキーマを使用します。

例: XML スキーマ・リポジトリー (XSR) に次の XML スキーマが含まれているとします。

XML スキーマ名 ターゲット名前空間 スキーマ・ロケーション スキーマが XSR に登録されたときの タイム・スタンプ
PO1 http://www.example.com/PO1 http://www.example.com/PO1.xsd 2008-10-01 10:30:59.0100
PO2 http://www.example.com/PO2 http://www.example.com/PO2.xsd 2009-09-25 13:15:00.0200
PO3 名前空間なし http://www.example.com/PO3.xsd 2009-06-25 13:15:00.0200
PO4 http://www.example.com/PO2 http://www.example.com/PO4.xsd 2009-10-25 13:15:00.0200

また、表 PURCHASEORDERV5 が次のように定義されているとします。

CREATE TABLE PURCHASEORDERV5(
 ID INT NOT NULL,
 CONTENT XML(XMLSCHEMA ID SYSXSR.PO1, ID SYSXSR.PO2,
 ID SYSXSR.PO3, ID SYSXSR.PO4))

以下の INSERT ステートメントを実行します。

INSERT INTO PURCHASEORDERV5 VALUES(1,                        1 
 '<po:purchaseOrder xmlns:po="http://www.example.com/PO1">
 …
 </po:purchaseOrder>'
);
INSERT INTO PURCHASEORDERV5 VALUES(2,                        2 
 '<po:purchaseOrder xmlns:po="http://www.example.com/PO2"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.example.com/PO2
 http://www.example.com/PO2.xsd">
 …
 </po:purchaseOrder>');                                     
INSERT INTO PURCHASEORDERV5 VALUES(2,                        3 
 '<po:purchaseOrder xmlns:po="http://www.example.com/PO2"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.example.com/PO2
 http://www.example.com/PO4.xsd">
 …
 </po:purchaseOrder>');
INSERT INTO purchase_orders VALUES(3,                        4 
 '<purchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="http://www.example.com/PO3.xsd">
 …
 </purchaseOrder>');

Db2 で使用される XML スキーマと、各スキーマを使用する理由を次の表に示します。

INSERT ステートメント番号 選択されている順序で妥当性検査に使用される XML スキーマ 理由
1 PO1 インスタンス文書のルート・エレメントの名前空間名は http://www.example.com/PO1 です。 この名前は、XML スキーマ PO1のターゲット名前空間のみと一致します。
2 PO2, PO4 インスタンス文書のルート・エレメントの名前空間名は http:// www.example.com/PO2 です。これは、XML スキーマ PO2 と PO4 のターゲット名前空間と一致します。 インスタンス文書のルート・エレメントには、xsi:schemaLocation 属性も含まれています。この属性の値は、スキーマ・ロケーション・ヒント http://www.example.com/PO2.xsd を示しています。 このスキーマ・ロケーション・ヒントは、XML スキーマ PO2 のスキーマ・ロケーションと一致します。 したがって、Db2 は PO2 を選択して、インスタンス文書の妥当性検査を行います。 PO2 を使用した妥当性検査が失敗した場合、Db2 は PO4 を使用します。
3 PO4, PO2 インスタンス文書のルート・エレメントの名前空間名は http:// www.example.com/PO2 です。これは、XML スキーマ PO2 と PO4 のターゲット名前空間と一致します。 インスタンス文書のルート・エレメントには、xsi:schemaLocation 属性が含まれています。この属性の値は、スキーマ・ロケーション・ヒント http://www.example.com/PO4.xsd を示しています。 このスキーマ・ロケーション・ヒントは、XML スキーマ PO4 のスキーマ・ロケーションと一致します。 したがって、Db2 は PO4 を選択して、インスタンス文書の妥当性検査を行います。 PO4 を使用した妥当性検査が失敗した場合、Db2 は PO2 を使用します。
4 PO3 インスタンス文書のルート・エレメントには名前空間名が含まれていません。 XML スキーマ PO3 には、ターゲット名前空間がありません。 したがって、Db2 は妥当性検査に PO3 を使用します。