第11章触发器精选PPT.ppt
第第11章触发器章触发器第1页,此课件共18页哦主要内容触发器概念、类型和结构inserted和deleted表建立、修改和删除触发器第2页,此课件共18页哦触发器简介触发器触发器是一种特殊类型的存储过程,由一组SQL语句组成,触发器是依存于表和视图的数据库对象,在表执行修改操作(插入/更新/删除)时自动执行,即是通过事件进行触发而被执行的它有助于更好地维护数据库的完整性。第3页,此课件共18页哦触发器类型AFTER触发器这种触发器将在数据变动(insert,update,delete操作)完成以后才触发。对变动的数据进行检查,如果发现错误,则拒绝或回滚变动的数据。只能在表上定义,可以定义多个。INSTEAD OF触发器这种触发器将在数据变动以前被触发。并取代变动数据 的操作(insert,update,delete操作),转而去执行触发器定义的操作。即可在表上也可在视图上定义,对同一操作只能定义一个。第4页,此课件共18页哦 触发器结构:触发器结构:事件UPDATEINSERTDELETE条件AFTERINSTEAD OF动作各种Transact-SQL语句第5页,此课件共18页哦触发事件发生After 条件触发器执行示意图条件触发器执行示意图执行触发事件执行触发器动作触发事件发生Instead of 条件触发器执行示意图条件触发器执行示意图不执行触发事件执行触发器动作第6页,此课件共18页哦触发器中使用的特殊表INSERED表自动处理存放由于执行INSERT或UPDATE语句而要从表中插入的行DELETED表存放由于执行DELETE或UPDATE语句而要从表中删除的行作用可以利用这两个临时驻留内存的表测试数据的修改效果及设置触发器操作的条件第7页,此课件共18页哦管理触发器使用SSMS创建、禁用、修改和删除触发器第8页,此课件共18页哦管理触发器T-SQL语句创建触发器CREATE TRIGGER CREATE TRIGGER 触发器名触发器名ON ON 表表 视图视图FORFORAFTERAFTERINSTEAD OF INSERTINSTEAD OF INSERTUPDATEUPDATEDELETEDELETEASASSQLSQL语句语句第9页,此课件共18页哦任务任务在WebShop数据库中创建一个触发器,实现在生成订单时,即往Orders表中插入订单记录时进行如下检查。如果插入的订单中的商品的支付方式p_ID不存在或者下达订单的会员号c_ID不存在,必须取消订单插入操作,并返回一条错误消息。第10页,此课件共18页哦CREATE TRIGGER tr_insertordersON OrdersFOR INSERT,UPDATEASDECLARE p_no CHAR(2)DECLARE c_no CHAR(12)SELECT p_no=Payments.p_IDFROM Payments,insertedWHERE Payments.p_ID=inserted.p_IDSELECT c_no=Customers.c_IDFROM Customers,insertedWHERE Customers.c_id=inserted.c_idIF p_no is NULL OR c_no is NULLBEGIN ROLLBACK TRANSACTION RAISERROR(不存在这样的会员号或支付方式号!,16,10)END第11页,此课件共18页哦任务任务在WebShop数据库中创建一个触发器,实现在商品类别表(types)中删除商品类别信息时,每次只能删除一条记录,并显示“*级联删除成功!”。第12页,此课件共18页哦CREATE TRIGGER tr_deletetypesON TypesFOR DELETEDECLARE row INTSELECT row=ROWCOUNTIF row=0begin PRINT 没有删除记录没有删除记录 RETURNENDIF row1BEGIN ROLLBACK TRANSACTION RAISERROR(一次只能删除一条记录一次只能删除一条记录,16,10)RETURNENDDECLARE t_no CHAR(11)SELECT t_no=t_ID FROM deleted DELETE Goods WHERE t_ID=t_noPRINT t_no+级联删除成功!级联删除成功!第13页,此课件共18页哦会员在购买商品时所购买商品的详细信息存放在OrderDetails表中,而订单的总金额存放在Orders表中。在WebShop数据库中创建一个触发器,实现订单详情表中的商品信息发生变化时,自动更新订单表中的订单总金额。想一想想一想第14页,此课件共18页哦CREATE TRIGGER tr_sum ON OrderDetailsFOR INSERT,UPDATEASBEGIN UPDATE Orders SET o_Sum=(SELECT SUM(d_price*d_Number)FROM OrderDetails WHERE o_ID=(SELECT o_ID FROM inserted)WHERE o_ID=(SELECT o_ID FROM inserted)END第15页,此课件共18页哦管理触发器T-SQL语句修改触发器ALTER TRIGGER ALTER TRIGGER 触发器名触发器名ON ON 表表 视图视图FORFORAFTERAFTERINSTEAD OF INSERTINSTEAD OF INSERTUPDATEUPDATEDELETEDELETEASASSQLSQL语句语句第16页,此课件共18页哦管理触发器查看触发器sp_helptrigger tabname=sp_helptrigger tabname=表名表名 ,triggertype=triggertype=触发器类型触发器类型 sp_helptext objname=sp_helptext objname=对象名对象名删除触发器DROP TRIGGER DROP TRIGGER 触发器名触发器名,nn第17页,此课件共18页哦管理触发器禁用和启用触发器DISABLE TRIGGER DISABLE TRIGGER 触发器名触发器名,nn|ALL|ALLON ON 对象名对象名|数据库数据库|服务器服务器ENABLE TRIGGER ENABLE TRIGGER 触发器名触发器名,nn|ALL|ALLON ON 对象名对象名|数据库数据库|服务器服务器例:禁用触发器tr_delete第18页,此课件共18页哦