资源预览内容
第1页 / 共28页
第2页 / 共28页
第3页 / 共28页
第4页 / 共28页
第5页 / 共28页
第6页 / 共28页
第7页 / 共28页
第8页 / 共28页
第9页 / 共28页
第10页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
触发器,触发器,触发器概述 问题的引入 触发器的概念 触发器的原理 触发器的分类 触发器的创建、修改及删除 应用示例,触发器概述,问题的引入,增加一个记录,删除一个记录(“95003”,”002”,56),95001 006 90,4,1,在学生管理数据库中,某学生的选课门数是一个经常访问的属性,因此在student表中增加一个属性sselnum (smallint) 在实际应用 实例展示,触发器概述,考虑该问题涉及两个表之间的关系,可否用参照完整性来实现?,可否用嵌套的SQL语句来实现?,问题的解决:使用触发器trigger,update student set sselnum=(select count(*) from s_c where s_c.sno=student.sno),存在的问题,触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性,触发器概述,触发器的概念 触发器是一种特殊类型的存储过程。在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。,触发器触发原因对表进行插入、更新或删除操作触发事件。,触发结果:另一段程序的执行。,思考 :在上例中,触发原因是什么?触发结果是什么?,触发器概述,触发器和存储过程的区别:,INSERT INTO s_c VALUES(95001,006,90) EXEC Getgrade 95001,触发器可以用于 SQL Server 约束、默认值和规则的完整性检查。,触发器主要是通过事件触发而执行的,而存储过程是通过调用存储过程名称而执行的。,触发器概述,特殊性在于: l它与表紧密相连,不可以脱离表单独存在。 l不允许使用参数,没有返回值。 l不允许用户调用,当对表进行插入、删除、修改操作时由系统自动调用并执行(相当于事件方法)。,触发器概述,触发器可以实现比较复杂的完整性约束: l 扩展约束、默认值和规则对象的完整性检查。 l 自动生成数据。 l 检查数据的修改,防止对数据不正确的修改,保证数据表之间数据的正确性和一致性。 l 自定义复杂的安全权限。,触发器作为一种数据库对象,在syscomment系统表中存储其完整的定义信息,在sysobject系统表中有该对象的记录。,触发器概述,1)触发器自动执行 在对表的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后立即被激活。,3)触发器可以实现比CHECK约束更为复杂的数据完整性约束 在数据库中为了实现数据完整性约束,可以使用CHECK约束或触发器。CHECK约束不允许引用其它表中的列来完成检查工作,而触发器可以引用其它表中的列。,2)触发器能够对数据库中的相关表实现级联更改 触发器是基于一个表创建的,但是可以针对多个表进行操作,实现数据库中相关表的级联更改。,触发器概述,AFTER类型触发器: 只有执行某一操作(INSERT UPDATE DELETE) 之后,触发器才被触发。 只能在表上定义。,触发器的分类,INSTEAD OF 触发器: 并不执行其所定义的操作(INSERT、 UPDATE、 DELETE),而仅是执行触发器本身。 既可在表上定义INSTEAD OF 触发器,也可以在视图上定义INSTEAD OF 触发器。,触发器概述,触发器的原理 Inserted表和Deleted表的理解:,Inserted和Deleted是逻辑(概念)表。当在定义了触发器的表上发生了修改操作时会自动派生出这两个视图。,当在表上发生插入操作时,新插入的行将出现在插入视图中。 当在表上发生删除操作时,被删除的行将出现在删除视图中。 当在表上发生更新操作时,旧行出现在删除视图中,新行出现在插入视图中。,触发器概述,触发器的原理 Inserted表和Deleted表的理解: (1)如果基于S_C表的UPDATE操作定义了触发器 (2)再执行语句: UPDATE S_C SET grade=70 WHERE sno=95001 AND cno=001 在UPDATE语句执行过程中 Deleted表的内容: Inserted表的内容:,S_C表,触发器的创建,触发器的基本操作创建 在创建触发器前,必须注意以下几点: 1、CREATE TRIGGER 语句必须是批处理中的第一条语句。 2、只能在当前数据库中创建触发器,名称必须遵循标识符的命名规则。 3、表的所有者具有创建触发器的默认权限,不能将该权限转给其他用户。 4、不能在临时表或系统表上创建触发器,但是触发器可以引用临时表,但是不能引用系统表。,触发器的创建,创建触发器命令格式: CREATE TRIGGER trigger_name ON tabel FOR | AFTER | INSTEAD OF INSERT,UPDATE,DELETE AS IF UPDATE(column) AND|OR UPDATE (column) sql_statement,一、企业管理器 二、查询分析器,触发器的创建,说明:,FOR | AFTER|INSTEAD OF: FOR | AFTER:在数据变动以后触发; INSTEAD OF: 在数据变动以前触发; INSERT|UPDATE|DELETE: 分别对应插入触发器、修改触发器、删除触发器,触发器的创建,例:当在仓库表上发生插入操作时会输出“插入了一个仓库元组”的信息。,USE 仓库管理 GO CREATE TRIGGER WH_IN ON 仓库 FOR INSERT AS PRINT 插入了一个仓库元组,INSERT 仓库 VALUES(WH6,南京,700),触发器的创建,例:在仓库表上定义一个删除触发器,使得当删除仓库记录时,同时将所属所有职工记录的仓库号字段值置为空值NULL。,CREATE TRIGGER WH_DEL ON 仓库 FOR DELETE AS UPDATE 职工 SET 仓库号=NULL WHERE 仓库号 IN (SELECT 仓库号 FROM deleted),DELETE 仓库 WHERE 仓库号=WH6,仓库(仓库号,城市,面积) 职工(仓库号,职工号,工资),触发器的创建,例:对S表定义一个删除触发器,使得当删除学生记录时,将S_C表中相应的选课记录删除。,S(SNO,SNAME) S_C(SNO,CNO,SCORE),触发器的创建,例:对职工表定义一个插入触发器,使得当插入职工记录时,检查所参照的仓库元组是否存在,如果不存在,则撤消所做的插入操作。,仓库(仓库号,城市,面积) 职工(仓库号,职工号,工资),触发器的创建,CREATE TRIGGER WH_INS ON 职工 FOR INSERT AS IF NOT EXISTS (SELECT * FROM 仓库 WHERE 仓库号 = (SELECT 仓库号 FROM INSERTED) BEGIN RAISERROR(非法仓库号!,1,1) ROLLBACK TRANSACTION END,INSERT 职工 VALUES(WH5,E10,1600),IN,触发器的创建,例:对S_C表定义一个插入触发器,使得当插入选课记录时,检查所参照的学生学号和课程号是否存在,如果不存在,则撤消所做的插入操作。,S(SNO,SNAME) C(CNO,CNAME) S_C(SNO,CNO,SCORE),触发器的创建,例:对职工表定义一个更新触发器,使得当职工变换所属仓库时,检查所参照的仓库元组是否存在,如果不存在,则撤消所做的更新操作,如果新的仓库号是WH2则将工资提高10%。,触发器的创建,CREATE TRIGGER TR_UPDATE ON 职工 FOR UPDATE AS DECLARE WHNO CHAR(4) IF UPDATE(仓库号) BEGIN IF NOT EXISTS (SELECT * FROM 仓库 WHERE 仓库号=(SELECT 仓库号 FROM INSERTED) BEGIN RAISERROR(非法仓库号!,16,1) ROLLBACK TRANSACTION END ELSE BEGIN SELECT WHNO=仓库号 FROM INSERTED IF WHNO=WH2 UPDATE 职工 SET 工资=工资*1.1 WHERE 职工号=(SELECT 职工号 FROM INSERTED) END END,触发器的创建,例:当插入或更新学生成绩时,触发器检查该课程是否为考查课,若是,则通过的成绩只能以60分计,未通过的只能以40分计。,涉及的表结构:C1(Cno,Cname,Ctype) S_C(Sno,Cno,Score),触发器的创建,CREATE TRIGGER SCORE_KC ON S_C FOR INSERT,UPDATE AS DECLARE SCORE INT,CTYPE CHAR(4) SELECT SCORE=SCORE,CTYPE=CTYPE FROM C1,INSERTED WHERE INSERTED.CNO=C1.CNO IF(CTYPE=考查) AND (SCORE60 AND SCORE40) BEGIN RAISERROR(该课程为考查课,成绩以60或40计!,16,1) ROLLBACK TRANSACTION END,触发器的创建,CREATE TRIGGER SCORE_KC ON S_C FOR INSERT,UPDATE AS DECLARE SCORE INT,CTYPE CHAR(4) SELECT SCORE=SCORE,CTYPE=CTYPE FROM C1,INSERTED WHERE INSERTED.CNO=C1.CNO IF(CTYPE=考查) BEGIN IF SCORE=60 UPDATE S_C SET SCORE=60 WHERE CNO=(SELECT CNO FROM INSERTED) AND SNO=(SELECT SNO FROM INSERTED) ELSE UPDATE S_C SET SCORE=40 WHERE CNO=(SELECT CNO FROM INSERTED) AND SNO=(SELECT SNO FROM INSERTED) END,触发器的修改,修改触发器命令格式:,ALTER TRIGGER trigger_name ON tabel FOR | AFTER | INSTEAD OF INSERT,UPDATE,DELETE AS IF UPDATE(column) AND|OR UPDATE (column) sql_statement,触发器的删除,删除触发器命令格式:,DROP TRIGGER trigger-name 例:删除SCORE_KC触发器。 DROP TRIGGER SCORE_KC,
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号