[sql server] 分區視圖修改基表的問題

來源:互聯網
上載者:User
[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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.