关于sql里触发器的“一些”问题

hawaii_wx 2005-01-23 05:51:03
有表student:并插入记录,
create table student
(id int,
name varchar(5))
go
insert into student values(1,'aaa')
insert into student values(2,'bbb')
insert into student values(3,'ccc')
insert into student values(4,'ddd')
insert into student values(5,'dfg')
select * from student
有表score:并插入记录
create table score
(id int,
vc int,
vb int,
sql int)
go
insert into score values(1,100,80,90)
insert into score values(2,100,80,90)
insert into score values(3,100,80,90)
insert into score values(4,100,80,90)
insert into score values(5,52,45,20)
select * from score
2个表没有建立关系,现有基于以上2个表的视图:stu_sre
create view stu_sre
as
select s.id,name,vc,vb,sql from student s,score sc
where s.id=sc.id
go
问题是针对这个视图做的触发器:
问题1:用instead of做的触发器是不是可以把insert和delete和update三种类型(针对视图)都写在一个触发器里?请写个例子!谢谢!
问题2:下面的代码写的是insert类型的触发器,但是只能是插入全部字段的记录才可以,怎样才可以写个我想插入那个字段的记录就插入那个字段的记录?
create trigger in_stu_sre
on stu_sre
instead of insert
as
declare @sid int
declare @sname varchar(4)
declare @svc int
declare @svb int
declare @ssql int
select @sid=id, @sname=name,@svc=vc @svb=vb, @ssql=sql from inserted
insert into student values(@sid,@sname)
insert into score values(@sid,@svc,@svb,@ssql)
go
insert into stu_sre values(7,'xuxu',10,20,30)
...全文
154 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lishengyu 2005-01-23
  • 打赏
  • 举报
回复
select * into #xx from mm
SQL语法 #xx 也是一个表名,不要误以为是列名
hawaii_wx 2005-01-23
  • 打赏
  • 举报
回复
mschen(Visual【陈】) :你的代码里
create TRIGGER SAL_AccountInfo_v1_iud ON [dbo].我的视图
instead of insert ,delete ,update
AS
select Account_code,Account_name into #i from inserted
select Account_code,Account_name into #d from deleted
exec('delete from 目标表 where exists(select * from #d where Account_code=目标表.cCusCode)')
里面第3行里#d好像表示的是一个列名,但是第4行里#d好像又表示一个表名(from #d where)
可以告诉我下是为什么吗?
hawaii_wx 2005-01-23
  • 打赏
  • 举报
回复

那先谢谢你了
hawaii_wx 2005-01-23
  • 打赏
  • 举报
回复
楼上的高手,告诉下第二个问题的怎么办好吗?
mschen 2005-01-23
  • 打赏
  • 举报
回复
想插入哪个字段的记录就插入哪个,在触发器里边无法进行判断?不知道有没有办法了!
mschen 2005-01-23
  • 打赏
  • 举报
回复
--当然可以放在一起.但是每一个instead of触发动作只能有一个触发器.下边是我收集的一个例子.

create table 源表(Account_code int,Account_name varchar(10))
create table 目标表(cCusCode int,cCusName varchar(10))
go

--测试的视图
create view 我的视图
as
select * from 源表
go

--触发器,实现的功能是对视图的操作的转移.

create TRIGGER SAL_AccountInfo_v1_iud ON [dbo].我的视图
instead of insert ,delete ,update
AS
select Account_code,Account_name into #i from inserted
select Account_code,Account_name into #d from deleted
exec('delete from 目标表 where exists(select * from #d where Account_code=目标表.cCusCode)')
exec('insert into 目标表 (cCusCode,cCusName) select * from #i')
go

--插入数据进行测试
insert 我的视图 values(1,'aa')
insert 我的视图 select 2,'bb' union all select 3,'cc'
--目标表中也会插入数据

insert into 源表 values(1,'aa')
insert 源表 select 2,'bb' union all select 3,'cc'

delete from 我的视图 where Account_code=4
--目标表中不会删除数据,因为触发了触发器,但是没有找到符合条件的记录.
go
hawaii_wx 2005-01-23
  • 打赏
  • 举报
回复
各位高手,我可以加分的,可以不可以告诉我下答案呀
hawaii_wx 2005-01-23
  • 打赏
  • 举报
回复
楼上的兄弟,如果你说近可能不用游标我还信,如果你说不用触发器我就有点怀疑了!
芒果 2005-01-23
  • 打赏
  • 举报
回复
近可能不要用触发器!!!
lishengyu 2005-01-23
  • 打赏
  • 举报
回复
up 顶
hawaii_wx 2005-01-23
  • 打赏
  • 举报
回复
是不是我问的问题太简单,你们不屑回答呀?
郭大侠_ 2005-01-23
  • 打赏
  • 举报
回复
帮你顶!
hawaii_wx 2005-01-23
  • 打赏
  • 举报
回复
怎么没人呀??

34,576

社区成员

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

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