数据库---DML触发器

本文详细介绍了数据库中的DML触发器,包括触发器的概念、触发事件、触发器的用途和类型。触发器用于在INSERT、UPDATE或DELETE操作前后执行特定任务,如审计、维护复杂完整性等。此外,还讲解了行级和语句级触发器的区别以及如何使用:old和:new标识符处理触发器中的数据。最后,讨论了触发器在安全性、审计和数据完整性方面的作用。
摘要由CSDN通过智能技术生成

DML触发器

触发器的基本概念

  • 触发器类似于函数和过程,它们都是具有声明部分、执行部分和异常处理部分的程序实体单元。
  • 触发器必须在数据库中以独立对象的身份存储。
  • 触发器是在事件发生时隐式地运行的,不能接收参数,不能被调用。
  • 运行触发器的方式叫做激发(firing)触发器,触发事件可以是对数据库表的DML(INSERT、UPDATE或DELETE)操作或某种视图的操作

触发事件包括INSERT、UPDATE或DELETE,触发时机有两BEFORE和AFTER,可以在触发事件之前也可以在触发事件之后发生。

触发器用途

  • 通过记录修改内容和修改者来审计表中的信息。
  • 在表内容发生变更时,自动通知其他程序采取相应的处理。
  • 在订阅发布环境下,发布有关各种事件的信息。
  • 维护在表创建阶段通过声明限制无法实现的复杂完整性限制。
  • 触发器主要用于促进引用的完整性
  • 只能在无法使用下列表级别限制时使用它们
    -NOT NULL
    -UNIQUE KEY
    -PRIMARY KEY
    -PRIMARY KEY
    -CHECK

DML触发器触发事件:
- INSERT:当往表或 视图中插入一行时触发
- UPDATE:当在表或 视图中更新一行时触发
- DELETE:当在表或 视图中删除一行时触发

关联触发器
把一个数据库触发器的动作与另一个触发器联系起来,使之触发另一个触发器。

触发器语法

CREATE [OR REPLACE] TRIGGER trigger_name
{
   BEFORE | AFTER | INSTEAD OF} triggering_event
referencing_clause
[WHEN trigger_condition]
[FOR EACH ROW]
trigger_body;

其中:

  • trigger_name是触发器的名称,
  • triggering_event说明了激发触发器的事件(也可能包括特殊的表或视图)
  • trigger_body是触发器的代码。
  • referencing_clause用来引用正在处于修改状态下的行中的数据,
  • 如果在WHEN子句中指定trigger_condition的话,则首先对该条件求值。触发器主体只有在该条件为真值时才运行。

使用触发器约束

  • SELECT语句不能触发触发器;
  • 触发器不能象存储过程或函数那样被显式地调用,只能由事件来触发;
  • 触发器可以调用数据库存储过程、函数和包。
  • 必须将适当的权限授予用户,用户才能CREATE,DROP, ENABLE或DISABLE触发器。触发器可被失效或使之有效。

查看触发器脚本:

select text 
from user_source 
where TYPE='TRIGGER'; 

DML触发器的组成与类型

大体结构

这里写图片描述

DML触发器组成:

这里写图片描述

触发时间:

这里写图片描述

触发顺序:
这里写图片描述

行级触发器和语句级触发器区别:
主要在于影响次数不同:

  • 如果该语句只影响一行,则语句级与行级触发效果相同。
  • 如果该语句影响多行,则行级触发的次数比语句级触发的次数多。
  • 具体应根据进行一个操作时触发器的触发次数,来决定是创建一个语句级还是行级触发器。

    BEFORE 型语句级触发器:

CREATE OR REPLACE TRIGGER secure_emp
BEFORE INSERT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值