[sql server] 分区视图修改基表的问题

[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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值