深入了解Oracle触发器类型及其使用(oracle触发器类型)
触发器在Oracle中是一种存储过程,它可以在表,游标或其他数据库对象上执行任务,而无需用户提供任何输入。Oracle的触发器主要有行级触发器、表级触发器、数据库级触发器、登录级触发器和系统级触发器。
行级触发器依赖于行的更新,是最常用的触发器的类型之一。行触发器可以在一个表上定义,它会在表上插入,更新或删除行时自动触发。行级触发器是最有用的Oracle触发器类型之一,它可以根据行变更来触发由用户定义的操作,如执行更新,插入,删除等操作。
例如:
CREATE OR REPLACE TRIGGER trg1
AFTER INSERT ON tab_emp
FOR EACH ROW
BEGIN
update tab_emp set salary=salary*1.1 where ename=:new.ename
END;
表级触发器将触发器定义在表上,然后在做任何DML操作时被触发。表级触发器的执行是在变更发生后的第一次才执行,也就是说,变更会被应用到数据库中,然后触发器才会被执行。
例如:
CREATE OR REPLACE TRIGGER trg2
AFTER INSERT OR UPDATE OR DELETE ON tab_emp
FOR EACH STATEMENT
BEGIN
update tab_emp set salary=salary*1.1
END;
数据库级触发器在服务器层面上触发,可以响应系统层面的变量及系统事件。数据库级触发器的功能是监测实例的状态,当实例上的某个条件被满足时,数据库级触发器中定义的行为就会被执行。
例如:
CREATE OR REPLACE TRIGGER trg3
AFTER STARTUP ON DATABASE
DECLARE
v_isaval NUMBER(1);
BEGIN
select count(*) into v_isaval
from tab_emp;
if v_isaval = 0 then
insert into tab_emp (ename,salary)
values (‘Tom’,2000);
end if;
END;
登录级触发器在用户登录角色发生变化,用户登录时触发,当用户登录角色发生变化时,它会被触发,使这个变化在session中生效。用户可以在每次登录之后执行定义好的语句。
例如:
CREATE OR REPLACE TRIGGER trg4
AFTER LOGON ON SCHEMA
DECLARE
v_isaval NUMBER(1);
BEGIN
select count(*) into v_isaval
from tab_emp;
if v_isaval = 0 then
insert into tab_emp (ename,salary)
values (‘Tom’,2000);
end if;
END;
最后,系统级触发器是在数据库架子启动,系统关闭时触发,它可以被用来获取系统变量,或者做一些系统级别的操作,比如持久化系统状态,保存系统性能统计信息,等等。
例如:
CREATE OR REPLACE TRIGGER trg5
BEFORE SHUTDOWN ON DATABASE
BEGIN
update tab_emp set salary=salary*1.1;
END;
总的来说,Oracle的触发器是一种用来提高数据库性能和数据一致性的重要功能,它可以根据行变更来触发由用户定义的行为,因此对于Oracle用户来说,深入了解不同类型的触发器及其使用,是非常必要的。