sqlserver2000支持两种类弄的触发器:AFTER触发器和INSTEAD OF触发器。其中AFTER触发器要求只有执行某一操作(insert update delete)这后,触发器才被触发,且只能在表上定义。可以针对表的同一操作定义多个AFTER触发器。对于AFTER触发器可以定义哪一个触发器被最先触发,哪个被最后触发
INSTEAD OF 触发器表示并不执行其定义的操作(insert update delete),而仅是执行触发器本身。即可在表上定义INSTEAD OF 触发器,也可以在视图上定义INSTEAD OF触发器,但对同一操作只能定义一个INSTEAD OF触发器.
inserted表和deleted表
每个触发器有两个特殊表:inserted和deleted表.这两个表都是逻辑表,并且这两个表由系统管理的,存储在内存中,不是存储在数据库中,因此不充许用户直接对其修改。它们在结构上总是与触发器作的表相同。这两个表是动态驻留在内存中的,当触发器工作完成后,这两个表也被删除。这两个表主要保存因用户操作而被影响响到的原数据值或更新值。另这两个表是只读的,即用户不能向这两个表写入内容,但可以引用表中的数据。
@R_946_4045@ion表(s_no,s_name,s_sex,s_birth,s_address,s_class)
表课程course(c_no,c_name,c_type)
成绩表 course(semester,s_no,c_no,grade)
1创建一个udate 触发器,当更新course表中的课程号列时,激活触发器以同步级联更新score表中的相关课程号
CREATE trigger score_tri
on course
for update
as
declare @c_no char(12)
declare @c_no1 char(12)
set @c_no=(select c_no from inserted)
set @c_no1=(select c_no from deleted)
update score set c_no=@c_no where c_no=@c_no1
print '级联score表更新成功'
创建一个DELETE触发器,当删除course表中的一条记录时,激活触发器以同步级联删除socre表中的相关记录
CREATE trigger cour_tri
on course
for delete
as
declare @c_no char(11)
select @c_no=c_no from deleted
delete score where c_no=@c_no
print '更新成功'
3 需要在数所表score中插入记录时进行如下检查,当试图往score插入学生信息表中不存在的学号或在课程表中并不存在的c_no,撤消插入操作,返回一条错语消息
create trigger score_insrt_trion scorefor insertasdeclare @s_no char(11)declare @c_no varchar(12)--获取新插入行的学号值select @s_no=@R_946_404[email protected]_no from @R_946_4045@ion,insertedwhere @R_946_404[email protected]_no=inserted.s_noselect @c_no=course.c_nofrom course,insertedwhere course.c_no=inserted.c_noif @s_no is null or @c_no is nullbegin --事务回滚撤消插入操作rollback transactionraiserror('不存在这样的学号或课程号',16,10)end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。