资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第,7,章,存储过程和触发器,7.1,存储过程,7.2,触发器,7.2,触发器,触发器(,trigger,)是一种特殊的存储过程,它不同于一般的存储,过程:,一般,的存储过程通过存储过程名称被直接,调用,触发器,主要是通过事件进行触发而被执行,。,7.2,触发器,触发器的主要作用是实现由主键和外键等约束所不能保证的复杂的参照完整性和数据一致性。,除此之外,触发器还有以下作用:,触发器可以对数据库进行级联修改。,实现比,CHECK,约束更为复杂的限制。,比较数据修改前后的差别。,强制表的修改要合乎业务规则。,7.2,触发器,按照触发响应时间按的不同,可以将触发器分为两大类:后触发器和前触发器。,(,1,)后触发器(,After Trigger,):,这种类型的触发器将在数据变动(,UPDATE,、,INSERT,和,DELETE,操作)完成后才被触发。,指定,AFTER,与指定,FOR,相同。,AFTER,触发器只能在表上定义。,在同一个数据表中可以创建多个,AFTER,触发器。,默认的为,AFTER,触发器。,7.2,触发器,按照触发响应时间按的不同,可以将触发器分为两大类:后触发器和前触发器。,(,2,)前触发器(,Inserted Of Trigger,):,INSTEAD OF,触发器在数据变动以前被触发,并取代变动数据的操作(,UPDATE,、,INSERT,和,DELETE,操作),而去执行触发器定义的操作。,INSTEAD OF,触发器可以在表或视图上定义。,在表或视图上,每个,UPDATE,、,INSERT,和,DELETE,语句最多可以定义一个,INSTEAD OF,触发器。,7.2,触发器,语法格式:,CREATE TRIGGER schema_name.trigger_name,ON table|view /*,指定操作对象,*,/,WITH ENCRYPTION/*,说明是否采用加密方式,*,/,FOR|AFTER|INSTEAD OF,INSERT ,UPDATE ,DELETE ,WITH APPEND,NOT FOR REPLICATION /*,说明该触发器不用于复制,*,/,AS sql_statement ;.n,|EXTERNAL NAME asse MBly_name.class_name.method_name,触发器中使用的特殊表,当触发器引用视图或者临时表,并产生两个特殊的表:,deleted,表和,inserted,表。,执行,INSERT,语句或,UPDATE,语句向表中插入数据行时,插入到触发器表中的行作为复本同时将被插入到,inserted,表中;,执行,DELETE,语句删除表中数据时,触发表中被删除的行作为复本被插入到,deleted,表中;,执行,UPDATE,语句修改数据时,先删除触发表中的旧行,并将该旧行插入,deleted,表中,再插入新行,同时将新行插入到,inserted,表中。,触发器的主要作用是实现由主键和外键等约束所不能保证的复杂的参照完整性和数据一致性。,除此之外,触发器还有以下作用:,触发器可以对数据库进行级联修改。,实现比,CHECK,约束更为复杂的限制。,比较数据修改前后的差别。,强制表的修改要合乎业务规则。,使用,触发器实现复杂,的参照完整性和数据一致性。,例,1:,若修改,SC,中一个记录的学号,则要检查,S,中是否存在与该学号相同的记录,若有则不允许修改,若没有则可以修改,.,CREATE TRIGGER TRIGGER_SC ON dbo.sc,FOR UPDATE,AS,IF UPDATE(SNO),BEGIN,DECLARE SNO_NEW CHAR(2),SNO_OLD CHAR(2),SNO_CNT INT,SELECT SNO_OLD=SNO FROM DELETED,SELECT SNO_CNT=COUNT(*)FROM S,WHERE SNO=SNO_OLD,IF SNO_CNT0,ROLLBACK TRANSACTION,END,使用触发器对,数据库进行级联修改,。,例,2.,若修改表,S,中一学生的学号,则表,SC,中与该学生相关的学号被自动修改,.,CREATE TRIGGER TRIGGER_S ON dbo.s,FOR UPDATE,AS,IF UPDATE(SNO),BEGIN,DECLARE SNO_NEW CHAR(2),SNO_OLD CHAR(2),SELECT SNO_NEW=SNO FROM INSERTED,SELECT SNO_OLD=SNO FROM DELETED,UPDATE SC SET SNO=SNO_NEW,WHERE SNO=SNO_OLD,END,使用触发器对,数据库进行级联修改,。,例,3,:为,C,表创建一个级联删除触发器,:,通过课程名从,C,中删除某课程信息,同时删除表,SC,中与此课程相关的选课记录,.,CREATE TRIGGER TRIGGER_C ON dbo.c,FOR DELETE,AS,DECLARE CNO CHAR(2),SELECT CNO=CNO FROM DELETED,DELETE FROM SC,WHERE CNO=CNO,使用触发器实现,比,CHECK,约束更为复杂的限制,例,4,:为,SC,表创建一触发器,当插入一个记录或修改成绩时,确保此记录的成绩为,0100,分,.,CREATE TRIGGER TRIGGER_SC1 ON dbo.sc,FOR INSERT,UPDATE,AS,DECLARE SCORE TINYINT,SELECT SCORE=SCORE FROM INSERTED,IF SCORE0 AND SCORE=100,BEGIN,PRINT,操作完成,return,end,print,成绩超出,0-100,rollback transaction,go,Insert into sc,values(2,4,80),Go,结果:,操作完成,(1,行受影响,),Insert into sc,values(2,5,101),Go,成绩超出,-100,消息,3609,,级别,16,,状态,1,,第,1,行,事务在触发器中结束。批处理已中止。,
展开阅读全文