分区视图的更新碰到一个非常奇怪的问题"视图'InOutMAdd'不可更新,因为没有找到分区列"

为方便大家解决这个问题,我将两个数据库文件分离出来,大家只要直接附加到你的服务器就可以了。
一个数据库在correct子目录下,一个在error子目录下。
附加后,correct子目录下的文件附加为yrPOS数据库。
error子目录下的文件附加为testXLJpso数据库。

这两个数据库的结构完全一样,至少我找不出不一样的地方。但是非常奇怪的就是,yrPOS数据库中的视图InOutMAdd可以增加修改数据;但是testXLJpso的视图InOutMAdd一增加数据就提示下面这个错误:
《UNION ALL 视图'InOutMAdd'不可更新,因为没有找到分区列》

结构说明如下:
数据库中只有两个表:InOutM2003和InOutM2004,表中包含三个列:cIOGuid、iSubYear、cIONo,其中cIOGuid、iSubYear为主键;iSubYear为分区列,InOutM2003中的iSubYear限定为2003,InOutM2004中的iSubYear限定为2004。
包含了一个视图InOutMAdd,这个视图很简单,结构如下:
SELECT *
FROM InOutM2003
UNION ALL
SELECT *
FROM InOutM2004
受InOutM2003,InOutM2004的限制,InOutMAdd中增加数据时iSubYear只能为2003或者2004

这个数据库是我做的一个系统经过大幅度简化后的咚咚,我花了两天的时间还是没搞明白怎么会有这种问题。

发现原因的朋友请告知[email protected]一声,不胜感激。

相关文件在此下载
http://www.xmqhx.com/WriteView.rar
---------------------------------------------------------------
--原因是约束被禁用了,所以提示找不到分区列

--启用这些约束就行了
ALTER TABLE InOutM2004 CHECK CONSTRAINT ALL
ALTER TABLE InOutM2003 CHECK CONSTRAINT ALL
go

-------------------------------------------------------------------
--如果还是不行,可以通过强制修改系统表来实现

exec SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE
go

update sysobjects set status=6
where xtype='C' and parent_obj in(object_id('InOutM2004'),object_id('InOutM2003'))
go

exec SP_CONFIGURE 'ALLOW UPDATES',0 RECONFIGURE WITH OVERRIDE
go

------------------------------------------------------------------

--或者重建约束也行

ALTER TABLE [dbo].[InOutM2003] DROP CONSTRAINT [CK__InOutM200__iSubY__25DB9BFC]
ALTER TABLE [dbo].[InOutM2003] ADD CONSTRAINT [CK__InOutM200__iSubY__25DB9BFC] CHECK ([iSubYear] = 2003)
ALTER TABLE [dbo].[InOutM2004] DROP CONSTRAINT [CK__InOutM200__iSubY__3AD6B8E2]
ALTER TABLE [dbo].[InOutM2004] ADD CONSTRAINT [CK__InOutM200__iSubY__3AD6B8E2] CHECK ([iSubYear] = 2004)

Published At
Categories with 数据库类
comments powered by Disqus