当前位置: 代码迷 >> Sql Server >> 关于after触发器的有关问题
  详细解决方案

关于after触发器的有关问题

热度:21   发布时间:2016-04-27 14:56:34.0
关于after触发器的问题
after触发器能否对 表里某一项里面的内容插入或更新之后 触发 
比如 说有这么两个表
借阅信息 归还书籍
图书编号 char(50) 图书编号 char(50)  
借书证号 char(50) 借书证号 char(50)
借书时间 smalldatetime 借书时间 smalldatetime
应还时间 smalldatetime 归还时间 smalldatetime
归还时间 smalldatetime
已借书数目 smallint
可借书数目 smallint


能不能实现在 借阅信息中的归还时间被插入后 将 图书编号 借书证号 借书时间 归还时间 输入到 归还书籍 表中 
由于已经有一个类似的触发器用于另一个表了 所以说如果不能实现以上要求的话 是不是只能另建一表用于归还书籍表了?
请各位指点一下 谢谢

------解决方案--------------------
这个能实现,我有一个简单的例子,你可以参考一下:
--创建触发器实现删除主表中的数据时自动删除附表中的数据:

--创建表tbl_stu:
create table tbl_stu(
stuid varchar(15) primary key,
stuname varchar(20) not null
)

--插入数据:
insert into tbl_stu values('200911076','李白和')
insert into tbl_stu values('200911077','王洪洋')

--创建表tbl_score:
create table tbl_score(
stuid varchar(15) 
foreign key 
references tbl_stu(stuid)
not null,
Math int default(0)
)

--插入数据:
insert into tbl_score values('200911076',85)
insert into tbl_score values('200911077',95)

--创建视图v_view:
create view v_view 
as
select 
s.stuid,s.stuname,sc.math
from 
tbl_stu s,tbl_score sc
where
s.stuid=sc.stuid

--为视图创建触发器tr_delete:
create trigger tr_delete on v_view
instead of delete
as
declare @stuid varchar(15),@stuname varchar(20),
@math int
select @stuid=stuid,@stuname=stuname,@math=math
from deleted
delete tbl_score where [email protected]
delete tbl_stu where [email protected]

--验证是否删除两表中对应的所有信息
delete v_view where stuid='200911077'
select *from tbl_stu
select *from tbl_score


------解决方案--------------------
建立for update触发器
在触发器中用if update(归还时间) 判断修改的是归还时间字段,然后下面写插入的insert语句
------解决方案--------------------
SQL code
if object_id('借阅信息') is not null   drop table 借阅信息gocreate table 借阅信息( 图书编号 char(50), 借书证号 char(50), 借书时间 smalldatetime, 应还时间 smalldatetime, 归还时间 smalldatetime, 已借书数目 smallint, 可借书数目 smallint)goinsert into 借阅信息 select '1','1','2011-11-11','2011-11-15',null,1,1--建立update触发器if object_id('tr_借阅信息') is not null   drop trigger tr_借阅信息gocreate trigger tr_借阅信息 on 借阅信息for updateas  if update(归还时间)     insert into 归还书籍 select 图书编号,借书证号,借书时间,归还时间 from insertedgoif object_id('归还书籍') is not null   drop table 归还书籍gocreate table 归还书籍( 图书编号 char(50), 借书证号 char(50), 借书时间 smalldatetime, 归还时间 smalldatetime)go--更新归还时间,触发器自动执行插入update 借阅信息 set 归还时间='2011-11-14' where 图书编号=1select * from 归还书籍/*图书编号                                               借书证号                                               借书时间                    归还时间-------------------------------------------------- -------------------------------------------------- ----------------------- -----------------------1                                                  1                                                  2011-11-11 00:00:00     2011-11-14 00:00:00(1 行受影响)*/
------解决方案--------------------
这个是谁设计的?第一个表明显可以再分。我写了一个简单的实现方法,具体的你可以修改:

/*
after触发器能否对表里某一项里面的内容插入或更新之后触发
比如说有这么两个表
借阅信息表(borrowinfo) 归还书籍表(returninfo)
图书编号 char(50) 图书编号 char(50)
借书证号 char(50) 借书证号 char(50)
借书时间 smalldatetime 借书时间 smalldatetime
应还时间 smalldatetime 归还时间 smalldatetime
归还时间 smalldatetime
已借书数目 smallint
可借书数目 smallint
*/
go
if OBJECT_ID('borrowinfo') is not null
drop table borrowinfo
go
create table borrowinfo(
图书编号 char(50),
  相关解决方案