Oracle数据库触发器类型概述(oracle触发器类型)

Oracle 数据库触发器是一种特殊的存储过程,在数据库表或视图上创建,它可以在数据库某种特定操作完成之后自动被调用。它有助于简化复杂的数据库操作,可以更高效地应对多种情况而不用轮询数据表来顺序执行任务。Oracle数据库触发器类型主要分为四个:行触发器、表触发器、系统触发器和BEFORE/AFTER触发器。

行触发器只在表中某行被修改时才触发,语法形式为:

“`sql

CREATE OR REPLACE TRIGGER t_name

BEFORE / AFTER INSERT / UPDATE / DELETE

OF col1, …, colN

ON tab_name

[REFERENCING OLD AS o NEW AS n]

[FOR EACH ROW]

[WHENEVER [NOT] [CONDITION]]

[DECLARE …]

BEGIN

END;

例如,一个简单的行触发器,将记录插入订单历史表:
```sql
CREATE OR REPLACE TRIGGER new_order
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
INSERT INTO orders_history (order_id, customer_id, order_date, order_value)
VALUES (:NEW.order_id, :NEW.customer_id, :NEW.order_date, :NEW.order_value);
END;
/

表触发器不关心特定而是在整个表上定义,语法形式为:

“`sql

CREATE OR REPLACE TRIGGER trg_name

BEFORE / AFTER INSERT / UPDATE / DELETE

ON tab_name

[FOR EACH ROW]

[WHENEVER [NOT] [CONDITION]]

[DECLARE …]

BEGIN

END;

例如,下面的表触发器的作用是在插入订单表的记录后使用LOGGER包记录日志:
```sql
CREATE OR REPLACE TRIGGER new_order
AFTER INSERT ON orders
BEGIN
INSERT_LOG (
'Inserting order '||:NEW.order_id,
'New order inserted with customer '|| :NEW.customer_id
);
END;
/

系统触发器是在一个特定时间时触发,语法形式由下面两种之一:

“`sql

CREATE OR REPLACE TRIGGER trg_name

BEFORE / AFTER

{START OF {[DAY OF] [WEEK OF] MONTH OF] YEAR OF}

[(date `yyyy-mm-dd` / INTERVAL `integer` {DAY|HOUR|MINUTE|SECOND})]

ON SCHEMA / DATABASE

[WHENEVER [NOT] [CONDITION]]

[DECLARE …]

BEGIN

END;


例如,下面的系统触发器在每周的周一0点被调用:

```sql
CREATE OR REPLACE TRIGGER weekly_cnt
EVERY MONDAY AT 12:00 A.M.
ON SCHEMA
BEGIN
...
END;

BEFORE/AFTER触发器分为基于行的触发器和基于表的触发器,它们有相似的语法。

基于行的语法形式为:

“`sql

CREATE OR REPLACE TRIGGER trg_name

BEFORE / AFTER INSERT / UPDATE / DELETE

OF col1, …, colN

ON tab_name

REFERENCING OLD AS o NEW AS n

[FOR EACH ROW]

[WHENEVER [NOT] [CONDITION]]

[DECLARE …]

BEGIN

END;


基于表的语法形式为:

```sql
CREATE OR REPLACE TRIGGER trg_name
BEFORE / AFTER INSERT / UPDATE / DELETE
ON tab_name
REFERENCING _NEW AS NEW OLD AS OLD
[FOR EACH ROW]
[WHENEVER [NOT] [CONDITION]]
[DECLARE ...]
BEGIN
...
END;

例如,下面的两个BEFORE/AFTER触发器,它们的作用是将删除的行保存在日志表中:

“`sql

–Create a row level BEFORE/AFTER Trigger

CREATE OR REPLACE TRIGGER log_del_order

BEFORE DELETE

ON orders

REFERENCING OLD AS oldrow

FOR EACH ROW

BEGIN

INSERT INTO log_table

(id,customer_id,order_date,order_value)

VALUES (oldrow.order_id, oldrow.customer_id, oldrow.order_date, oldrow.order_value);

END;

/


```sql
--Create a table level BEFORE/AFTER Trigger
CREATE OR REPLACE TRIGGER log_ins_order
AFTER DELETE
ON orders
REFERENCING OLD AS oldrow
BEGIN
FORALL indx IN 1 .. oldrow.COUNT
INSERT INTO log_table
(id,customer_id,order_date,order_value)
VALUES (oldrow(indx).order_id, oldrow(indx).customer_id, oldrow(indx).order_date, oldrow(indx).order_value);
END;
/

以上是Oracle数据库触发器类型的概述,用于管理数据库表的实时事件。它们的使用有助于更加高效的管理数据库表,使用不同的数据库触发器类型可以根据需要完成更多的事务操作。


数据运维技术 » Oracle数据库触发器类型概述(oracle触发器类型)