Oracle数据库中不同类型的触发器(oracle触发器类型)

Oracle数据库有四种类型的触发器,它们在不同场景下都有各自独特的用法,可以极大提高数据库的运行效率。

——表级触发器

表级触发器就是针对表的触发器,它对应的表名和列名都存储在DBA_TRIGGERS中。 无论是新插入记录、更新记录或删除记录,表级触发器都会被触发,它可以实现记录日志、实现新数据与原数据之间的比较,还可以限制记录的改变。

下面是一个基本的表级触发器:

“`sql

CREATE OR REPLACE

TRIGGER Logging_Trigger

AFTER insert OR update OR delete

ON tbl_name

BEGIN

IF (INSERTING) THEN

INSERT INTO log_table (datetime, LogType, Username)

VALUES (SYSDATE, ‘Insert’, USER);

ELSIF (UPDATING) THEN

INSERT INTO log_table (datetime,LogType,Username)

VALUES (SYSDATE, ‘Update’, USER);

END IF;

END;


——行级触发器

行级触发器是基于某一行的触发器,它会在某一行记录被读取或改变之后被激活。在更新操作中,行级触发器可以比较旧值和新值,这对复杂更新操作是必不可少的,下面是一个创建行级触发器的例子:
```sql
CREATE OR REPLACE
TRIGGER Logging_Trigger
AFTER insert OR update OR delete
ON tbl_name
FOR EACH ROW
BEGIN
IF (INSERTING) THEN
INSERT INTO log_table (datetime, LogType, Username)
VALUES (SYSDATE, 'Insert', USER);
ELSIF (UPDATING) THEN
INSERT INTO log_table (datetime,LogType,Username)
VALUES (SYSDATE, 'Update', USER);
END;

——BEFORE触发器

BEFORE触发器指的是在某条SQL语句执行前被激活的触发器,它能完成一些对数据库内容的验证和变更。示例代码如下:

“`sql

CREATE OR REPLACE

TRIGGER Logging_Trigger

BEFORE insert OR update OR delete

ON tbl_name

BEGIN

IF (INSERTING OR UPDATING) THEN

IF :new.value > 100 THEN

RAISE_APPLICATION_ERROR (‘Value cannot be more than 100.’);

END IF;

END IF;

END;


——INSTEAD OF触发器

INSTEAD OF触发器也可以在SQL操作前被激活,它用来替代原来定义视图时候不能直接更新的操作,示例代码如下:
```sql
CREATE OR REPLACE
TRIGGER Logging_Trigger
INSTEAD OF insert OR update OR delete
ON tbl_name
BEGIN
IF (INSERTING) THEN
INSERT INTO log_table (datetime, LogType, Username) VALUES (SYSDATE, 'Insert', USER);
INSERT INTO tbl_name (column1,column2, ...)
VALUES (:new.column1, :new.column2, ...);
ELSIF (UPDATING) THEN
INSERT INTO log_table (datetime, LogType, Username) VALUES (SYSDATE, 'Update', USER);
UPDATE tbl_name
SET column1 = :new.column1,
column2 = : new.column2.
WHERE ID = :new.id;
END IF;
END;

总之,Oracle数据库中有四种不同类型的触发器:表级触发器、行级触发器、BEFORE触发器和INSTEAD OF触发器。它们能极大地提高数据库服务器的运行效率,同时也为数据库操作提供了更多的方便。


数据运维技术 » Oracle数据库中不同类型的触发器(oracle触发器类型)