数据库原理-第五章(02)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
触发器的定义
• CREATE TRIGGER语法格式
– CREATE TRIGGER <触发器名> <BEFORE | AFTER> <触发事件> ON <表名> FOR EACH <ROW | STATEMENT> [WHEN <触发条件>] <触发动作体>
4
定义触发器
触发器的定义
• 语法详解
end
18
Sqlserver2005中的触发器 请看下面例题
• 例2:第二种做法。
– create trigger stu2 on student after insert as begin Rollback Transaction; print '不让插入数据啦'; end
19
Sqlserver2005中的触发器 删除前两个例题定义的触发器,请看下面例题
7
• [例19]续
– CREATE TRIGGER Update_Sal AFTER UPDATE ON Teacher FOR EACH ROW AS BEGIN IF (new.Sal <> old.Sal) THEN INSERT INTO Sal_log VALUES(new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP); END IF; END;
– 原操作(激活触发器的事件)完成后执行触发器过程块中的内 容。
16
Sqlserver2005中的触发器 请看下面例题
• 例1:为student表格定义一个触发器Stu1,完成以下 功能:每当向student表格中插入一次数据后,在控制 台提示“student表格中有数据插入”。
– create trigger stu1 on student after insert as begin print ‘student 表格中有数据插入’; end
25
数据库原理
主讲人:王子健
Hale Waihona Puke Baidu
1
第五章
数据库完整性
实体完整性 参照完整性 用户自定义的完整性 完整性约束命名子句 触发器
2
5.6 触发器
定义触发器 激活触发器 删除触发器 Sqlserver2005中的触发器
3
定义触发器
触发器是什么?
• 触发器是用户定义在关系表中的一类由事件驱动的特殊过程。 • 表中数据的增、删、改操作是激活触发器的事件。 • 触发器可以实施比foreign key约束、check约束更为复杂的检查 和操作,具有更精细和更强大的数据控制能力。
– – – – – – 创建者:表的拥有者 触发器名:为触发器命名 表名:触发器的目标表的名字 触发事件:INSERT、DELETE、UPDATE或它们的组合 触发器的类型:行级触发器和语句级触发器 触发条件:触发器被激活时,根据该条件判断是否执行<触发动作体 >
– 触发动作条:是一个匿名过程块,或是对以创建存储过程的调用。 如果是行级触发器,用户可以在过程体中使用NEW和OLD引用 UPDATE/INSERT事件之后的新值和UPDATE/DELETE事件之前的 旧值。如果是语句级触发器则不能在动作体中使用NEW或OLD进行 引用。
11
删除触发器
删除触发器的SQL语法:
• DROP TRIGGER <触发器名> ON <表名>; • 触发器必须是一个已经创建的触发器,并且只能由具有 相应权限的用户删除。 • [例21] 删除教师表Teacher上的触发器Insert_Sal
– DROP TRIGGER Insert_Sal ON Teacher;
8
5.6 触发器
定义触发器 激活触发器 删除触发器 Sqlserver2005中的触发器
9
激活触发器
触发器的执行,是由触发事件激活的,并由数据 库服务器自动执行。 一个数据表上可能定义了多个触发器同一个表上 的多个触发器激活时遵循如下的执行顺序:
• • • • (1) 执行该表上的BEFORE触发器; (2) 激活触发器的SQL语句; (3) 执行该表上的AFTER触发器。 同一个表上的多个BEFORE(AFTER)触发器的执行 顺序:
15
Sqlserver2005中的触发器 触发器的功能?
• • • • 完成更复杂的数据约束。 检查所做的SQL是否允许。 修改其它数据表里的数据 返回自定义的错误信息。
触发器的分类
• Instead of 触发器
– 触发器触发后,用触发器中定义的过程块取代原操作(激活触 发器的事件)
• After 触发器
– inserted表中存放新的记录。 – Deleted表中存放旧的记录。
• 两个表的具体存放信息如下:
激活触发器事件 insert update delete inserted表 存放要插入的记录 存放要更后的记录 存放更新前的记录 存放被删除的记录 deleted表
21
Sqlserver2005中的触发器 触发器的工作原理(续)
14
Sqlserver2005中的触发器 触发器的定义?
• 在定义触发器时应指定触发器的:
– – – – – 名称 目标表格 触发事件 类型(执行动作体的方式) 动作体(过程块)
• 触发器的定义语句
– Create Trigger <触发器名> On <目标表名> < After || Instead of > < Insert || Update || Delete > As Begin <动作体> END
• 两个临时表在触发器被激活时创建,在触发器工作结束后消失。 • 两个表都是只读的,只能查询其中的数据,但是不能更新。 • 在触发器的动作体中可以查询两个临时表,触发器工作结束后 则不能再查询
22
Sqlserver2005中的触发器 根据以上分析,我们再来看下例3
• 例3:为student表格定义一个触发器stu3,使student表格中只能 插入男同学的数据。
12
5.6 触发器
定义触发器 激活触发器 删除触发器 Sqlserver2005中的触发器
13
Sqlserver2005中的触发器 触发器是什么?
• 触发器是用户定义在关系表中的一类由事件驱动的特殊 过程。 • 在执行某些特定的SQL语句(触发特定事件)时自动执 行。 • 表的创建,修改,删除是激发触发器的事件(DDL触发 器) • 表中数据的增、删、改操作是激活触发器的事件 (DML触发器)。 • 触发器可以实施比foreign key约束、check约束更为 复杂的检查和操作,具有更精细和更强大的数据控制能 力。
– create trigger stu3 on student instead of insert as begin if( (select Ssex from inserted) <> '男' ) begin print '只能插入男同学记录'; end else begin insert into student select * from inserted; end end
23
删除之前建立的触发器,请看下面例题
• 例4:为student表格定义一个触发器stu4,当发生主键冲突时提示错误并拒绝 操作。
– – – – – – – – – – – – – – – – – – – – – – – – – create trigger stu4 on student instead of insert , update as begin if( ( select count(*) from ( select Sno from inserted where sno in ( select sno from student ) )X ) <> 0 ) begin print '存在主键冲突'; end else begin insert into student select * from inserted; end end
– 遵循“谁先创建,谁先执行”的原则 – 按字母顺序
10
激活触发器
例题
• [例20]执行修改某个教师工资的SQL语句,激活上 述定义的触发器。
– UPDATE Teacher SET Sal=800 WHERE Ename='陈平';
•
执行顺序是:
– 执行触发器Insert_Or_Update_Sal – 执行SQL语句“UPDATE Teacher SET Sal=800 WHERE Ename='陈平';” – 执行触发器Insert_Sal; – 执行触发器Update_Sal
5
定义触发器
触发器的定义
• [例18] 定义一个BEFORE行级触发器,为教师表Teacher定义 完整性规则“教授的工资不得低于4000元,如果低于4000元,自 动改为4000元”。
– CREATE TRIGGER Insert_Or_Update_Sal BEFORE INSERT OR UPDATE ON Teacher FOR EACH ROW AS BEGIN IF ( new.Job = '教授' ) AND (new.Sal < 4000) THEN new.Sal := 4000; END IF; END;
17
Sqlserver2005中的触发器 请看下面例题
• 例2:为student表格定义一个触发器Stu2,完成以下 功能:不允许再向student表格中插入任何数据。
– create trigger stu2 on student instead of insert as begin
print '不让插入数据啦';
• 例3:为student表格定义一个触发器stu3,使student 表格中只能插入男同学的数据。
– 该怎么做? – 请先理解触发器的工作原理。
20
Sqlserver2005中的触发器 触发器的工作原理
• 激活触发器时触发器会仿照目标表建立两个临时表,分别为 inserted表和deleted表。 • 当触发器被激活时会根据不同情况向两个表中存放相应记录
24
请自行思考下面两个例题该如何完成
• 例5:为student表格定义一个触发器stu5,完成下面功能: student表中年龄的取值范围为大于16小于26,当对 student表进行插入或更新操作时,如果年龄大于等于26, 则自动变为25;当年龄小于等于16时自动变为17。 • 例6:仿照student表新建一个日志表student_log,每当对 student表中数据进行更新或删除操作时,将被删除和更新 前的记录保存到student_log中。
6
• [例19]定义AFTER行级触发器,当教师表Teacher的工资发生变化后就 自动在工资变化表Sal_log中增加一条相应记录 • 首先建立工资变化表Sal_log
– CREATE TABLE Sal_log ( Eno NUMERIC(4) references teacher(eno) Sal NUMERIC(7,2), Username char(10), Date TIMESTAMP ); – CREATE TRIGGER Insert_Sal AFTER INSERT ON Teacher FOR EACH ROW AS BEGIN INSERT INTO Sal_log VALUES(new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP); END;