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

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

触发器(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版)

最后

  • 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值