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 番目のメンバーに指定されている名前空間の名前に関するスキーマ・ロケーション・ヒントです。
例えば、次のスキーマ・ロケーション属性があるとします。
このペアの 1 番目のメンバー (http://www.example.com/PO2) は、名前空間の名前です。 このペアの 2 番目のメンバー (http://www.example.com/PO4.xsd) は、スキーマ・ロケーション・ヒントを示す URI です。xsi:schemaLocation="http://www.example.com/PO2 http://www.example.com/PO4.xsd"Db2 は、スキーマ・ロケーション・ヒントを使用して、次のように XML スキーマを選択します。
- ルート・エレメント・ノードに xsi:schemaLocation 属性が含まれている場合、Db2 は、その属性値から、ルート・エレメント・ノードの名前空間名に一致する名前空間名を持つスキーマ・ロケーション・ヒントを検索します。
- Db2 がスキーマの場所のヒントを見つけた場合、 Db2 は、そのヒントを使用して、スキーマの場所のURIがスキーマの場所のヒントと同一であるXMLスキーマを特定します。 Db2 入力文書をそのスキーマに対して検証します。
- ルート・エレメントに xsi:schemaLocation 属性が含まれていない場合、または xsi:schemaLocation 属性に、ルート・エレメント・ノードの名前空間名に一致する名前空間名を持つスキーマ・ロケーション・ヒントが含まれていない場合、Db2 は、ターゲット名前空間が同じであり、かつ最新の登録タイム・スタンプを持つ XML スキーマを使用します。
推奨 :インスタンス文書にスキーマの場所のヒントを含めることで、正しいXMLスキーマの特定を簡素化します。 - XML インスタンス文書のルート・エレメントに名前空間名が含まれていない場合、妥当性検査で使用できるのは、ターゲット名前空間名がない XML スキーマのみになります。 Db2 XMLスキーマを次のように選択します
- XML タイプ修飾子に、ターゲット名前空間を持たない XML スキーマが 1 つだけある場合、Db2 はこの XML スキーマを妥当性検査に使用します。
- XML タイプ修飾子に、ターゲット名前空間を持たない XML スキーマが複数あり、XML インスタンス文書に xsi:noNamespaceSchemaLocation 属性が含まれている場合、Db2 は、スキーマ・ロケーション・ヒントである xsi:noNamespaceSchemaLocation の値を使用して XML スキーマを選択します。
- ルート・エレメントに 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 を使用します。 |