触发器
触发器的种类
触发器的种类:2(事前,事后)*3(添加,更新,删除)=6种
事前:for(类似于before)/instead of(表存涉及外键instead of)
事后:after
创建触发器
(1)INSERT触发器
eg:使用create trigger命令建立名为“成绩tri_insert”的触发器,该触发器用于判断要插入的记录,“分数”一项必须是0-100之间的数字,否则不允许插入数据,写出程序代码。
use student
if exists(select * from sysobjects where name='成绩tri_insert' and type='TR')
drop trigger 成绩tri_insert
go
create trigger 成绩tri_insert
on 学生成绩
for insert
as
if((select 分数 from inserted)between 0 and 100)
print '插入成功'
else
begin
print'分数格式错误,插入失败'
rollback
end
go
insert into 学生成绩 values('123123','007',123)
go
(2)UPDATE触发器
use student
go
create trigger s_i_u
on s
for
insert,update
as
print '对 s表进行了数据的插入和修改'
go
--触发过程
use chaxun
go
update s
set birthdate='1996-12-24'
where sno ='S2'
go
(3)DEELETE 触发器
eg:删除表S表学号为S7的元组前,必须先删除SC表中有外键联系的元组
use student
go
creat trigger s_del
on s
instead of delete
as
delete from sc where sc.sno in
(select sno from deleted)
return
eg:不允许删除修改数据库的触发器
--不允许删除修改数据库的触发器
use student
go
create trigger ddl_tabletrigger
on database
for drop_table,alter_table
as
print '对不起,不能对数据表进行删除或修改操作,请联系DBA'
rollback
go
--测试删除表
use chaxun
go
drop table sc
--不允许创建数据库的触发器
use student
go
if exists(select * from sys.server_triggers
where name ='ddl-trig_dtabase')
drop trigger ddl_trig_dtabase
on all server ;
go
create trigger trig_dtabase
on all server
for create_database
as
print '对不起,不允许创建数据库。'
rollback
go
--测试创建数据库
use chaxun
go
create database test
eg:在“学生信息”表中,建立名为“学生信息tri_delete”的触发器,当删除“学生信息”表中某条记录的同时,删除“学生成绩”表中与该记录“学号”相同的所有记录。
use student
if exists(select * from sysobjects where name='学生信息tri_delete' and type='TR')
drop trigger 学生信息tri_delete
go
create trigger 学生信息tri_delete
on 学生信息 after delete
as
delete from 学生成绩
where 学号 in(select 学号 from deleted)
go
delete 学生信息 where 学号='9056213'
eg:在“课程”表中,建立名为“课程tri_delete”的触发器,当删除“课程”表中某条记录的同时,删除“学生成绩”表中与该记录“课程号”相同的所有记录。
use student
if exists(select * from sysobjects where name='课程tri_delete' and type='TR')
drop trigger 课程tri_delete
go
create trigger 课程tri_delete
on 课程 after delete
as
delete from 学生成绩
where 课程号 in(select 课程号 from deleted)
go
delete 课程 where 课程号='0000007'
管理触发器
(1)查看触发器信息
execsp_helptext 触发器名称
execsp_help 触发器名称
(2)修改触发器
alter trigger 触发器名
on 表名
…
重写触发器
…
(3)删除触发器
drop tigger 触发器名
(4)禁用与启用触发器