分区视图建立后,不能插入记录
按照联机帮助文档上的方法建立了分区视图,两个表放在不同的数据库中,在任何一个库中都可以做查询,但是都不能insert记录,错误为:
UNION ALL 视图 'supEvaluateModel' 不可更新,因为没有找到分区列
我查过前面有人问过同样的问题,但是我在两个库中都不能插入记录,
用邹建的强制修改系统表方法也不行,不知道是不是我的SQL写错了。
系统表sysobjects中也有表的约束那条记录,parent_obj指向的也是对应的表记录的id。
怎么回事啊,YM~~
问题点数:80、回复次数:11Top
1 楼irq001()回复于 2004-11-03 14:50:33 得分 0
详细说下,你是要insert记录到视图中吗?Top
2 楼win1357(斑马贻贝)回复于 2004-11-03 14:56:28 得分 0
是的,我用insert插记录到视图'supEvaluateModel'
supEvaluateModel0和supEvaluateModel1是视图中的表名
CREATE VIEW dbo.supEvaluataModel
AS
SELECT *
FROM Northwind.dbo.supEvaluateModel0
union all
SELECT *
FROM pubs.dbo.supEvaluateModel1Top
3 楼irq001()回复于 2004-11-03 15:05:04 得分 0
你是用的联合啊,你怎么确定要往哪个表中插入记录啊?应该有个标记吧。
在视图中插入记录可以在试图上创建一个INSTEAD OF触发器。Top
4 楼zjcxc(邹建)回复于 2004-11-03 15:15:57 得分 0
建表的脚本写出来Top
5 楼zjcxc(邹建)回复于 2004-11-03 15:16:07 得分 0
应该是你的约束写得不对.Top
6 楼zjcxc(邹建)回复于 2004-11-03 15:23:02 得分 80
--看下面的示例
--示例表
create table tempdb.dbo.t_10(
id int primary key check(id between 1 and 10),name varchar(10))
create table pubs.dbo.t_20(
id int primary key check(id between 11 and 20),name varchar(10))
create table northwind.dbo.t_30(
id int primary key check(id between 21 and 30),name varchar(10))
go
--分区视图
create view v_t
as
select * from tempdb.dbo.t_10
union all
select * from pubs.dbo.t_20
union all
select * from northwind.dbo.t_30
go
--插入数据
insert v_t select 1 ,'aa'
union all select 2 ,'bb'
union all select 11,'cc'
union all select 12,'dd'
union all select 21,'ee'
union all select 22,'ff'
--更新数据
update v_t set name=name+'_更新' where right(id,1)=1
--删除测试
delete from v_t where right(id,1)=2
--显示结果
select * from v_t
go
--删除测试
drop table northwind.dbo.t_30,pubs.dbo.t_20,tempdb.dbo.t_10
drop view v_t
/*--测试结果
id name
----------- ----------
1 aa_更新
11 cc_更新
21 ee_更新
(所影响的行数为 3 行)
==*/Top
7 楼win1357(斑马贻贝)回复于 2004-11-03 15:40:28 得分 0
上面的示例可以正确使用,谢谢
我是在企业管理器的设计表中设置check约束的,不知道这样为什么就不行。Top
8 楼zjcxc(邹建)回复于 2004-11-03 15:57:39 得分 0
生成表结构脚本出来看看,看少了什么.Top
9 楼win1357(斑马贻贝)回复于 2004-11-03 16:10:53 得分 0
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[supEvaluateModel0]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[supEvaluateModel0]
GO
CREATE TABLE [dbo].[supEvaluateModel0] (
[OID] [nvarchar] (40) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[ModelName] [nvarchar] (40) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[OrgGuid] [nvarchar] (40) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[ModelDesc] [nvarchar] (40) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[ModelStatus] [int] NOT NULL ,
[Modeltype] [int] NOT NULL
) ON [PRIMARY]
GO
没有设置的约束,但是我设置了OID的check为OID>10的。
是不是在表设计时忽略了什么东西Top
10 楼zjcxc(邹建)回复于 2004-11-03 16:12:48 得分 0
用SQL语句建表,把它加上去.Top
11 楼win1357(斑马贻贝)回复于 2004-11-03 16:20:53 得分 0
好,谢谢Top




