资源简介 (共35张PPT)第9章 触 发 器9.1 触发器概述9.1.1 触发器的概念触发器是一种特殊类型的存储过程,当在指定表中使用UPDATE、INSERT 或 DELETE中的一种或多种数据修改命令对数据进行修改时,触发器就会执行。触发器可以查询其他表,而且可以包含复杂的 SQL 语句。它们主要用于强制复杂的业务规则或要求。触发器还有助于强制引用完整性,以便在添加、更新或删除表中的行时保留表之间已定义的关系。9.1.2 触发器的类型与优点1.触发器的类型触发器可以分为AFTER触发器和INSTEAD OF触发器2. 使用触发器的优点强制比CHECK约束更复杂的数据完整性。使用自定义的错误提示信息。触发器可以通过数据库中的相关表进行级联更改。比较数据库修改前后数据的状态。维护规范化数据。9.2 创建和应用触发器CREATE TRIGGER语句语法格式如下: CREATE TRIGGER trigger_nameON { table | view }[ WITH ENCRYPTION ]{ { { FOR | AFTER | INSTEAD OF } { [DELETE] [,INSERT] [,UPDATE] } [ NOT FOR REPLICATION ] AS [ { IF UPDATE ( column ) [ { AND | OR } UPDATE ( column ) ] [ ...n ] | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask ) { comparison_operator } column_bitmask [ ...n ] } ] sql_statement [ ...n ] }}9.2.1 INSERT触发器INSERT触发器通常被用来验证被触发器监控的字段中的数据是否满足要求的标准,以确保数据完整性。这种触发器是在向指定的表中插入记录时被自动执行的。创建的INSERT触发器可以分为AFTER和INSTEAD OF两种不同类型的触发器,AFTER类型触发器是在系统执行到INSERT语句时被触发,在INSERT语句执行完毕后再去执行触发器的相关操作;而INSTEAD OF类型触发器是在系统执行到INSERT语句时被触发,但在INSERT语句执行前即执行触发器相关操作,而该INSERT语句则不再执行。例9-1在“学生选课”数据库中的“学生”表上创建一个名为xuesheng_tri1的AFTER类型触发器,当用户向“学生”表中添加一条记录时,提示“已成功向学生表中添加一条记录!”例9-1触发器创建后,用户向“学生”表中插入数据时,该触发器将被执行,而且是数据先被插入到表中,然后再执行触发器。例9-2在“学生选课”数据库中的“学生”表上创建一个名为xuesheng_tri2的INSTEAD OF类型触发器,当用户向“学生”表中添加一条记录时,提示“您未被授权执行插入操作!”同时阻止用户向“学生”表中添加记录。对应的SQL语句如下:USE 学生选课GOCREATE TRIGGER xuesheng_tri2ON 学生INSTEAD OF INSERTASPRINT '您未被授权执行插入操作!'GO例9-2触发器创建成功后,用户向学生表中插入数据时,该触发器将被执行,其结果是用户看到相应提示,但INSERT语句则没有执行。9.2.2 UPDATE触发器在定义有UPDATE触发器的表上执行UPDATE语句时,将触发UPDATE触发器。用户可以通过使用该触发器来提示或者限制用户进行更新操作,用户也可以在UPDATE触发器中通过定义IF UPDATE(column name)语句来实现当用户对表中特定的列更新时操作被阻止,从而来保护特定列的信息。如果用户需要实现多个特定列中的任意一列被更新时操作被阻止,可以在触发器定义中通过使用多个IF UPDATE(column name)语句在多个特定列上来分别实现。例9-3在“学生选课”数据库中的“学生”表上创建一个名为xuesheng_tri3的触发器,该触发器将被UPDATE操作激活,该触发器将不允许用户修改“学生”表的“班级”列。对应的SQL语句如下:USE 学生选课GOCREATE TRIGGER xuesheng_tri3ON 学生AFTER UPDATEASIF UPDATE(班级)BEGINPRINT '禁止修改学生所在班级'ROLLBACKENDGO例9-3例9-3例9-4在“学生选课”数据库中的“学生”表上创建一个名为xuesheng_tri4的触发器,该触发器将被UPDATE操作激活,该触发器将不允许用户对“学生”表进行任何更新。对应的SQL语句如下:USE 学生选课GOCREATE TRIGGER xuesheng_tri4 ON 学生INSTEAD OF UPDATEASPRINT '您未被授权对表进行更新!'GO例9-49.2.3 DELETE触发器在定义有DELETE触发器的表上执行DELETE语句时,将触发DELETE触发器。【例9-5】在“学生选课”数据库中的“学生”表上创建一个名为xuesheng_tri5的触发器,该触发器将对“学生”表中删除记录的操作给出不允许执行删除操作信息提示,并取消当前的删除操作。例9-5USE 学生选课GOCREATE TRIGGER xuesheng_tri5ON 学生AFTER DELETEASBEGINRAISERROR('对不起,您不能执行删除操作',10,1)ROLLBACK TRANSACTIONENDGO例9-5创建建好触发器后,尝试在学生表上执行DELETE操作:例9-6在“学生选课”数据库中的“学生”表上创建一个名为xuesheng_tri6的触发器,该触发器将被DELETE操作激活,该触发器将不允许用户对“学生”表进行任何删除。对应的SQL语句如下:USE 学生选课GOCREATE TRIGGER xuesheng_tri6 ON 学生INSTEAD OF DELETEASPRINT '您未被授权对表删除操作!'GO例9-6建好触发器后,在“学生”表上执行DELETE操作9.2.4 INSERTED表和DELETED表触发器中可以使用两种特殊的表:DELETED表和INSERTED 表。DELETED表用于存储DELETE和UPDATE语句所影响的行的副本。INSERTED表用于存储INSERT和UPDATE语句所影响的行的副本。在定义触发器时,可以为引发触发器的操作恰当使用 INSERTED和DELETED表。INSERTED表和DELETED表操作类型 INSERTED表 DELETED表INSERT 插入的记录 不创建DELETE 不创建 删除的记录UPDATE 修改后的记录 修改前的记录例9-7在学生表上创建xuesheng_tri7触发器,该触发器在学生表执行INSERT操作时被触发,其作用是,将被新添加到学生表中学生的“学号”和“姓名”自动添加到学生_籍贯表中。对应的SQL语句如下:USE 学生选课GOCREATE TRIGGER xhesheng_tri7 ON 学生FOR INSERTASBEGINDECLARE @n1 char(8),@n2 char(10)SELECT @n1=INSERTED.学号,@n2=INSERTED.姓名 FROM INSERTEDINSERT INTO 学生_籍贯(学号,姓名)VALUES(@n1,@n2)PRINT('学生信息已相应添加至学生_籍贯表')ENDGO例9-7触发器创建完成后,向学生表中添加一条测试记录:例9-8在学生表上创建xuesheng_tri8触发器,该触发器被DELETE操作所触发,实现当用户删除“学生”表中某一位学生记录的同时,系统自动在“学生_籍贯”表中找到相应学生,并将其删除。对应的SQL语句如下:USE 学生选课GOCREATE TRIGGER xhesheng_tri8 ON 学生FOR DELETEASBEGINDECLARE @n1 char(8)SELECT @n1=DELETED.学号 FROM DELETEDDELETE FROM 学生_籍贯WHERE 学号=@n1PRINT('已删除学生_籍贯表中的相应学生')END例9-8触发器创建好后,在学生表中删除一条记录:例9-9在“学生”表上创建xuesheng_tri9触发器,该触发器被UPDATE操作所触发,实现当用户更新“学生”表中某一位学生的姓名时,系统自动在“学生_籍贯”表中找到相应学生,并将其对应修改。对应的SQL语句如下:USE 学生选课GOCREATE TRIGGER xhesheng_tri9 ON 学生FOR UPDATEASBEGINDECLARE @n1 char(8),@n2 char(10)SELECT @n1=DELETED.学号 FROM DELETEDSELECT @n2=INSERTED.姓名 FROM INSERTEDUPDATE FROM 学生_籍贯SET 姓名=@n2WHERE 学号=@n1PRINT('已修改学生_籍贯表中的相应学生的姓名')END例9-9在触发器创建完后,在“学生”表中修改一名学生的姓名:9.3 管理触发器9.3.1 查看触发器的定义1.使用系统存储过程2.使用系统表3.在“对象资源管理器中”查看触发器例9-10使用系统存储过程查看触发器信息。例9-11使用系统表sysobjects查看数据库学生选课数据库上存在的所有触发器相关信息。9.3.2 修改触发器1.使用sp_rename命令修改触发器的名字。2.使用SQL Server Management Studio查询分析器窗口中修改触发器定义。3.通过ALTER TRIGGER命令修改触发器的定义文本。4.禁止和启用触发器例9-13修改“学生选课”数据库中“学生”表上建立的触发器xuesheng_tri3,使得在用户执行删除、添加、修改操作时,系统均自动给出错误提示,并撤销用户的操作。对应的SQL语句如下:USE 学生选课GOALTER TRIGGER xuesheng_tri3ON 学生FOR DELETE,INSERT,UPDATEASBEGINRAISERROR('对不起,您不能执行操作',10,1)ROLLBACK TRANSACTIONENDGO9.3.3 删除触发器(1)使用DROP TRIGGER删除指定的触发器,具体语法格式如下:DROP TRIGGER {trigger} [ ,...n ](2)删除触发器所在的表时,该表上所有的触发器将被一并删除。(3)在SQL Server Management Studio中进入“对象资源管理器”面板,找到相应的触发器并用鼠标右键单击,在弹出的菜单中,选择“删除”命令即可直接删除触发器。本章小结触发器是一种特殊类型的存储过程,是在某个指定的事件发生时被激活。触发器的两种类型:AFTER触发器和INSTEAD OF触发器。INSERT触发器是在对触发器表执行插入记录操作时被触发。UPDATE触发器是在对触发器表执行更新记录操作时被触发。DELETE触发器是在对触发器表执行删除记录操作时被触发。INSERTED表和DELETED是两个由系统创建的临时表,表中记录由系统自动填入,用户可以使用表中的记录,但是不能修改表中的记录。创建触发器使用CREATE TRIGGER命令,修改触发器使用ALTER TRIGGER命令,删除触发器使用DROP TRIGGER命令 展开更多...... 收起↑ 资源预览