请问在视图中使用触发器插入数据的方法?

waterflier 2004-06-14 03:27:42
原来的数据库是access的,后来转成了sqlserver.
   数据库中存储了不同类型的单位数据,有一张AllUnit表,存储的是所有单位的共同属性,包括名称,SN,还有一个自动增长的ID.另外还有2张表,S_GovUnits,S_OtherUnits,通过ID与AllUnit保持关联,保存了作为2种不同类型的单位的附加信息.在使用access数据库的时候为GovUnit和OtherUnit分别建立了视图GovUnit,OtherUnit,在程序中操作数据都是针对这2个视图进行的(从程序的角度根本就看不出这个是表还是视图,有很多的插入,更新,删除操作).转使用sqlserver后,重新建立了视图,但是只能读取数据了...原因看帮助说是不能同时更新2张基表(那我还更新干什么...)如要更新需要建立触发器.我对SQL的存储过程没什么研究,看了很多关于触发器的资料都不得解.我该如何写这个触发器(简单起见AllUnit中只有2个字段(id,unitname),S_GovUnit有(id,govsysid),S_OtherUnit有(id,ownergovid).谢谢各位了~
...全文
316 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
waterflier 2004-06-30
  • 打赏
  • 举报
回复
谢谢~ 今天先结帖了:)不明白的地方还往大斑竹继续指教~
zjcxc 元老 2004-06-29
  • 打赏
  • 举报
回复
我只写了其中一个视图,另一个视图的处理类似
zjcxc 元老 2004-06-29
  • 打赏
  • 举报
回复
--示例

--数据表
create table AllUni(id int identity(1,1) primary key,unitname varchar(10))

create table S_GovUnit(id int,govsysid varchar(10))

create table S_OtherUnit(id int,ownergovid varchar(10))
go

-- S_GovUnits 的视图
create view v_S_GovUnits
as
select a.id,a.unitname,b.govsysid
from AllUni a join S_GovUnit b on a.id=b.id
go

-- S_GovUnits 视图上的处理触发器
create trigger tr_insert on v_S_GovUnits
instead of insert --新增处理
as
declare @unitname varchar(10),@govsysid varchar(10)
declare tb cursor local for
select unitname,govsysid from inserted
open tb
fetch tb into @unitname,@govsysid
while @@fetch_status=0
begin
insert AllUni(unitname) select @unitname
insert S_GovUnit select scope_identity(),@govsysid
fetch tb into @unitname,@govsysid
end
close tb
deallocate tb
go

create trigger tr_delete on v_S_GovUnits
instead of delete --删除处理
as
delete a from S_GovUnit a
where exists(select 1 from deleted where id=a.id)

delete a from AllUni a
where exists(select 1 from deleted where id=a.id)
go

create trigger tr_update on v_S_GovUnits
instead of update --更新处理
as
update AllUni set unitname=i.unitname
from AllUni a join inserted i on i.id=a.id

update S_GovUnit set govsysid=i.govsysid
from S_GovUnit a join inserted i on i.id=a.id
go

--删除测试
drop view v_S_GovUnits
drop table S_GovUnit,S_OtherUnit,AllUni
waterflier 2004-06-29
  • 打赏
  • 举报
回复
可以简化一下写~
waterflier 2004-06-29
  • 打赏
  • 举报
回复
那么这个触发器应该怎么写呢?我在2张表中都是以 id为主健的.只不过AllUnit表的id是自动生成的.谢谢了~
zjcxc 元老 2004-06-29
  • 打赏
  • 举报
回复
如果不可以,再在视图中建触发器解决,这样也不要改程序中的处理方法.
zjcxc 元老 2004-06-29
  • 打赏
  • 举报
回复
在你的两张表中都建立主键,应该可以
zheninchangjiang 2004-06-29
  • 打赏
  • 举报
回复
不管怎么你都要改了
waterflier 2004-06-19
  • 打赏
  • 举报
回复
可是我必须要对该视图进行插入操作,否则会引起源代码的大量修改.原来选定的数据库是access,没有这个问题所以代码就一路写下去了.如果想避开这个问题就不会在这里提问了.
waterflier 2004-06-18
  • 打赏
  • 举报
回复
移动到这边来看看~
cloudchen 2004-06-18
  • 打赏
  • 举报
回复
尽量不要对视图进行插入、更新、删除操作,更不要建触发器。

直接对表进行操作
pjy 2004-06-18
  • 打赏
  • 举报
回复
对表建触发器,对表作数据操作!
视图就是一个SQL的SELECT语句,他会动态的从表中取实际记录,所以记录会根据表的内容更新的!
skyboy0720 2004-06-18
  • 打赏
  • 举报
回复
表更新后,视图是会自动更新的!
skyboy0720 2004-06-18
  • 打赏
  • 举报
回复
插入数据对表操作,为什么要对视图操作?!用视图浏览信息就可以了啊!
waterflier 2004-06-15
  • 打赏
  • 举报
回复
还是没人?顶!
waterflier 2004-06-14
  • 打赏
  • 举报
回复
怎么没人啊~很难吗?

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧