日期:2014-05-18  浏览次数:20446 次

关于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 stuid=@stuid
delete tbl_stu where stuid=@stuid

--验证是否删除两表中对应的所有信息
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 借阅信息
go
create table 借阅信息
(
 图书编号 char(50),
 借书证号 char(50),
 借书时间 smalldatetime,
 应还时间 smalldatetime,
 归还时间 smalldatetime,
 已借书数目 smallint,
 可借书数目 smallint
)
go
insert into 借阅信息 select '1','1','2011-11-11','2011-11-15',null,1,1
--建立update触发器
if object_id('tr_借阅信息') is not null
   drop trigger tr_借阅信息
go
create trigger tr_借阅信息 on 借阅信息
for update
as
  if update(归还时间)
     insert into 归还书籍 select 图书编号,借书证号,借书时间,归还时间 from inserted
go
if object_id('归还书籍') is not null
   drop table 归还书籍
go
create table 归还书籍
(
 图书编号 char(50),
 借书证号 char(50),
 借书时间 smalldatetime,
 归还时间 smalldatetime
)
go
--更新归还时间,触发器自动执行插入
update 借阅信息 set 归还时间='2011-11-14' where 图书编号=1
select * 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),