系统事件触发器
Oracle系统事件触发器是在特定系统事件(如DDL语句、启动或关闭数据库等)发生时自动触发的特殊数据库对象。这些触发器允许你执行自定义的PL/SQL代码,以响应这些系统事件。
然而,需要注意的是,Oracle数据库中的触发器通常更常用于DML(数据操纵语言)事件,如INSERT、UPDATE和DELETE,而不是系统事件。对于系统事件,Oracle提供了其他机制,如事件触发器(在Oracle 12c及更高版本中引入)和审计策略。
尽管如此,Oracle可能提供了一种或多种方式来响应系统事件并执行自定义操作。这可能涉及使用Oracle提供的内置函数、过程或触发器,或者通过编写自定义的PL/SQL代码来实现。
关于创建、修改、禁用和启用Oracle触发器的通用方法,以下是一些基本信息:
- 创建触发器:使用CREATE TRIGGER语句来指定触发事件、触发时间、触发操作以及触发对象(表、视图、模式或数据库)。
- 修改触发器:Oracle并没有直接提供修改触发器的命令。通常的做法是先删除现有的触发器,然后重新创建一个新的触发器。
- 禁用和启用触发器:使用ALTER TRIGGER语句来禁用或启用一个触发器。禁用触发器后,即使触发事件发生了,触发器也不会执行。
请注意,具体的语法和选项可能因Oracle数据库的版本和配置而异。因此,在编写或修改触发器时,请参考你正在使用的Oracle数据库版本的官方文档以获取最准确的信息。
替代触发器
Oracle中的替代触发器(INSTEAD OF Trigger)主要用于对视图(View)进行DML(数据操纵语言)操作,如INSERT、UPDATE和DELETE。当试图对不能直接进行DML操作的视图进行修改时,替代触发器可以定义一组操作来替代原本不允许的DML操作。
替代触发器的主要特点包括:
- 定义在视图上:替代触发器只能定义在视图上,而不能定义在表上。
- 替代原有操作:替代触发器会替代原本在视图上执行的DML操作,转而执行触发器中定义的语句。
- 没有BEFORE和AFTER选项:与DML触发器不同,替代触发器没有BEFORE和AFTER选项。替代触发器总是等同于使用AFTER关键字的行级触发器。
- 对基表进行操作:对于复杂的视图,替代触发器可以将对视图的DML操作替换为对组成视图的基表的DML操作。
以下是一个创建替代触发器的示例语法:
CREATE OR REPLACE TRIGGER 触发器名称
INSTEAD OF DELETE|UPDATE|INSERT ON 视图名称
[FOR EACH ROW]
BEGIN
-- 触发器体,包含PL/SQL代码
-- 可以使用:OLD和:NEW伪列(对于UPDATE和INSERT操作)
END;
/
请注意,当创建替代触发器时,视图不能指定WITH CHECK OPTION
选项,因为这会限制对视图的DML操作,而替代触发器则是为了扩展这些操作。
替代触发器在需要对视图进行DML操作但又不能直接进行的情况下非常有用。通过定义替代触发器,你可以控制对视图的数据修改,并确保数据的完整性和一致性。
DML触发器
Oracle DML触发器是指基于DML(数据操纵语言)操作所建立的触发器。DML操作包括SELECT、UPDATE、INSERT和DELETE,这些操作用于对数据库里的数据进行操作。DML触发器的作用包括但不限于:
- 记录并审核用户对表中数据的修改操作,实现审计功能。
- 实现比CHECK约束更加复杂的完整性约束,例如禁止非业务时间的数据操作。
- 使用触发器生成序列号的值,为字段提供默认的数据。
DML触发器可以指定在insert、update或delete操作前、操作时或操作后执行特定的程序段。其中,对于update的操作,实际上是先把数据放入:old再删除,再把新数据放入:new插入到数据库中。由于:old存储的是即将被删除或更改的老数据,所以更新old没有意义。
DML触发器有两种类型:语句触发器和行级触发器。语句触发器无论SQL语句影响的记录是多少行,触发器只触发一次。而行级触发器则是SQL语句影响了多少行记录,触发器就触发多少次。行级触发器使用for each row关键字。
DML触发器的语法大致如下:
CREATE [OR REPLACE] TRIGGER 触发器名
{BEFORE | AFTER} {DELETE | INSERT | UPDATE [OF 列名]}
ON 表名
[FOR EACH ROW [WHEN 条件]]
BEGIN
-- PL/SQL语句块
END;
在这个语法中,{BEFORE | AFTER}指定触发器是在对表的操作发生之前还是之后触发,而[FOR EACH ROW]表示是行级触发器。请注意,在DML触发器中不能使用rollback、commit和DDL语句。