探索Oracle数据库触发器类型(oracle触发器类型)
Oracle数据库的触发器是用于监视表或视图的特殊存储过程,当特定的事件(列入将新行插入表)发生时触发器便会被调用。这一特性可用于加强数据库的维护以及安全以及准守数据库对业务和应用的约束,而且它只会响应在数据库定义的操作,了解触发器的类型是探索Oracle数据库触发器类型的前提。
根据事件类型,Oracle触发器可以分为四种类型:DML触发器、DDL触发器、INSTEAD OF类型触发器和谓词触发器。
DML触发器是常见的触发器,它会在DML操作(INSERT、UPDATE和DELETE)发生时调用被定义的存储过程,因此可以为表或视图的更改通过限制在特定数据上添加额外的约束。例如,下面这条触发器可以确保将新行插入PT表时,Participant_1和Participant_2的乐谱不能相同:
CREATE OR REPLACE TRIGGER trig_pt
BEFORE INSERT
ON pt
FOR EACH ROW
BEGIN
IF (:NEW.participant_1 = :NEW.participant_2 )
THEN
RAISE_APPLICATION_ERROR (-20000,
‘Participant_1和Participant_2的乐谱不能相同!’);
END IF;
END;
DDL触发器会在DDL操作(CREATE、ALTER、DROP和TRUNCATE)发生时调用,从而可以用它定义复杂的数据库维护任务,将日常的维护任务由人力完成变为自动执行。例如,我们可以创建DDL触发器,监视数据库中表的创建、修改和删除操作:
CREATE OR REPLACE TRIGGER trig_ddl_for_table
AFTER CREATE OR ALTER OR DROP ON DATABASE
BEGIN
INSERT INTO system_log
VALUES (:old.username,
SYSTIMESTAMP,
user,
‘Table ‘||:old.object_name||’ created’);
END;
INSTEAD OF类型触发器会在视图类型DML操作(INSERT、UPDATE和DELETE)发生时被调用。它可以拦截视图上的更改,并将其转换为对基表的对应操作。例如,下面这条INSTEAD OF类型触发器可以拦截对PT_VIEW视图的INSERT操作,将其转换为对PT表的UPDATE操作:
CREATE OR REPLACE TRIGGER trig_pt_view
INSTEAD OF INSERT
ON PT_VIEW
FOR EACH ROW
BEGIN
UPDATE PT
SET participant_1 = :NEW.participant_1,
participant_2 = :NEW.participant_2
WHERE id = :NEW.id;
END;
最后一种触发器类型谓词触发器,它会检查被更改的数据是否满足设定的条件,如果不满足则禁止更改进行。例如,下面这条谓词触发器可以确保将新行插入PT表时,Participant_1和Participant_2职位都是SALESMAN:
CREATE OR REPLACE TRIGGER trig_pt
AFTER INSERT
ON pt
FOR EACH ROW
WHEN (Participant_1!=’SALESMAN’ OR
Participant_2!=’SALESMAN’)
BEGIN
RAISE_APPLICATION_ERROR (-20001,
‘Participant_1和Participant_2职位必须是SALESMAN!’);
END;
以上就是四种Oracle数据库触发器类型的概述,DML、DDL、INSTEAD OF和谓词触发器,每一种触发器类型可以为Oracle数据库的维护和安全添加额外的约束,从而提高数据库的稳定性和安全性。