概述
数据库系统概论——触发器
触发器(Trigger
)指的是用户定义在关系表上的一类由事件驱动的特殊过程,任何用户对表的增删改操作均由服务器自动激活相应的触发器,触发器类似于完整性约束,但可以实施更为复杂的检查和操作,具有更精细和强大的数据控制能力
触发器的功能是在特定系统事件发生时,对规则的条件进行检查,若条件成立则执行规则中的动作,否则不执行
定义触发器
格式
create trigger <trigger name>
{before | after} <event> on <table name>
referencing new | old row as <variable>
for each {row | statement}
[when <trigger condition>] <trigger action body>
其中,<trigger name>
可以带或不带模式名,<event>
可以是INSERT
、DELETE
、UPDATE
或几个事件的组合,只有当trigger condition
被满足时,触发器被激活,才能让触发动作体被执行,若省略WHERE
子句则会无条件触发动作体
触发器只能定义在基本表上,不能定义在视图上,当基本表的数据发送变化时,将激活定义在该表上相应触发事件的触发器
触发动作体
触发动作体可以是匿名的PL/SQL
过程块,也可以是对已创建存储过程的调用,若为行级触发器,则用户可以在过程体中使用NEW
和OLD
引用事件之后的新值和之前的旧值进行引用,否则不能
若触发动作体失败,激活触发器的事件就会终止执行,触发器的目标表或触发器可能影响的其他对象不发生任何变化
触发器类型
按照触发器类型定义行级触发器(FOR EACH ROW
)和语句级触发器(FOR EACH STATEMENT
)
-
行级触发器
-
语句级触发器
示例
当改变了department
表中的dept_name
值时,更新instructor
中的相应值
create trigger department_t
after update of dept_name on depeartment
referencing
old row as old_tuple
new row as new_tuple
for each row
update instructor
set dept_name = new_tuple.name
where dept_name = old_tuple.name;
在CS Building
中办公的系预算不能低于10000,若低于则改成10000
create trigger budget_t
before insert or update of budget on department
referencing
old row as old_tuple
new row as new_tuple
for each row
begin
if new_tuple.building = 'CS Building' and new_tuple.budget < 10000
then new_tuple.budget := 10000;
end if;
end;
激活触发器
触发器的执行由触发事件激活的,并由数据库服务器自动执行
执行顺序
对于一个表中的多个触发器,按照如下顺序执行,多个BEFORE
或AFTER
触发器之间可以无序执行
-
执行该表上的
BEFORE
触发器 -
激活触发器的
SQL
语句 -
执行触发器的
AFTER
触发器
删除触发器
格式
drop trigger <trigger name> on <table name>;
权限
只有具有相应权限的用户可以删除相应的触发器
鸣谢
数据库系统概论(第5版)
数据库系统概念(原书第6版)
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解
最后
以上就是开朗彩虹为你收集整理的数据库系统概论——触发器数据库系统概论——触发器的全部内容,希望文章能够帮你解决数据库系统概论——触发器数据库系统概论——触发器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复