使用新架构更新XML列架构

时间:2013-06-18 09:09:19

标签: xml sql-server-2008 xsd schema

我正在使用SQL Server 2008并忙着做POC,其中我有一个带有类型XML列的表。 POC的本质是,随着我们对存储在其中的数据的需求的演变,XML将随着时间的推移而发生变化。 (我们在C#中序列化对象以将数据持久保存到数据库中)

但是,我需要在表中保留旧的XML以用于审计目的,并且能够验证使用更新的模式正确添加到其中的任何新XML。

我尝试从集合中删除模式,更新它(在这种情况下添加必需的属性),将其添加回集合,然后将其绑定到它所属的列。这样做时,我只得到一个验证错误,即列中已有的XML未通过验证,因为它不包含新属性。

有没有办法更新XML列以使用新的Schema并忽略已存储在列中的XML?或者在将新模式添加到XML列时是否可以禁用验证?

1 个答案:

答案 0 :(得分:4)

架构集合应该允许您拥有不同版本的XML数据,而不必忽略验证。

首先看一下XML Schema Collections

在你的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

表中已有的旧数据将根据旧架构进行验证,任何新数据都将针对旧的新架构进行验证。

如果您只想针对较新的架构进行验证,则必须向该列添加其他约束。

相关问题