Oracle触发器是一个数据库中的程序,它是定义在表或视图上的,以响应来自其他用户它们执行的DATA DEFINITION(DDL)或DATA MANIPULATION LANGUAGE(DML)操作的指令。
Oracle触发器分为三种:表级触发器,行级触发器和除非触发器。我们来先看看每种类型的触发器,这样就可以精确地灵活地使用它们。
首先是表级触发器:这种触发器通常在表上定义,它响应一个或多个用户从表中执行DML(数据操纵语言)操作的指令。通过在每种类型的DML操作中调用SQL语句,表级触发器可以运行任何类型的程序,包括插入,删除,更新或撤消。例如,下面是一个简单的表触发器,它定义为“在表中VEHICLE改变数据时将新列值插入一个日志表中:
CREATE OR REPLACE TRIGGER vehicle_log_trigger
AFTER UPDATE OR INSERT OR DELETE
ON vehicle
FOR EACH ROW
DECLARE
l_col_name VARCHAR(50);
BEGIN
l_col_name := NVL(:old.column_name, :new.column_name);
INSERT INTO log_table (column_name, log_msg)
VALUES (l_col_name, ‘VEHICLE特性发生变化’);
END;
/
其次是行级触发器:该触发器在根据(表上的)具体行的操作触发,可以应用于DML操作,如更新,插入或删除。它允许用户在特定查询中执行特定操作,它们可以根据表中值的变化来实施条件操作。例如,假设VENDOR表包含每个发布商的名称,价格,类型等,如下所示:
VENDOR_ID | NAME | PRICE | TYPE
———-+———–+——-+—–
1 | Microsoft | 500 | A
2 | IBM | 600 | B
假设我们需要在TYPE字段中改变值时将发布商日志记录到记录日志表中,以便在发布商类型变化时跟踪记录,那么我们可以创建一个行级触发器,如下所示:
CREATE OR REPLACE TRIGGER vendor_type_change_trigger
BEFORE UPDATE OF TYPE ON VENDOR
FOR EACH ROW
BEGIN
IF :old.type :new.type THEN
INSERT INTO log_table (vendor_id, log_msg)
VALUES(:new.vendor_id, ‘vendor类型发生变化’);
END IF;
END;
/
最后是除非触发器:它允许多个表上的更改被绑定到一个触发器中,而且只有更改匹配才能触发触发器。这些触发器可以处理复杂逻辑,也可以处理多列,以及对多个表上的多个行进行跟踪。例如,假设您要跟踪VEHICLE表中的更改,只有当更改的某些固定列(如VEHICLE_MODEL_ID)的值发生变化时,才会触发日志记录,然后写入日志表。在这种情况下,可以使用除非触发器,该触发器通过某些属性来过滤行,如下所示:
CREATE OR REPLACE TRIGGER vehicle_model_change_trigger
AFTER UPDATE OR DELETE
ON VEHICLE
FOR EACH ROW
BEGIN
IF UPDATING or DELETING THEN
IF :old.vehicle_model_id :new.vehicle_model_id THEN
INSERT INTO log_table (vehicle_model_id, log_msg)
VALUES (:new.vehicle_model_id,
‘Vehicle_model_id发生变化’);
END IF;
END IF;
END;
/
Oracle触发器类型灵活掌握是非常重要的,它可以帮助您更轻松地实现针对特定表的数据管理,而不必要每次都从应用程序层手动执行相关操作。因此,理解各种Oracle触发器的工作方式对任何数据库开发人员或系统