[其它]ch83触发器.ppt
《[其它]ch83触发器.ppt》由会员分享,可在线阅读,更多相关《[其它]ch83触发器.ppt(62页珍藏版)》请在三一办公上搜索。
1、第8章 数据库编程(续)触发器,国脉信息学院20120517,本节知识点,触发器概述触发器类型 存储过程执行过程 创建存储过程 修改及删除存储过程调用存储过程,触发器概述,场 景,学生情况表XSQK,课程表KC,成绩表XS_KC,银行的取款机系统,触发器概述,帐户信息表bank,交易信息表transInfo,张三取钱200 问题:有没有自动修改张三的余额,张三开户1000元,李四开户1元,赵二,插入,触发器 概述,删除,赵二退休,赵二,员工表,退休员工表,问题:如何实现将赵二的信息自动保存到退休员工表中,触发器概述,问题分析存在的问题参照完整性级联操作复杂的约束数据修改前后的差别强制的业务规则
2、,触发器概述,解决问题解决方案 触发器(Trigger)触发器是一种特殊的存储过程,它在特定语言事件发生时自动执行,通常用于实现强制执行一定的业务规则,以保持数据完整性、检查数据有效性,实现数据管理任务和一些附加的功能。触发器的主要作用是实现由主键和外键所不能保证的复杂的参照完整性和数据一致性。除此之外,触发器还有以下作用。(1)触发器可以对数据库进行级联修改。(2)实现比CHECK约束更为复杂的限制。(3)比较数据修改前后的差别。(4)强制表的修改要合乎业务规则。,触发器的类型,按照触发事件的不同,可以把Microsoft SQL Server 2005系统提供的触发器分成两大类型,即DML
3、触发器和DDL触发器。,触发器的类型,DML触发器可以在数据库中数据修改时被执行。DML事件包括在指定表或视图中修改数据的INSERT语句、UPDATE语句或DELETE语句。DML触发器可以查询其他表,还可以包含复杂的T-SQL语句。系统将触发器和触发它的语句作为可在触发器内回滚的单个事务对待,如果检测到错误(例如,磁盘空间不足),则整个事务自动回滚。,DDL触发器是Microsoft SQL Server 2005的新增功能。当服务器或数据库中发生数据定义语言(DDL)事件时将调用这些触发器。DDL触发器与DML触发器的相同之处在于都需要触发事件进行触发,但是,它与DML触发器不同的是,它
4、不会为响应针对表或视图的UPDATE、INSERT或DELETE语句而触发,相反,它会为响应多种数据定义语言(DDL)语句(如:CREATE、ALTER)而触发。规范数据库操作,防止数据库表结构被修改等。,触发器的类型,DML触发器的创建和应用,在Microsoft SQL Server 2005系统中,按照触发器事件类型的不同,可将DML触发器分成3种类型:INSERT类型、UPDATE类型和DELETE类型如果该表有INSERT类型的DML触发器,则当向一个表中插入数据时,则该INSERT类型的触发器触发执行;如果该表有UPDATE类型的DML触发器,则当对该触发器表中的数据执行更新操作时
5、,该触发器就执行;如果该表有DELETE类型的DML触发器,当对该触发器表中的数据执行删除操作时,该DELETE类型的DML触发器就触发执行。也可以将这三种触发器组合起来使用。,DML触发器的创建和应用,按照触发器和触发事件的操作时间划分,可以把DML触发器分为AFTER触发器和INSTEAD OF触发器。当在INSERT、UPDATE、DELETE语句执行之后才执行DML触发器的操作时,这种触发器的类型就是AFTER触发器。AFTER触发器只能在表上定义。,DML触发器的创建和应用,按照触发器和触发事件的操作时间划分,可以把DML触发器分为AFTER触发器和INSTEAD OF触发器。如果希
6、望使用触发器操作代替触发事件操作,可以使用INSTEAD OF类型的触发器。也就是说,INSTEAD OF触发器可以替代INSERT、UPDATE和DELETE触发事件的操作。INSTEAD OF触发器既可以建在表上,也可以建在视图上。通过在视图上建立触发器,可以大大增强通过视图修改表中数据的功能。,DML触发器的创建和应用,DML触发器的主要优点如下:DML触发器可以防止恶意或错误的插入、修改及删除操作,并强行比较检查约束定义的限制更为复杂的其他限制。与检查约束不同,DML触发器可以引用其他表中的列。例如,触发器可以使用另一个表中的SELECT比较插入或更新的数据,以及执行其他操作,如修改数
7、据或显示用户定义错误信息。DML触发器可以评估数据修改前后表的状态,并根据该差异采取措施。一个表中的多个同类DML触发器(INSERT、UPDATE或DELETE)允许采取多个不同的操作来响应同一个修改语句。,DML触发器的创建和应用,创建DML触发器应该考虑以下几个问题:CREATE TRIGGER 必须是批处理中的第一条语句,并且只能应用于一个表。触发器只能在当前的数据库中创建,但是可以引用当前数据库的外部对象。创建触发器的权限默认分配给表的所有者,且不能将该权限转给其他用户。触发器是一种数据库对象,其名称必须遵循标识符的命名规则。虽然不能在临时表或系统表上创建触发器,但是触发器可以引用临
8、时表。,DML触发器的创建和应用,如果一个表的外键包含对定义的 DELETE或UPDATE 操作的级联,则不能定义INSTEAD OF 和INSTEAD OF UPDATE触发器 虽然TRUNCATE TABLE 语句类似于没有WHERE子句(用于删除行)的DELETE语句,但它并不会引发DELETE触发器,因为TRUNCATE TABLE 语句没有记录。如果指定了触发器架构名称来限定触发器,则将以相同的方式限定表名称。在触发器内可以指定任意的 SET 语句。选择的 SET 选项在触发器执行期间保持有效,然后恢复为原来的设置。在 DML 触发器中不允许使用下列 Transact-SQL 语句:
9、ALTER DATABASE、CREATE DATABASE、DROP DATABASE、RECONFIGURE、LOAD LOG、LOAD DATABASE、RESTORE LOG、RESTORE DATABASE,DML触发器的创建和应用,1.DML 触发器的创建使用SQL Server管理控制台创建DML触发器在SQL Server管理控制台中,展开指定的服务器和数据库,单击要创建触发器的数据表,右击其中的“触发器”文件夹。从弹出的快捷菜单中选择“新建触发器”选项,会出现新建触发器模板窗口。,使用Transact-SQL语句创建DML触发器,CREATE TRIGGER 触发器名ON 表
10、|视图WITH ENCRYPTIONFOR|AFTER|INSTEAD OF INSERT,UPDATE,DELETENOT FOR REPLICATIONASIF UPDATE(列名)AND|OR UPDATE(列名)nSQL语句,(1)FOR|AFTER。FOR与AFTER同义,指定触发器只有在触发器SQL语句中指定的所有操作都已成功后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器,即为后触发。只能在表上定义(2)INSTEAD OF。指定执行触发器而不执行造成触发的SQL语句,从而替代造成触发的语句。在表或视图上,每个INSERT、UPDATE或DELETE语句只
11、能定义一个INSTEAD OF触发器,即替代触发。(3)INSERT,UPDATE,DELETE是指定在表上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用任意顺序组合的这些关键字。当进行触发条件的操作时(INSERT、UPDATE或DELETE),将执行SQL语句中指定的触发器操作。,使用Transact-SQL语句创建DML触发器,(4)NOT FOR REPLICATION。表示当复制进程更改触发器所涉及的表时,不要执行该触发器。(5)IF UPDATE(列名)。测试在指定的列上进行的INSERT或UPDATE操作,不能用于DELETE操作,可以指
12、定多列。因为已经在ON子句中指定了表名,所以在IF UPDATE子句中的列名前不要包含表名。若要测试在多个列上进行的INSERT或UPDATE操作,要分别单独地指定UPDATE(列名)子句。在INSERT操作中IF UPDATE将返回TRUE值,因为这些列插入了显式值或隐性(NULL)值。,使用Transact-SQL语句创建DML触发器,(6)注意:在使用WITH ENCRYPTION选项时需要注意两点:一是原始触发器的文件丢失,将不能从syscomments表中重新保存加密文本;二是文本加密后,在数据库升级为新版本时不能修改,也不能重新存入新版本中。也就是说,如果触发器文本有可能需要修改,
13、就不要随便将其加密。,使用Transact-SQL语句创建DML触发器,DML 触发器使用 deleted 和 inserted 逻辑表。它们在结构上和触发器所在的表的结构相同,SQL Server会自动创建和管理这些表。可以使用这两个临时的驻留内存的表测试某些数据修改的效果及设置触发器操作的条件。Deleted表用于存储delete,update语句所影响的行的副本。在执行delete或update语句时,行从触发器表中删除,并传输到deleted表中。Inserted表用于存储Insert或update语句所影响的行的副本,在一个插入或更新事务处理中,新建的行被同时添加到Inserted表
14、和触发器表中。Inserted表中的行是触发器表中新行的副本。,DML触发器的创建和应用,注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:,DML触发器的创建和应用,DML触发器的应用,1、使用INSERT触发器INSERT触发器常被用来更新时间标记字段,或者验证被触发器监控的字段中数据满足要求的标准,以确保数据的完整性。当向数据库中插入数据时,INSERT触发器将被触发执行。INSERT触发器被触发时,新的记录增加到触发器的对应表中,并且同时也添加到inserted表中。,INSE
15、RT触发器,插入记录行,触发insert触发器。向inserted表中插入新行的副本,触发器检查inserted表中插入的新行数据,确定是否需要回滚或执行其他操作,INSERT触发器的工作原理:,INSERT 触发器示例,问题:解决上述的银行取款问题:当向交易信息表(transInfo)中插入一条交易信息时,我们应自动更新对应帐户的余额。,分析:在交易信息表上创建INSERT触发器 从inserted临时表中获取插入的数据行根据交易类型(transType)字段的值是存入/支取,增加/减少对应帐户的余额。,-关键代码-CREATE TRIGGER trig_transInfo ON trans
16、Info FOR INSERT AS DECLARE type char(4),outMoney float DECLARE myCardID varchar(10 SELECT type=transType,outMoney=transMoney,myCardID=cardID FROM inserted IF(type=支取)UPDATE cardinfo SET currentMoney=currentMoney-outMoney WHERE cardID=myCardID ELSE UPDATE cardinfo SET currentMoney=currentMoney+outMon
17、ey WHERE cardID=myCardIDGO,INSERT 触发器示例,从inserted表中获取交易类型、教员金额等,根据交易类型,减少或增加对应卡号的余额,-测试代码-insert into transinfo values(1000000001,支取,200)insert into transinfo values(1000000002,存入,800)select*from cardinfo,INSERT 触发器示例,2、使用DELETE触发器DELETE触发器通常用于两种情况:第一种情况是为了防止那些确实需要删除但会引起数据一致性问题的记录的删除。例如在学生表中删除记录时,同时
18、要删除和某个学生相关的其他信息表中的信息。通常见于用作其他表的外部键的记录;第二种情况是执行可删除主记录的级联删除操作。,DML触发器的应用,DELETE触发器,删除记录行,触发delete触发器向deleted表中插入被删除的副本,触发器检查deleted表中被删除的数据,决定是否需要回滚或执行其他操作,DELETE触发器的工作原理:,问题:当删除交易信息表时,要求自动备份被删除的数据到表backupTable中。,分析:在交易信息表上创建DELETE触发器 被删除的数据可以从deleted表中获取,DELETE触发器示例,-关键代码-CREATE TRIGGER trig_delete_t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 其它 ch83 触发器
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5616053.html