Oracle数据库之系统事件触发器、替代触发器、DML触发器(十三)

系统事件触发器

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操作。

替代触发器的主要特点包括:

  1. 定义在视图上:替代触发器只能定义在视图上,而不能定义在表上。
  2. 替代原有操作:替代触发器会替代原本在视图上执行的DML操作,转而执行触发器中定义的语句。
  3. 没有BEFORE和AFTER选项:与DML触发器不同,替代触发器没有BEFORE和AFTER选项。替代触发器总是等同于使用AFTER关键字的行级触发器。
  4. 对基表进行操作:对于复杂的视图,替代触发器可以将对视图的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触发器的作用包括但不限于:

  1. 记录并审核用户对表中数据的修改操作,实现审计功能。
  2. 实现比CHECK约束更加复杂的完整性约束,例如禁止非业务时间的数据操作。
  3. 使用触发器生成序列号的值,为字段提供默认的数据。

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语句。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值