11.1.4 触发器的语法

了解语法是使用触发器的第一步,它就像一个公式,能让我们迅速地创建出自己的触发器。下面列出了几种触发器的语法。

1)DML触发器的主要语法如下:


01 CREATE[OR REPLACE]TRIGGER[schema.]trigger

02 {BEFORE|AFTER|INSTEAD OF}

03 {DELETE|INSERT|UPDATE

04 [OF column[,column]…]

05 }

06 [OR{DELETE|INSERT|UPDATE

07 [OF column[,column]…]

08 }

09 ]…

10 {ON[schema.]table|[schema.]view}

11 [FOR EACH ROW]

12 [FOLLOWS[schema.]trigger[,[schema.]trigger]…]

13 [ENABLE|DISABLE]

14 [WHEN(condition)]

15 trigger_body


【语法说明】

❑OR REPLACE:新建的触发器可以覆盖原有同名触发器。

❑TRIGGER:创建触发器的关键词。

❑schema:触发器所属模式(可简单看成用户名),如果不加该项则表示该触发器属于自己。

❑BEFORE:触发器类型为前触发。

❑AFTER:触发器类型为后触发。

❑INSTEAD OF:表示触发器类型为替换类型。

❑DELETE|INSERT|UPDATE:表示触发的事件。

❑[OF column[,column]:触发条件具体到的某列。

❑第6~9行表示可以追加多个条件。

❑ON[schema.]table|[schema.]view:该触发器作用的表或视图,INSTEAD OF类型可以作用在视图上。

❑FOR EACH ROW:表示行级触发器,省略则为语句级触发器。

❑FOLLOWS[schema.]trigger:触发器执行的顺序。

❑ENABLE|DISABLE:设置触发器是否可用状态。

❑WHEN(condition):触发该触发器的条件。

❑trigger_body:表示触发器的函数体。

2)DDL和数据库事件触发器语法如下:


01 CREATE[OR REPLACE]TRIGGER[schema.]trigger

02 {BEFORE|AFTER}

03 {ddl_event[OR ddl_event]…

04 |database_event[OR database_event]…

05 }

06 ON{[schema.]SCHEMA

07 |DATABASE

08 }

09 [FOLLOWS[schema.]trigger[,[schema.]trigger]…]

10 [ENABLE|DISABLE]

11 [WHEN(condition)]

12 trigger_body


【语法说明】

❑OR REPLACE:新建的触发器可以覆盖原有同名触发器。

❑TRIGGER:创建触发器的关键词。

❑schema:触发器所属模式,如果不加该项则表示该触发器属于自己。

❑BEFORE:触发器类型为前触发。

❑AFTER:触发器类型为后触发。

❑ddl_event[OR ddl_event]:DDL事件,用OR连接。

❑database_event[OR database_event]:数据库事件,用OR连接。

❑[schema.]SCHEMA|DATABASE:触发器可作用在模式上或数据库上。

❑FOLLOWS[schema.]trigger:触发器执行的顺序。

❑ENABLE|DISABLE:设置触发器是否可用状态。

❑WHEN(condition):触发该触发器的条件。

❑trigger_body:表示触发器的函数体。

表11.1列出了一部分DDL事件,这些事件都可以激发触发器。

11.1.4 触发器的语法 - 图1

表11.2列出了部分数据库事件,这些事件也会激发触发器。

11.1.4 触发器的语法 - 图2

触发器由三部分组成。它们分别是触发事件或语句、触发器限制、触发器动作。

❑触发事件或语句是指激发触发器的动作,具体指11.1.1小节介绍的事件操作。

❑触发器限制指的是WHEN后面的条件,当条件为TRUE时,该触发器会被激发。

❑触发器动作就是一段过程,当触发器被激发时运行的trigger_body部分。

3)复合触发器也是DML触发器的一种,它的主要语法如下:


01 CREATE[OR REPLACE]TRIGGER[schema.]trigger

02 FOR

03 {DELETE|INSERT|UPDATE

04 [OF column[,column]…]

05 }

06 [OR{DELETE|INSERT|UPDATE

07 [OF column[,column]…]

08 }

09 ]…

10 ON{[schema.]table

11 |[schema.]view

12 }

13 COMPOUND TRIGGER

14 {BEFORE STATEMENT IS tps_body END BEFORE STATEMENT]

15 |BEFORE EACH ROW IS tps_body END BEFORE EACH ROW

16 |AFTER STATEMENT IS tps_body END AFTER STATEMENT

17 |AFTER EACH ROW IS tps_body END AFTER EACH ROW

18 }


【语法说明】

❑OR REPLACE:新建的触发器可以覆盖原有同名触发器。

❑TRIGGER:创建触发器的关键词。

❑schema:触发器所属模式,如果不加该项则表示该触发器属于自己。

❑DELETE|INSERT|UPDATE:表示触发事件。

❑COMPOUND TRIGGER:定义触发器时表示为复合类型触发器。

❑BEFORE STATEMENT:前语句级触发。

❑BEFORE EACH ROW:前行级触发。

❑AFTER STATEMENT:后语句级触发。

❑AFTER EACH ROW:后行级触发。

❑tps_body:具体语句或程序。

该类型是Oracle 11g新增加的触发器类型,比较方便地处理4个时间点,这将在后面章节介绍。