[sql server] 分区视图修改基表的问题
-- 1 问题整理
---首先 兄弟我创建了两张表
CREATE TABLE [WORK_DETAIL_H] (
[ID] [int] NOT NULL ,
[LB] [VARCHAR](2) NOT NULL CHECK (LB = 'H') ,
[FXPH] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL
primary key (id,lb)
)
GO
CREATE TABLE [WORK_DETAIL_S] (
[ID] [int] NOT NULL ,
[LB] [VARCHAR](2) NOT NULL CHECK (LB = 'S') ,
[FXPH] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL
primary key (id,lb)
)
GO
---其次 兄弟我创建分区视图
create view view_WORK_DETAIL
as
select * from WORK_DETAIL_H
union all
select * from WORK_DETAIL_S
---然后我插入数据
insert into view_WORK_DETAIL values(2,'H','09H001')
--
(所影响的行数为 1 行)
------------然后下面来问题了
--如果我通过企业管理器 更改这两张基础表的 fxph字段为 not null
--然后执行下
alter view view_WORK_DETAIL
as
select * from WORK_DETAIL_H
union all
select * from WORK_DETAIL_S
---接着执行
insert into view_WORK_DETAIL values(1,'h','09H001')
--就出错了
-- UNION ALL 视图 'view_WORK_DETAIL' 不可更新,因为没有找到分区列。
-- 2 原因查找
--如果是通过sql server企业管理器(2000) 或 SSMS (2005)修改表时可能产生的影响
--比如修改字段 [FXPH] 从 NULL -〉 NOT NULL,得到的修改语句为如下:
/* 为了防止任何可能出现的数据丢失问题,您应该先仔细检查此脚本,然后再在数据库设计器的上下文之外运行此脚本。*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_WORK_DETAIL_H
(
ID int NOT NULL,
LB varchar(2) NOT NULL,
FXPH varchar(20) NULL
) ON [PRIMARY]
GO
IF EXISTS(SELECT * FROM dbo.WORK_DETAIL_H)
EXEC('INSERT INTO dbo.Tmp_WORK_DETAIL_H (ID, LB, FXPH)
SELECT ID, LB, FXPH FROM dbo.WORK_DETAIL_H WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.WORK_DETAIL_H
GO
EXECUTE sp_rename N'dbo.Tmp_WORK_DETAIL_H', N'WORK_DETAIL_H', 'OBJECT'
GO
ALTER TABLE dbo.WORK_DETAIL_H ADD CONSTRAINT
PK__WORK_DETAIL_H__0CD0C267 PRIMARY KEY CLUSTERED
(
ID,
LB
) ON [PRIMARY]
GO
ALTER TABLE dbo.WORK_DETAIL_H WITH NOCHECK ADD CONSTRAINT
CK__WORK_DETAIL___LB__0DC4E6A0 CHECK (([LB] = 'H'))
GO
COMMIT
--其中对分区视图产生影响的是在添加Check约束时,采用了with NOCHECK(约束参考)的方式,
--即上面最后那句,导致了再次对视图进行isnert时会提示,其内部原因不详
/*
消息 4436,级别 16,状态 12,第 1 行
UNION ALL 视图 'view_WORK_DETAIL' 不可更新,因为没有找到分区列。
*/
-- 3 更正措施,使约束check一次
Alter Table WORK_DETAIL_H with check Check Constraint all
Alter Table WORK_DETAIL_S with check Check Constraint all
附原问题贴:http://topic.csdn.net/u/20100713/15/3526bf42-b46c-4a0d-bc7c-e961118acd30.html?seed=453101024&r=66937691#r_66937691