我是靠谱客的博主 开朗彩虹,最近开发中收集的这篇文章主要介绍数据库系统概论——触发器数据库系统概论——触发器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

数据库系统概论——触发器

触发器(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>可以是INSERTDELETEUPDATE或几个事件的组合,只有当trigger condition被满足时,触发器被激活,才能让触发动作体被执行,若省略WHERE子句则会无条件触发动作体

触发器只能定义在基本表上,不能定义在视图上,当基本表的数据发送变化时,将激活定义在该表上相应触发事件的触发器

触发动作体

触发动作体可以是匿名的PL/SQL过程块,也可以是对已创建存储过程的调用,若为行级触发器,则用户可以在过程体中使用NEWOLD引用事件之后的新值和之前的旧值进行引用,否则不能

若触发动作体失败,激活触发器的事件就会终止执行,触发器的目标表或触发器可能影响的其他对象不发生任何变化

触发器类型

按照触发器类型定义行级触发器(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;

激活触发器

触发器的执行由触发事件激活的,并由数据库服务器自动执行

执行顺序

对于一个表中的多个触发器,按照如下顺序执行,多个BEFOREAFTER触发器之间可以无序执行

  • 执行该表上的BEFORE触发器

  • 激活触发器的SQL语句

  • 执行触发器的AFTER触发器

删除触发器

格式

drop trigger <trigger name> on <table name>;

权限

只有具有相应权限的用户可以删除相应的触发器

鸣谢

数据库系统概论(第5版)
数据库系统概念(原书第6版)

最后

  • 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解

最后

以上就是开朗彩虹为你收集整理的数据库系统概论——触发器数据库系统概论——触发器的全部内容,希望文章能够帮你解决数据库系统概论——触发器数据库系统概论——触发器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部