Oracle数据库中触发器(Database Trigger)可以用来在特定条件下执行前后回调函数,实现对数据库数据执行自动化处理,相比传统SQL语句实现某种效果而言,触发器使得操作更加简洁便捷。在Oracle数据库中,触发器可以根据实际业务需求支持如下几种不同的类型:
### 1.Row Level Trigger
Row Level Trigger可以实现按行触发,即在特定操作在数据库表中的行上被执行时,可以执行程序指定的进一步操作,相比之下效率和灵活性更高。例如,如下示例代码将在数据表Employees上创建一个按行触发的触发器,执行特定的操作:
“`sql
CREATE OR REPLACE TRIGGER salary_audit
BEFORE INSERT OR UPDATE ON Employees
FOR EACH ROW
DECLARE
l_change_value NUMBER;
BEGIN
IF INSERTING THEN
l_change_value := :new.salary;
ELSE
l_change_value := :new.salary – :old.salary;
END IF;
IF l_change_value > 10000 THEN
INSERT INTO audit_salary_changes(user_name, salary_change_amt)
VALUES (USER, l_change_value);
END IF;
END;
### 2.Statement Level Trigger
Statement Level Trigger和Row Level Trigger相比,行触发得实现更加通用,直接针对整个操作执行回调函数,没有行级别的限制。例如,如下示例代码将在数据表Employees上创建一个按语句触发的触发器,执行特定的操作:
```sql
CREATE OR REPLACE TRIGGER employee_salaries
AFTER INSERT OR UPDATE OR DELETE ON Employees
DECLARE
l_change_value NUMBER;
BEGIN
IF UPDATING THEN
SELECT :new.salary - :old.salary INTO l_change_value FROM dual;
ELSIF DELETING THEN
l_change_value := -1 * :old.salary ;
ELSIF INSERTING THEN
l_change_value := :new.salary ;
END IF;
INSERT INTO audit_salary_changes(user_name,salary_change_amt)
VALUES (USER, l_change_value );
END;
### 3.Combined (or Combined DML) Trigger
Combined Trigger结合了Row Level Trigger和Statement Level Trigger的功能,可以根据不同的执行类型在合理的范围内执行回调函数。例如,如下示例代码将在数据表Employees上创建一个综合触发器,执行特定的操作:
“`sql
CREATE OR REPLACE TRIGGER salary_audit
BEFORE INSERT OR UPDATE OR DELETE ON Employees
FOR EACH ROW
DECLARE
l_change_value NUMBER;
BEGIN
IF UPDATING THEN
SELECT :new.salary – :old.salary INTO l_change_value FROM dual;
ELSIF DELETING THEN
l_change_value := -1 * :old.salary ;
ELSIF INSERTING THEN
l_change_value := :new.salary ;
END IF;
IF l_change_value > 10000 THEN
INSERT INTO audit_salary_changes(user_name,salary_change_amt)
VALUES (USER, l_change_value );
END IF;
END;
综上所述,Oracle数据库提供了Row Level Trigger,Statement Level Trigger和Combined Trigger三种触发器类型,可以根据实际业务选择合适的类型,以实现所需的其他操作。相比于普通SQL语句实现,触发器可以节省开发时间,迅速实现功能。