设为首页 收藏本站
查看: 1392|回复: 0

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

[复制链接]

尚未签到

发表于 2016-11-5 05:14:33 | 显示全部楼层 |阅读模式
[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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-295820-1-1.html 上篇帖子: SQL Server 存储层级数据实现无限级分类 下篇帖子: [MSSQL]SQL Server 2008 Using the MERGE statement
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表