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;
例如,一个简单的行触发器,将记录插入订单历史表:
```sqlCREATE 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包记录日志:
```sqlCREATE OR REPLACE TRIGGER new_order
AFTER INSERT ON ordersBEGIN
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点被调用:
```sqlCREATE 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;
基于表的语法形式为:
```sqlCREATE 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数据库触发器类型的概述,用于管理数据库表的实时事件。它们的使用有助于更加高效的管理数据库表,使用不同的数据库触发器类型可以根据需要完成更多的事务操作。