深入理解 Oracle 触发器类型(oracle触发器类型)
Oracle 数据库支持5种不同类型的触发器,它们是行触发器(Row Trigger) ,表触发器(Table Trigger),BEFORE 触发器(BEFORE Trigger),AFTER 触发器(AFTER Trigger),级联触发器(Cascade Trigger) 。在本文中,我将综合介绍这5种不同类型的触发器以及它们在Oracle 数据库中的应用。
### 行触发器(Row Trigger)
行触发器(Row Trigger)是一种在数据库表中每次有数据更新时执行特定SQL语句的触发器,它们是针对一行数据的更新来执行SQL 语句。这类触发器通常用于在数据表中新增数据或更新数据前执行一定的操作。下面的例子可以帮助理解行触发器:
CREATE OR REPLACE TRIGGER tr_stu_row
BEFORE INSERT ON student FOR EACH ROW
BEGIN DBMS_OUTPUT.PUT_LINE('行触发器被触发!');
END tr_stu_row;
INSERT INTO student(sno, sname, sage) VALUES (10, 'Mary', 20);
输出:行触发器被触发!
上面的例子展示了一个在student表上新增数据触发的行触发器,这个触发器在数据被插入到表中前会输出一条信息。触发行为在更新数据表前 和/或 更新数据表后发生,而且针对这一行数据。
### 表触发器(Table Trigger)
表触发器(Table Trigger)是当有数据更新在表中时执行的SQL 语句,它们是针对一张数据表的更新来执行。这种触发器通常使用在有关联的多个表的更新处理。比如:当一个表有新增数据时,另一个表上也需要新增对应的数据。下面的例子可以帮有理解表触发器:
CREATE OR REPLACE TRIGGER tr_stu_table
AFTER INSERT ON studentBEGIN
INSERT INTO stu_info (sno, sclass) VALUES (:new.sno, :new.sclass);END tr_stu_table;
INSERT INTO student(sno, sname, sage, sclass) VALUES (10, 'Mary', 20, 'Class 1');
SELECT * FROM stu_info;
SNO SCLASS 10 Class 1
上面的例子展示了一个在student表上新增数据触发的表触发器,这个触发器在数据被插入到student表中之后会在stu_info表中插入一行对应的数据。
### BEFORE 触发器(BEFORE Trigger)
BEFORE 触发器(BEFORE Trigger)是在数据表更新之前执行SQL语句的一种触发器,它们在进行数据更新操作之前执行,因此可以在数据被更新时进行一些有效性和安全性的检查,以确保更新数据时不会违反数据库约束。下面的例子可以帮助理解BEFORE触发器:
CREATE OR REPLACE TRIGGER tr_stu_before
BEFORE INSERT ON student FOR EACH ROW
BEGIN IF :NEW.sage > 30 THEN
RAISE_APPLICATION_ERROR(-20000, '学生年龄不能超过30岁'); END IF;
END tr_stu_before;
INSERT INTO student(sno, sname, sage) VALUES (2, 'Tom', 50);
错误:ORA-20000:学生年龄不能超过30岁
上面的例子展示了一个在student表上新增数据触发的BEFORE触发器,这个触发器在数据被插入到表中前会检查学生的年龄,如果学生年龄大于30岁,就会抛出一个错误。
### AFTER 触发器(AFTER Trigger)
AFTER 触发器(AFTER Trigger)是在数据表更新之后执行SQL语句的一种触发器,它们在进行数据更新操作之后执行,因此可以在数据被更新完成后对数据进行一些记录,更新,处理等操作。下面的例子可以帮助理解AFTER触发器