网络数据库讲稿(触发器)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

触发器P191

一、触发器概述

1.是一种特殊的存储过程。

2.不能被显式调用,只能由一些特定的操作(命令)引发(激活),这些命令是:INSERT、DELETE、UPDATE、CREATE、ALTER、DROP、GRANT、DENY、REVOKE等。

3.每个触发器由三部分组成

①触发器名称:命名规则与变量名、存储过程名相同;

②激活该触发器的操作(命令动词)。

③一个存储过程。

4.使用触发器可强制实现数据的一致性和完整性。

二、触发器的分类(按引发命令分类) 及其工作原理

1.DML触发器(表级)

(1)触发器必须依附于某一个表(触发器必须被包含在某一个表中)。

(2)激活该触发器的操作:可以是INSERT、DELETE、UPDATE之一。

(3)当上述操作发生在包含触发器的表上时,触发器中的过程被自动执行。

(4)支持两种类型的触发器:

①AFTER

可以为同一表的同一操作定义多个该类型的触发器,并可定义执行顺序;

②INSTEAD OF

同一表的同一操作只能定义一个该类型的触发器。

(5)工作原理P193

临时逻辑表INSERTED和DELETED。

2.DDL触发器(数据库级和服务器级)

(1)触发器必须依附于某一个数据库(触发器必须被包含在某一个数据库中)。

(2)激活该触发器的操作:可以是CREATE、ALTER、DROP、GRANT、DENY、

REVOKE等之一。

(3)当上述操作发生在包含触发器的数据库上时,触发器中的过程被自动执行。

(4)只有AFTER型触发器。

三、创建DML触发器P194

用命令CREATE TRIGGER创建

例:

1.

CREATE TRIGGER 增加学生学分ON 成绩

FOR INSERT

AS

UPDATE 学生SET 已修学分=已修学分+(SELECT SUM(学分) FROM 课程

WHERE 课程编号IN

(SELECT DISTINCT 课程编号FROM INSERTED

WHERE 学生.学号= INSERTED.学号AND 分数>=60))

WHERE EXISTS

(SELECT DISTINCT 课程编号FROM INSERTED

WHERE 学生.学号= INSERTED.学号AND 分数>=60)

2.

CREATE TRIGGER 减少学生学分ON 成绩

FOR DELETE

AS

UPDATE 学生SET 已修学分=已修学分-(SELECT SUM(学分) FROM 课程WHERE 课程编号IN

(SELECT DISTINCT 课程编号FROM DELETED

WHERE 学生.学号=DELETED.学号AND 分数>=60))

WHERE EXISTS

(SELECT DISTINCT 课程编号FROM DELETED

WHERE 学生.学号=DELETED.学号AND 分数>=60)

3.

CREATE TRIGGER 修改学生学分ON 成绩

FOR UPDATE

AS

UPDATE 学生SET 已修学分=已修学分-(SELECT SUM(学分) FROM 课程WHERE 课程编号IN

(SELECT DISTINCT 课程编号FROM DELETED

WHERE 学生.学号=DELETED.学号AND 分数>=60))

WHERE EXISTS

(SELECT DISTINCT 课程编号FROM DELETED

WHERE 学生.学号=DELETED.学号AND 分数>=60)

UPDATE 学生SET 已修学分=已修学分+(SELECT SUM(学分) FROM 课程WHERE 课程编号IN

(SELECT DISTINCT 课程编号FROM INSERTED

WHERE 学生.学号=INSERTED.学号AND 分数>=60))

WHERE EXISTS

(SELECT DISTINCT 课程编号FROM INSERTED

WHERE 学生.学号=INSERTED.学号AND 分数>=60)

4.“修改学生学分”也可改为:

CREATE TRIGGER 修改学生学分ON 成绩

FOR UPDATE

AS

UPDATE 学生SET 已修学分=(SELECT SUM(学分) FROM 课程

WHERE 课程编号IN

(SELECT 课程编号FROM 成绩

WHERE 学生.学号=成绩.学号AND 分数>=60))

然后可执行下列命令,并检验执行结果。

--INSERT INTO 成绩V ALUES('200202','L2020308',83)

--INSERT INTO 成绩V ALUES('200202','L2030501',80)

--INSERT INTO 成绩V ALUES('200202','L2030506',75)

--DELETE FROM 成绩WHERE 学号='200202' AND LEFT(课程编号,1)='L'

--UPDA TE 成绩SET 分数=80 WHERE 学号='200202' AND LEFT(课程编号,1)='L'

四、创建DDL触发器P198

例:

1. P199

CREATE TRIGGER 禁删与修改表 ON DATABASE

FOR DROP_TABLE,ALTER_TABLE

AS

PRINT'请不要删除或修改表!'

ROLLBACK TRANSACTION

2.

CREATE TRIGGER 禁删与修改数据库 ON ALL SERVER

FOR DROP_DATABASE,ALTER_DATABASE

AS

PRINT'请不要删除或修改数据库!'

ROLLBACK TRANSACTION

DROP DATABASE订货管理

五、嵌套触发器和递归触发器P199, P200

1. 概念

2. 禁用与启用嵌套触发器

①在对象资源管理器中打开服务器属性窗口,选“高级”,修改“允许触发器激发其

他触发器”。

②调用存储过程SP_CONFIGURE'NESTED TRIGGER',1或0

3. 禁用与启用递归触发器

①在对象资源管理器中打开数据库属性窗口,选“选项”,修改“递归触发器已启用”。

②命令 ALTER DATABASE 数据库名 SET RECURSIVE_TRIGGERS ON 或 OFF

4. 例

六、管理触发器P201

1.查看

相关文档
最新文档