[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