网络数据库讲稿(触发器)_第1页
网络数据库讲稿(触发器)_第2页
网络数据库讲稿(触发器)_第3页
网络数据库讲稿(触发器)_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、触发器 P191一、触发器概述1是一种特殊的存储过程。2不能被显式调用,只能由一些特定的操作(命令)引发(激活),这些命令是:INSERT、DELETE、UPDATE、CREATE、ALTER、DROP、GRANT、DENY、REVOKE等。3每个触发器由三部分组成触发器名称:命名规则与变量名、存储过程名相同;激活该触发器的操作(命令动词)。一个存储过程。4使用触发器可强制实现数据的一致性和完整性。二、触发器的分类(按引发命令分类) 及其工作原理1DML触发器(表级)(1)触发器必须依附于某一个表(触发器必须被包含在某一个表中)。(2)激活该触发器的操作:可以是INSERT、DELETE、UP

2、DATE之一。(3)当上述操作发生在包含触发器的表上时,触发器中的过程被自动执行。(4)支持两种类型的触发器:AFTER可以为同一表的同一操作定义多个该类型的触发器,并可定义执行顺序;INSTEAD OF同一表的同一操作只能定义一个该类型的触发器。(5)工作原理 P193临时逻辑表INSERTED和DELETED。2DDL触发器(数据库级和服务器级)(1)触发器必须依附于某一个数据库(触发器必须被包含在某一个数据库中)。(2)激活该触发器的操作:可以是CREATE、ALTER、DROP、GRANT、DENY、REVOKE等之一。(3)当上述操作发生在包含触发器的数据库上时,触发器中的过程被自动

3、执行。(4)只有AFTER型触发器。三、创建DML触发器 P194用命令CREATE TRIGGER创建例:1 CREATE TRIGGER 增加学生学分 ON 成绩 /只能增加一条记录FOR INSERTASDECLARE XH CHAR(6),KCH CHAR(8),FS DECIMAL(4,1)SELECT XH=学号,KCH=课程编号,FS=分数 FROM INSERTEDIF FS>=60 UPDATE 学生 SET 已修学分=已修学分+(SELECT 学分 FROM 课程 WHERE 课程编号=KCH) WHERE 学号=XH2CREATE TRIGGER 减少学生学分 ON

4、 成绩FOR DELETEASUPDATE 学生 SET 已修学分=已修学分-(SELECT SUM(学分) FROM 课程WHERE 课程编号 IN(SELECT DISTINCT 课程编号 FROM DELETEDWHERE 学生.学号=DELETED.学号 AND 分数>=60) WHERE EXISTS(SELECT DISTINCT 课程编号 FROM DELETEDWHERE 学生.学号=DELETED.学号 AND 分数>=60)3.CREATE TRIGGER 修改学生学分 ON 成绩FOR UPDATEASUPDATE 学生 SET 已修学分=已修学分-(SELE

5、CT SUM(学分) FROM 课程WHERE 课程编号 IN(SELECT DISTINCT 课程编号 FROM DELETEDWHERE 学生.学号=DELETED.学号 AND 分数>=60)WHERE EXISTS(SELECT DISTINCT 课程编号 FROM DELETEDWHERE 学生.学号=DELETED.学号 AND 分数>=60)UPDATE 学生 SET 已修学分=已修学分+(SELECT SUM(学分) FROM 课程WHERE 课程编号 IN(SELECT DISTINCT 课程编号 FROM INSERTEDWHERE 学生.学号=INSERTED

6、.学号 AND 分数>=60)WHERE EXISTS(SELECT DISTINCT 课程编号 FROM INSERTEDWHERE 学生.学号=INSERTED.学号 AND 分数>=60)4.“修改学生学分”也可改为:CREATE TRIGGER 修改学生学分 ON 成绩FOR UPDATEASUPDATE 学生 SET 已修学分=(SELECT SUM(学分) FROM 课程WHERE 课程编号 IN(SELECT 课程编号 FROM 成绩WHERE 学生.学号=成绩.学号 AND 分数>=60)然后可执行下列命令,并检验执行结果。-INSERT INTO 成绩 VA

7、LUES('200202','L2020308',83)-INSERT INTO 成绩 VALUES('200202','L2030501',80)-INSERT INTO 成绩 VALUES('200202','L2030506',75)-DELETE FROM 成绩 WHERE 学号='200202' AND LEFT(课程编号,1)='L'-UPDATE 成绩 SET 分数=80 WHERE 学号='200202' AND LEFT(课程编号,1

8、)='L'四、创建DDL触发器 P198例:1. P1992. CREATE TRIGGER 禁删数据库ON ALL SERVERFOR DROP_DATABASEASPRINT '请不要删除数据库!'ROLLBACK TRANSACTIONDROP DATABASE 订货管理五、嵌套触发器和递归触发器 P199, P200六、管理触发器 P2011查看2修改3禁用4删除-根据成绩表计算每个学生的已修学分update 学生set 已修学分=(select sum(学分) from 课程where 课程编号in(select 课程编号from 成绩where 学生

9、.学号=成绩.学号 and 分数>=60)-修改插入触发器,使得向成绩表中插入多条记录,也能成功执行CREATE TRIGGER 插入学生学分ON 成绩FOR insertASUPDATE 学生SET 已修学分=已修学分+(SELECT SUM(学分) FROM 课程WHERE 课程编号IN(SELECT DISTINCT 课程编号FROM insertedWHERE 学生.学号=inserted.学号AND 分数>=60) WHERE EXISTS(SELECT DISTINCT 课程编号FROM insertedWHERE 学生.学号=inserted.学号AND 分数>

10、=60)select * from 成绩select 学号,已修学分from 学生INSERT INTO 成绩VALUES('200202','L2020308',83)INSERT INTO 成绩VALUES('200202','L2030501',80)INSERT INTO 成绩VALUES('200202','L2030506',75)INSERT INTO 成绩VALUES('200201','L2020308',83)INSERT INTO 成绩VALUES('200201','L2030501',80)INSERT INTO 成绩VALUES('200201','L2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论