关于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语句
[解决办法]
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),
借书证号 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 借书证号=@借书证号