1、实验 触发器1、 After 类型触发器1) Insert 触发器:为 SC 表编写触发器 SC_insert,实现当 SC 中插入数据时检查 Score 字段,若大于 0小于 100,允许插入,反之则不允许插入。CREATE TRIGGER SC_inserte ON SC AFTER INSERTAS BEGINdeclare score int select score=score from insertedIF (score100 or score0)begin PRINT 成绩超出范围!RollbackENDend向SC 表插入一条记录,检查是否能输入进去insert into SC
2、 values(s4,c2,102)2) delete 触发器设置 C 表和 T 表的外键约束:“强制外键约束为否” ,更新和删除操作“无操作” 。为T 表建立一个名为 T_del 的 Delete 触发器。当 T 表删除数据时,如果 C 表引用了该记录,则置 C 表中引用列(T#)为 null 值。CREATE TRIGGER T_delON T AFTER deleteAS BEGINupdate C set T#=null where T# in (select T# from deleted)end验证:删除T表中t1教师,查看 C表相关记录是否更改delete T where T#=
3、t13) Update 触发器为 T 表建立一个名为触发器 T_update 的 Update 触发器。当 T 表更新教工号时,级联更新 C 中相应记录的教工号。CREATE TRIGGER T_updateON T AFTER updateAS if update(T#)BEGINupdate C set T#=(select T# from inserted )where T# in (select T# from deleted)print After触发器end验证:1) update T set T#=T3 where T#=T2能否执行,为什么?2) update T set T#
4、=T4 where T#=T3能否执行,为什么?结论:after 触发器和约束执行先后顺序?2、Instead of 类型触发器1)为 T 表建立一个 Instead of 触发器 T_Inupdate,当 T 表更新教工为SHI老师时,更新其职称字段为“副教授” ,并且在触发器中打印“Instead of 触发器” 。create TRIGGER T_InupdateON T Instead Of updateAS declare tname char(5)declare tid char(5)select Tid=T# from deletedselect tname=TNAME from
5、 deletedprint tidif(tname=SHI)BEGINupdate T set TITLE=副教授 where T#=Tidprint Instead Of触发器end验证:输入下列语句update T set T#=T2 where T#=T5,查看是否修改了shi老师的职称?是否修改了shi老师的工号?为什么?2)修改T_Inupdate 触发器,使得当输入 update T set T#=T2 where T#=T5时,确实能修改shi老师工号。alter TRIGGER T_InupdateON T Instead Of updateAS declare tname c
6、har(5)declare tidold char(5)declare tidnew char(5)select Tidold=T#,tname=TNAME from deletedselect Tidnew=T# from insertedprint Tidoldif(tname=SHI)BEGINupdate T set TITLE=副教授 where T#=Tidoldprint Instead Of触发器update T set T#=Tidnew where T#=Tidoldend验证:输入下列语句update T set T#=T2 where T#=T5,查看是否修改了shi老师的职称?是否修改了shi老师的工号?是否级联修改了 C表中的教工号?为什么?结论:当一个表中同时有Instead of触发器和after触发器时执行次序。