初探Oracle触发器:4类型各有特色(oracle触发器类型)
Oracle触发器是指与数据库有关的特殊存储过程。触发器是在用户触发以特定方式表示的数据库操作时自动执行的PL/SQL语句集。Oracle提供了四种不同类型的触发器:Row Trigger、Statement Trigger、INSTEAD OF Trigger 和System Trigger,每种类型都有其特殊用途:
1.Row Trigger:Row Trigger(行触发器)定义在行级别上激活,它在每行受影响时被触发。最常见的Row Trigger是Before Trigger和After Trigger,其中Before Trigger会在执行更新操作之前被激发,而After Trigger则会在完成更新操作之后被激发。
例如,以下代码定义了一个名为EMPLOYEE_BEF_TRG的行触发器,它会在执行INSERT、UPDATE或DELETE操作时被激发,并更新表中 employees行中的salary列:
CREATE OR REPLACE TRIGGER EMPLOYEE_BEF_TRG
BEFORE INSERT OR UPDATE OR DELETE ON employees FOR EACH ROW BEGIN
IF (INSERTING OR UPDATING) THEN :NEW.salary := :NEW.salary * 1.1;
END IF; END;
2.Statement Trigger:Statement Trigger(语句触发器)定义在数据库操作级别激活。这样的触发器只会在执行一次数据库操作时触发,而不管它的行数有多少。
例如,以下代码定义了一个名为EMPLOYEE_STM_TRG的语句触发器,它会在执行INSERT、UPDATE或DELETE操作时对表中 employees行中的salary列进行汇总:
CREATE OR REPLACE TRIGGER EMPLOYEE_STM_TRG
AFTER INSERT OR UPDATE OR DELETE ON employees DECLARE
total_salary NUMBER; BEGIN
SELECT SUM(salary) INTO total_salary FROM employees;
UPDATE salaries SET total_salary = total_salary;
END;
3.INSTEAD OF Trigger:INSTEAD OF Trigger(INSTEAD OF触发器)与Row Trigger不同,它只能应用于视图,其主要功能是改变视图中的数据,而不影响基本表。
例如,以下代码定义了一个名为EMPLOYEE_INSTEAD_TRG的INSTEAD OF触发器,它会在对EMPLOYEES_VIEW视图执行INSERT、UPDATE或DELETE操作时,代替执行实际操作:
CREATE OR REPLACE TRIGGER EMPLOYEE_INSTEAD_TRG
INSTEAD OF INSERT OR UPDATE OR DELETE ON EMPLOYEES_VIEW BEGIN
-- Execute the appropriate DML operation IF INSERTING
THEN INSERT INTO employees VALUES ...;
ELSIF UPDATING THEN UPDATE employees
SET ... WHERE ...;
ELSIF DELETING THEN
DELETE FROM employees WHERE ...;
END IF; END;
4.System Trigger:System Trigger(系统触发器)与Row Trigger的最显著区别是它只对对象模式激活,而不管它的表是否有数据。
比如,以下代码定义了一个名为ALTER_TABLE_TRG的系统触发器,它会在更新表时被激发,并保存更新了哪些表:
CREATE OR REPLACE TRIGGER ALTER_TABLE_TRG
AFTER ALTER ON DATABASE BEGIN
-- Capture a trace of which table was updated INSERT INTO audit_table (table_name)
VALUES (dbms_utility.object_name); END;
从以上可以看出,Oracle触发器具有强大的功能,它们可以自动执行一系列数据库操作,从而帮助提高应用程序的效率和可靠性。Oracle的不同类型的触发器各有特色,应用程序开发人员需要根据用户要求定义合适的触发器来满足业务需求。