Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用新模式更新XML列模式_Xml_Sql Server 2008_Xsd_Schema - Fatal编程技术网

使用新模式更新XML列模式

使用新模式更新XML列模式,xml,sql-server-2008,xsd,schema,Xml,Sql Server 2008,Xsd,Schema,我正在使用SQLServer2008并忙于进行POC,其中我有一个带有类型化XML列的表。POC的本质是,随着我们对存储在其中的数据的需求的发展,XML将随着时间的推移而变化。(我们正在C#中序列化对象以将数据持久化到数据库) 但是,为了审计的目的,我需要将旧的XML保留在表中,并且能够验证使用更新的模式正确添加到表中的任何新XML 我尝试从集合中删除模式,更新它(在本例中添加必需的属性),将其添加回集合,然后将其绑定到它所属的列。执行此操作时,我只得到一个验证错误,即列中已经存在的XML未通过

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

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

我尝试从集合中删除模式,更新它(在本例中添加必需的属性),将其添加回集合,然后将其绑定到它所属的列。执行此操作时,我只得到一个验证错误,即列中已经存在的XML未通过验证,因为它不包含新属性


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

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

首先看一看

在您的T-SQL代码中,您会有如下内容(此代码来源于SQLskills.com):

现在创建一个表,将列映射到架构集合:

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
表中已有的旧数据将根据旧模式进行验证,任何新数据都将根据旧的新模式进行验证


如果只想针对较新的架构进行验证,则必须向列添加一个附加约束。

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

首先看一看

在您的T-SQL代码中,您会有如下内容(此代码来源于SQLskills.com):

现在创建一个表,将列映射到架构集合:

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
表中已有的旧数据将根据旧模式进行验证,任何新数据都将根据旧的新模式进行验证


如果只想针对较新的模式进行验证,则必须向列添加一个附加约束。

好的,我认为POC的这一部分可能会失败。根据Jacob Sebastion在第38页的《XSD的艺术》一书中的说法,我试图做的是不可能的。你如何修改模式?你正在版本化吗?是的,我正在版本化。我将旧版本保留在schema集合中,但只将最新版本绑定到XML列。根据Jacob Sebastion在第38页的《XSD的艺术》一书中的说法,我试图做的是不可能的。你如何修改模式?你正在版本化吗?是的,我正在版本化。我将旧版本保留在模式集合中,但只将最新版本绑定到XML列。谢谢你的回答。我发现我做错了什么…每次我的模式改变时,我都会创建一个新的模式集合,然后改变表以使用新的模式集合。是的,每次都会这样。很高兴我能提供帮助。尝试使用上述ALTER语句添加第二个更新版本的架构时返回错误
,不允许更改现有架构组件。试图修改现有的XML架构组件,组件命名空间:'http://www.domain.com/MyNameSpace'组件名称:'MyElementName'组件种类:元素
。显然,同一架构名称空间不能有两个版本。如何支持“相同”(但已升级)架构的多个版本?或者你是在建议每个模式的名称空间应该不同吗?嗨,Randolph。谢谢你的回答。我发现我做错了什么…每次我的模式改变时,我都会创建一个新的模式集合,然后改变表以使用新的模式集合。是的,每次都会这样。很高兴我能提供帮助。尝试使用上述ALTER语句添加第二个更新版本的架构时返回错误
,不允许更改现有架构组件。试图修改现有的XML架构组件,组件命名空间:'http://www.domain.com/MyNameSpace'组件名称:'MyElementName'组件种类:元素
。显然,同一架构名称空间不能有两个版本。如何支持“相同”(但已升级)架构的多个版本?或者您是在建议每个模式的名称空间应该不同?