天天看点

数据库笔记(SQL之触发器)1 触发器概述2 触发器触发时机3 触发器触发条件4 触发器的完整声明

1 触发器概述

触发器是当数据库内容发生修改时,数据库系统自动执行的一系列语句。

对于数据库的设计,主要有三点:

1. 什么样的事件进行会被数据库进行触发器的检查。

2. 检查后什么样的条件会导致触发器的触发。

3. 触发时什么样的行为会被执行。

注意:与存储过程以及函数相同,该触发器代码是标准SQL。不同数据库系统可能有着不同的语法,实际运用时还需要看相应数据库的文档。

2 触发器触发时机

触发时机基本在进行insert、delete、update操作的时机。而这几个操作都有两个时间点,after以及before,分别表示操作进行前以及操作进行后。在声明时,除了以上两个因素之外,还要指定触发器对应的表,使用on关键词进行声明。完整时机声明示例如下:

对于update操作时机,还可以使用of关键词选择对于表的某个属性进行触发。示例如下:

3 触发器触发条件

触发条件使用when语句来进行判断。

使用for each row来表明对于每当有行被修改时都进行判断。此时在该语句中可能会需要出现对当前进行操作的行进行命名,使用语句referencing old row as进行修改前的行的命名,referencing new row as进行修改后的行的命名。

如果需要让触发器在对某个表进行操作的SQL语句后进行触发(譬如更新语句的触发,当某个更新复数个行的更新语句进行操作之后),则使用for each statement。此时,被操作的对象成了表而不是行,需要使用referencing old table as以及referencing new table as来命名被操作的表,该表被称为临时表。

另外,使用for each statement时,若是触发实际为before,则在触发器中不能使用临时表,但是after实际可以使用。

4 触发器的完整声明

触发器的声明包括触发实际、触发条件以及触发器执行内容。其完整示例如下:

create trigger timeslot_check1 after insert on section
referencing new row as n_row
for each row
when (n_row.time_slot_id not in(
        select time_slot_id
        from time_slot))
begin
    rollback
end;