熟悉Oracle触发器:各类型深度剖析(oracle触发器类型)

Oracle触发器是一种用于在数据库表定义的一系列SQL语句,当发生表中指定的数据变化时,将自动激活所定义的SQL语句,从而实现数据库表发生变化时自动执行指定的动作。Oracle触发器包括四类,分别为行触发器、表触发器、系统触发器和开发者触发器。

##### 一、行触发器

行触发器是指在一条表中某一行记录满足指定的修改条件时(例如:插入、更行、删除),它会触发执行某一块程序逻辑。我们可以使用Oracle的触发器实现表上的插入,更新和删除操作,以及将这三种操作进行串联以达到一定目的。下面将使用一个例子来介绍行触发器。

“`sql

CREATE OR REPLACE TRIGGER update_check

AFTER UPDATE OF Column1, Column2 ON test_table

FOR EACH ROW

BEGIN

IF :NEW.Column1 > :OLD.Column1 THEN

:NEW.Column2 := :NEW.Column2 + string;

END IF;

END;


上面的代码是一个行触发器,它是在test_table上的Column1和Column2记录发生更新操作后触发执行的触发器,判断当前更新的新值大于原值的情况,若大于,将因此更新Column2的值为string。

##### 二、表触发器

表触发器是指在一张表上定义的触发器,当一张表上的记录发生变化时,它将触发执行指定的程序逻辑,和行触发器相比有所不同的是,它不必对指定的字段进行限定,只要表中的任何字段发生更改,该表触发器都会被执行。下面使用例子介绍表触发器。

```sql
CREATE OR REPLACE TRIGGER check_table
AFTER INSERT, UPDATE, DELETE ON test_table
BEGIN
IF DELETING THEN
IF EXISTS (SELECT * FROM test_table
WHERE column1 = :OLD.column1) THEN
DBMS_OUTPUT.PUT_LINE('Old record exists in NEW table');
END IF;
ELSE
IF UPDATING THEN
IF :NEW.column1 > :OLD.column1 THEN
DBMS_OUTPUT.PUT_LINE('New column1 greater than Old column1');
END IF;
END IF;
END IF;
END;

上面的代码是一个表触发器,它在test_table上发生插入,更新,删除操作时被触发执行,如果是删除操作,检查新的表中的column1的值是否在原表中存在;如果是更新操作,检查新的表中column1的值是否大于原表中的值,如果存在则输出相应提示。

##### 三、系统触发器

系统触发器是指以系统权限定义和触发的触发器,主要用于完成在指定的数据库用户和表空间等特定权限上发生变化时的系统活动,比下面的实例更能够说明该系统触发器的功能。

“`sql

CREATE OR REPLACE TRIGGER database_user_create_trigger

AFTER CREATE ON SCHEMA

BEGIN

DBMS_OUTPUT.PUT_LINE(‘A database user is created’);

EXECUTE IMMEDIATE ‘grant connect to :new.username’;

END;


上面的代码是系统触发器,它在schema上检测到创建用户时被触发,当被触发执行时将会在系统中输出指定的提示信息,同时给新创建的用户授予一定的CONNECT权限,以完成对指定用户的授权工作。

##### 四、开发者触发器

开发者触发器也只是一种触发器,它的功能略有不同于上述的触发器,主要定义一些用于开发者开发应用时特殊性的触发器,使用者可以在指定环境中定义和执行该触发器,以完成相关的功能编写工作

数据运维技术 » 熟悉Oracle触发器:各类型深度剖析(oracle触发器类型)