zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

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

Oracle数据库 类型 触发器 概述
2023-06-13 09:14:49 时间

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


我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题

本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 Oracle数据库触发器类型概述(oracle触发器类型)