+ -
当前位置:首页 → 问答吧 → 关于after触发器的问题

关于after触发器的问题

时间:2011-12-27

来源:互联网

after触发器能否对 表里某一项里面的内容插入或更新之后 触发 
比如 说有这么两个表
借阅信息 归还书籍
图书编号 char(50) 图书编号 char(50)  
借书证号 char(50) 借书证号 char(50)
借书时间 smalldatetime 借书时间 smalldatetime
应还时间 smalldatetime 归还时间 smalldatetime
归还时间 smalldatetime
已借书数目 smallint
可借书数目 smallint


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

作者: begun0608   发布时间: 2011-12-27

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

--创建表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

作者: TravyLee   发布时间: 2011-12-27

建立for update触发器
在触发器中用if update(归还时间) 判断修改的是归还时间字段,然后下面写插入的insert语句

作者: pengxuan   发布时间: 2011-12-27

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 行受影响)

*/

作者: pengxuan   发布时间: 2011-12-27

数据库设计得不太好.

1.已借书数目,可借书数目,是读者表中的内容,而不是借书表中的内容.
2.一本书,一个编号,因此,没有必要另外再设置归还书籍表,直接在借书表中就能包含借书操作的所有属性了.

作者: qianjin036a   发布时间: 2011-12-27

这个是谁设计的?第一个表明显可以再分。我写了一个简单的实现方法,具体的你可以修改:

/*
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),  
借书证号 char(50),  
借书时间 smalldatetime ,  
应还时间 smalldatetime,  
归还时间 smalldatetime,
已借书数目 smallint,
可借书数目 smallint
)
--select *from borrowinfo 
go
if OBJECT_ID('returninfo') is not null
drop table returninfo
go
create table returninfo(
图书编号 char(50),  
借书证号 char(50),
借书时间 smalldatetime,
归还时间 smalldatetime
)
go
if object_id('tri_update')is not null
drop trigger tri_update
go
create trigger tri_update on borrowinfo
after insert,update
as
declare @图书编号 char(50),@借书证号 char(50),
  @借书时间 smalldatetime,@归还时间 smalldatetime,
  @已借书数目 smallint,@可借书数目 smallint
--当有人借书时执行insert操作
if not exists(select *from deleted)--如果是新插入
select @图书编号=图书编号,@借书证号=借书证号,
  @借书时间=借书时间,@归还时间=归还时间,
  @已借书数目=已借书数目,@可借书数目=可借书数目 from inserted
insert into returninfo(图书编号,借书证号,借书时间,归还时间) 
  values(@图书编号,@借书证号,@借书时间,@归还时间) 
--当有人还书时执行update操作
if(select count(*) from deleted)>0 and (select count(*) from inserted)>0--如果是更新
select @图书编号=图书编号,@借书证号=借书证号,
  @借书时间=借书时间,@归还时间=归还时间,
  @已借书数目=已借书数目,@可借书数目=可借书数目 from inserted
update returninfo set 归还时间=@归还时间 where 借书证号=@借书证号

作者: TravyLee   发布时间: 2011-12-27