5.3.2 SQL中的触发器

5.3.2 SQL中的触发器

现在我们来看如何在SQL中实现触发器。我们在这里介绍的是SQL标准定义的语法,但是大部分数据库实现的是非标准版本的语法。尽管这里所述的语法可能不被这些系统支持,但是我们阐述的概念对于不同的实现方法都是适用的。我们将在本章末尾讨论非标准的触发器实现。
图5-8展示了如何使用触发器来确保关系section中属性time_sotd的参照完整性。

1
2
3
4
5
6
7
8
9
10
11
12
-- 在插入时启动触发器
create trigger timeslot_check after insert on section
-- 过渡变量:插入完成后存储所插入行的值
referencing new row as nrow
-- 对每一个插入行迭代
for each row
-- time_slot_id不存在该id
when (nrow.time_slot_id not in
(select time_slot_id from time_slot))
begin
rollback
end;

图中第一个触发器的定义指明该触发器在任何一次对关系section的插入操作执行之后被启动,以确保所插入元组的time slot id字段是合法的。一个SQL插人语句可以向关系中插入多个元组,在触发器代码中的foreach row语句可以显式地在每一个被插入的行上进行迭代。 referencing new row as语句建立了一个变量mo(称为过渡变量transition variable),用来在插入完成后存储所插入行的值。
这里省略大部分,有空再补上.

非标准的触发器语法

使触发器无效

触发器可以设为有效或者无效:默认情况下它们在创建时是有效的,但是可以通过使用alter trigger trigger_name disable(某些数据库使用另一种语法,比如disable trigger trigger_name)将其设为无效。
设为无效的触发器可以重新设为有效。

删除触发器

通过使用命令drop trigger trigger_name,触发器也可以被丢弃,即将其永久移除。

参考资料

《数据库系统概念(第六版)》读书笔记——第6章:高级SQL