Oracle数据库中不同类型的触发器(oracle触发器类型)
Oracle数据库有四种类型的触发器,它们在不同场景下都有各自独特的用法,可以极大提高数据库的运行效率。
——表级触发器
表级触发器就是针对表的触发器,它对应的表名和列名都存储在DBA_TRIGGERS中。 无论是新插入记录、更新记录或删除记录,表级触发器都会被触发,它可以实现记录日志、实现新数据与原数据之间的比较,还可以限制记录的改变。
下面是一个基本的表级触发器:
“`sql
CREATE OR REPLACE
TRIGGER Logging_Trigger
AFTER insert OR update OR delete
ON tbl_name
BEGIN
IF (INSERTING) THEN
INSERT INTO log_table (datetime, LogType, Username)
VALUES (SYSDATE, ‘Insert’, USER);
ELSIF (UPDATING) THEN
INSERT INTO log_table (datetime,LogType,Username)
VALUES (SYSDATE, ‘Update’, USER);
END IF;
END;
——行级触发器
行级触发器是基于某一行的触发器,它会在某一行记录被读取或改变之后被激活。在更新操作中,行级触发器可以比较旧值和新值,这对复杂更新操作是必不可少的,下面是一个创建行级触发器的例子:```sql
CREATE OR REPLACE TRIGGER Logging_Trigger
AFTER insert OR update OR delete ON tbl_name
FOR EACH ROW BEGIN
IF (INSERTING) THEN INSERT INTO log_table (datetime, LogType, Username)
VALUES (SYSDATE, 'Insert', USER); ELSIF (UPDATING) THEN
INSERT INTO log_table (datetime,LogType,Username) VALUES (SYSDATE, 'Update', USER);
END;
——BEFORE触发器
BEFORE触发器指的是在某条SQL语句执行前被激活的触发器,它能完成一些对数据库内容的验证和变更。示例代码如下:
“`sql
CREATE OR REPLACE
TRIGGER Logging_Trigger
BEFORE insert OR update OR delete
ON tbl_name
BEGIN
IF (INSERTING OR UPDATING) THEN
IF :new.value > 100 THEN
RAISE_APPLICATION_ERROR (‘Value cannot be more than 100.’);
END IF;
END IF;
END;
——INSTEAD OF触发器
INSTEAD OF触发器也可以在SQL操作前被激活,它用来替代原来定义视图时候不能直接更新的操作,示例代码如下:```sql
CREATE OR REPLACE TRIGGER Logging_Trigger
INSTEAD OF insert OR update OR delete ON tbl_name
BEGIN IF (INSERTING) THEN
INSERT INTO log_table (datetime, LogType, Username) VALUES (SYSDATE, 'Insert', USER); INSERT INTO tbl_name (column1,column2, ...)
VALUES (:new.column1, :new.column2, ...); ELSIF (UPDATING) THEN
INSERT INTO log_table (datetime, LogType, Username) VALUES (SYSDATE, 'Update', USER); UPDATE tbl_name
SET column1 = :new.column1, column2 = : new.column2.
WHERE ID = :new.id; END IF;
END;
总之,Oracle数据库中有四种不同类型的触发器:表级触发器、行级触发器、BEFORE触发器和INSTEAD OF触发器。它们能极大地提高数据库服务器的运行效率,同时也为数据库操作提供了更多的方便。