单元29:触发器问题引入问题:如果学校要求:每位教师1学期任教科目不得超过2门、任教总课时不得超过300,如何实现该要求?classIDcourseIDteacherIDterm08040020012050400710804002001206040071若要向该表插入如下记录,能否成功?(0804002001,207,04007,1)问题引入完全可以插入,因为1.不存在主键冲突2.不存在外键冲突(假设班级、课程、教师都存在)因此,一般的约束达不到这种限制要求(企业逻辑或企业规则)触发器——可以实现这种强制性业务规则触发器的概念1.2.创建和应用触发器主要内容修改和删除触发器3.1.1触发器的概念触发器分为DML(数据操作语言)触发器和DDL(数据定义语言)触发器。DML触发器用于响应数据库数据操作(INSERT、UPDATE、DELETE)事件,建立在数据库对象(表、视图)上。DDL触发器用于响应各种数据定义语言事件(CREATE、ALTER、DROP),建立在服务器或数据库上。触发器必须依赖于某个对象,不允许带参数,也不允许被调用。1.2DML触发器的原理DML触发器都会创建两个专用临时表:INSERTED表——存放执行INSERT或UPDATE语句而需要向表中插入的记录。DELETED表——存放执行DELETE或UPDATE语句而需要从表中删除的记录。这两个表的结构和触发器作用的表结构完全相同触发器执行完成后,这两个表也会删除触发器的工作原理触发器的工作原理执行INSERT,UPDATE,DELETE生成临时表:Inserted和Deleted该表设置了触发器将数据送入Inserted或Deleted表是否合乎事务处理?执行相关操作,自动删除临时表YN给出提示,执行不成功系统先检查数据的正确性,如果正确才执行触发器的定义代码.1.2DML触发器的作用(1)多张表的级联修改。(2)强于CHECK的复杂限制。(3)比较数据修改前后的差别。(4)强制表的修改要合乎业务规则。2.1创建DML触发器CREATETRIGGER触发器名ON表名或视图名称WITHENCRYPTION--加密定义代码(可选){FOR|AFTER|INSTEADOF}{[INSERT][,][UPDATE][,][DELETE]}[NOTFORREPLICATION]--对于复制不强制触发器AS[{IFUPDATE(列名)[{AND|OR}UPDATE(列名)]}SQL语句2.1创建DML触发器【例】创建触发器,禁止修改学生表的主键列CREATETRIGGERtrig1--触发器名称为trig2ONstudent--指明触发器所在的表AFTERUPDATE--执行更新命令后触发ASIFUPDATE(sno)--如果修改的列是学号BEGINRAISERROR('不允许修改主键列!',16,1)ROLLBACKTRAN--回退事务,使更新不执行END2.1创建DML触发器验证该触发器注意:如果成绩表中有相应的学号,则该学号不可以修改,除非设置了参照约束为级联更新!SELECTTOP1snoFROMstudentWHEREsnoNOTIN(SELECTsnoFROMscore)–查询没有成绩的学号,返回一条记录UPDATEstudentSETsno=‘000000’WHEREsno=(SELECTTOP1snoFROMstudentWHEREsnoNOTIN(SELECTsnoFROMscore))2.1创建DML触发器【例】创建触发器,如果向学生表中插入了一条记录,则给出一个消息。CREATETRIGGERtrig2ONstudentAFTERINSERTASRAISERROR('您向student表中插入了记录!',16,9)GO--验证该触发器INSERTINTOstudentVALUES('0904002001','张三','男','441025199012143658','080400101','1990-12-14','汉族','团员')2.1创建DML触发器【例】创建触发器,在timetable表中完成如下限制:每位教师每个学期任教科目不得超过2门。CREATETRIGGERtrig3ONtimetableAFTERINSERT,UPDATEASDECLARE@course_countINTSELECT@course_count=count(courseID)FROMtimetableWHEREteacherID=(SELECTteacherIDFROMinserted)ANDterm=(SELECTtermFROMinserted)2.1创建DML触发器IF@course_count>2BEGINRAISERROR('超过2门!',16,9)ROLLBACKTRANENDGO--验证该触发器INSERTINTOTIMETABLEVALUES('080100301',525,'01043',1)2.1创建DML触发器DML触发器分为后触发(AFTER)和替代触发(INSTEADOF)替代触发器由INSERT、UPDATE、DELETE动作激活,但不执行该动作,记录的插入、更新、删除由触发器语句完成。例:创建替代触发器,当在部门表(Department)插入记录时,触发器保证插入记录的departID字段值为部门表中最大departID值加12.1创建DML触发器CREATETRIGGERdepartTRIGONdepartmentINSTEADOFINSERTASDECLARE@maxDepartIDintS...