2

私は SQL Server 2008 を使用しており、型指定された XML 列を持つテーブルがある POC を実行するのに忙しいです。POC の性質は、そこに格納されるデータに対するニーズが進化するにつれて、XML が時間の経過とともに変化することです。(データを DB に永続化するために C# でオブジェクトをシリアル化しています)

ただし、監査目的で古い XML をテーブルに保持し、更新されたスキーマで正しく追加された新しい XML を検証できるようにする必要があります。

コレクションからスキーマを削除し、更新 (この場合は必須属性を追加) し、コレクションに追加してから、それが属する列にバインドしようとしました。そうするとき、新しい属性が含まれていないため、列に既にある XML が検証に失敗するという検証エラーが発生します。

XML 列を更新して新しいスキーマを使用し、列に既に格納されている XML を無視する方法はありますか? または、新しいスキーマを XML 列に追加する際に検証を無効にすることは可能でしょうか?

4

1 に答える 1

4

スキーマ コレクションでは、検証を無視することなく、さまざまなバージョンの XML データを使用できるようにする必要があります。

まず、 XML スキーマ コレクションをご覧ください。

T-SQL コードには、次のようなものがあります (このコードは、SQLskills.com のBob Beaucheminから提供されています)。

-- Load XML schema from file
DECLARE @x XML
SET @x = (
SELECT * FROM OPENROWSET(
   BULK 'C:\invoice.xsd',
           SINGLE_BLOB
   ) AS x
)

-- And use it to create an XML schema collection
CREATE XML SCHEMA COLLECTION InvoiceType AS @x

次に、列をスキーマ コレクションにマップするテーブルを作成します。

CREATE TABLE invoice_docs (
   invoiceid INTEGER PRIMARY KEY IDENTITY,
   invoice   XML(document InvoiceType)
)

スキーマが変更されたら、新しいバージョンのスキーマを追加してスキーマ コレクションを変更します。

DECLARE @x XML
SET @x = (
SELECT * FROM OPENROWSET(
   BULK 'C:\invoice_v2.xsd',
           SINGLE_BLOB
   ) AS x
)

-- And use it to create an XML schema collection
-- Allow V1 and V2 invoices
ALTER XML SCHEMA COLLECTION InvoiceType ADD @x

テーブルに既に存在する古いデータは古いスキーマに対して検証され、新しいデータは古いスキーマまたは新しいスキーマに対して検証されます。

新しいスキーマに対してのみ検証する場合は、列に制約を追加する必要があります。

于 2013-06-18T18:22:38.673 に答える