Oracle系列十四:触发器

这篇具有很好参考价值的文章主要介绍了Oracle系列十四:触发器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 基本概念

触发器(trigger)是一种数据库对象,可以看作由事件来触发的特殊存储过程。当一个特定的事件发生时,会自动执行在数据库表上的某些操作,比如当对一个表进行操作(insert,delete, update)时就会激活它执行,使得数据库其他数据发生变化。

触发器常用于加强数据的完整性约束和业务规则等。

  • 数据验证:确保插入、更新或删除操作符合业务规则和完整性约束条件。
  • 数据转换:将插入、更新或删除操作中的数据转换为其他格式或单位。
  • 数据记录:记录插入、更新或删除操作的详细信息,例如时间戳、用户ID等。

Oracle触发器的语法如下:

CREATE OR REPLACE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
[OF column_name]
[ON table_name]
[REFERENCING OLD AS old NEW AS new]
[FOR EACH ROW]
WHEN (condition)
DECLARE
    -- 声明局部变量和游标
BEGIN
    -- 执行触发器操作
END;
/

各关键字含义如下:

  • CREATE OR REPLACE TRIGGER:创建或替换一个触发器。
  • BEFORE | AFTER:指定触发器在插入、更新或删除操作之前(BEFORE)还是之后(AFTER)触发。
  • INSERT | UPDATE | DELETE:指定触发器在哪种操作上触发。
  • [OF column_name]:指定只对某一列进行操作。
  • [ON table_name]:指定触发器所属的表名。
  • [REFERENCING OLD AS old NEW AS new]:指定使用OLD和NEW伪记录引用旧值和新值。
  • [FOR EACH ROW]:指定为每一行执行触发器操作。
  • [WHEN (condition)]:指定触发器执行的条件。
  • DECLARE:声明局部变量和游标。
  • BEGIN:开始执行触发器操作。
  • END;:结束触发器代码块。
  • /:表示触发器定义结束。

Oracle 触发器主要有三种类型:

  • 行级触发器 (Row-level triggers):在每次插入、更新或删除单个记录时触发。
  • 语句级触发器 (Statement-level triggers):在 SQL 语句执行完毕后触发。
  • 系统级触发器 (System-level triggers):在数据库整体运行时触发。

2. 行级触发器

行级触发器是一种基于行的触发器,它会在每次插入、更新或删除单个记录时触发。该触发器通常用于检查记录的值是否符合特定条件,并防止非法操作。

e.g.文章来源地址https://www.toymoban.com/news/detail-466851.html

-- delete时触发
Create Or Replace Trigger del_deptid
After Delete On dept
For Each Row
Begin
Delete From emp Where deptno=:Old.deptno;
End;
-- insert时触发
Create Or Replace Trigger insert_dept 
After Insert On dept
For Each Row 
Begin
Insert Into emp(empno,ename,deptno) Values('8999''bob',:New.deptno);
End;
-- update时触发
Create Or Replace Trigger update_dept 
After Update On dept
For Each Row 
Begin
Update emp Set deptno=:New.deptno Where deptno=:Old.deptno;
End;

注意:update的触发器种使用了 :Old:New 句柄来引用被操作的记录的旧值和新值。:Old.deptno 引用了被更新记录的 id 值,而 :New.deptno 则引用了该记录被更新后的 id 值。通过这种方式可在触发器中获取并记录被修改的记录的详细信息。

-- 利用行级触发器与SEQUENCE生成自增ID
create or replace trigger trg_emp
before insert on 
T_EMP
for each row 
begin 
select seq_EMP_ID.nextval into :new.id from dual; 
End;

3. 语句级触发器

语句级触发器是一种基于 SQL 语句的触发器,它会在 SQL 语句执行完毕后触发。通常用于记录日志,或在多个表之间同步数据。

Create Or Replace Trigger dnl_emp
After Insert Or Delete Or Update On emp
Begin
If Inserting Then
Insert Into mylog Values(User,Sysdate,'I');
Elsif Deleting Then
Insert Into mylog Values(User,Sysdate,'D');
Else
Insert Into mylog Values(User,Sysdate,'U');
End If;
End;

4. 系统级触发器

系统级触发器是一种可以在整个数据库级别上触发的触发器,常用于监控数据库对象,处理用户登录、注销、DDL语句以及其他重要事件,可以让管理员或者DBA更好地掌握和管理数据库。

e.g. 将所有SELECT查询操作进行记录到日志表(audit_log)中。

CREATE OR REPLACE TRIGGER audit_select
AFTER SELECT ON SCOTT.EMP
FOR EACH STATEMENT
BEGIN
  INSERT INTO audit_log
  (username, query_date, table_name, sql_text)
  VALUES
  (USER, SYSDATE, 'EMP', ora_sql_txt);
END;
/

5. 替代触发器

由于ORACLE里,不能直接对由两个以上的表建立的视图进行操作,因此替代触发器用于解决当组成视图的表是两个及两个以上时,无法更新的问题

e.g.

Create Or Replace Trigger tr_v_e_d
Instead Of Insert On v_emp_dept
For Each Row
Begin
Insert Into dept(deptno,dname) Values(:New.deptno,:New.dname);
Insert Into emp(empno,ename,job,deptno) Values(:New.empno,:New.ename,:New.job,:New.deptno);
End;

到了这里,关于Oracle系列十四:触发器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 「FPGA」基本时序电路元件——锁存器和触发器

    FPGA是一种数字电路实现的方式,它是基于小型查找表(16X1)设计的,它的兄弟CPLD是基于高密度复杂组合逻辑设计的。FPGA的一个优点是触发器资源丰富,适合实现复杂的时序设计。本文将从 门级电路 的角度来介绍时序电路的基本结构,锁存器(Latch)和触发器(flip-flop)。

    2024年02月11日
    浏览(52)
  • Flink--7、窗口(窗口的概念、分类、API、分配器、窗口函数)、触发器、移除器

                           星光下的赶路人star的个人主页                        内心的平静始于不再让他人掌控你的感情 在批处理统计中,我们可以等待一批数据都到齐后,统一处理。但是在实时处理统计中,我们是来一

    2024年02月08日
    浏览(47)
  • [SQL系列] 从头开始学PostgreSQL Union Null 别名 触发器

    初级的操作就是CRUD,但是高级的操作也是CRUD,只是语句写的更加复杂,不再是select * from table;这样简单,这次咱们学一些稍微高级点的。下面是上一篇文章。 [SQL系列] 从头开始学PostgreSQL 约束连接_Edward.W的博客-CSDN博客 https://blog.csdn.net/u013379032/article/details/131796564       

    2024年02月16日
    浏览(37)
  • 【MySQL】MySQL触发器入门宝典,助力MySQL初学者打下基本功

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:重温MySQL 在MySQL数据库中,大家都听过触发器。对于MySQL初学者而言,理解触发器的概念和应用是非常重要的。本文主

    2024年02月15日
    浏览(49)
  • [从零开始学习FPGA编程-32]:进阶篇 - 基本时序电路-D触发器(Verilog语言)

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:  目录 第1章 什么是时序电路 1.1 时序电路 1.2 什么是触发器

    2023年04月08日
    浏览(52)
  • 脉冲触发的触发器(主从触发器)

    脉冲触发的动作特点: (1)触发器的翻转分两步动作。 第一步:当CLK以高电平为有效信号时,在CLK= 1期间主触发器接收输入端(S、R或J、K)的信号,被置成相应的状态,而从触发器不动。 第二步: CLK下降沿到来时从触发器按照主触发器的状态翻转,所以Q、Q’端状态的改变发生在

    2024年02月04日
    浏览(53)
  • 【FGPA】Verilog:JK 触发器 | D 触发器 | T 触发器 | D 触发器的实现

    0x00 JK 触发器 JK 触发器是 RS 触发器和 T 触发器的组合,有两个输入端 J 和 K,如果两个输入端都等于 1,则将当前值反转。 行为表

    2024年02月05日
    浏览(49)
  • 数据库触发器简介——修改数据的触发器、删除数据的触发器

    修改数据的触发器 更新数据 思考下面这个触发器会触发几次?几条数据就触发几次。

    2024年02月15日
    浏览(51)
  • 【MySQL触发器】触发器的使用、创建、修改及删除

    一、什么是触发器 二、创建触发器 ①创建一个insert事件触发器 ②创建一个delete 事件触发器  三、触发器包含多条执行语句 四、查看触发器  ①SHOW TRIGGERS语句查看触发器 ②查看系统表triggers实现查看触发器   五、触发器的删除       当我们对一个表进行数据操作时,需

    2023年04月08日
    浏览(57)
  • Verilog设计实现D触发器与JK触发器

    题目:         用Verilog实现以下电路:                 1. 带复位端的正边沿触发的D触发器;                 2.带复位端的正边沿触发的JK触发器。 包括sys_clk,复位信号sys_rst_n,输入信号key_in以及输出信号led_out; 采用行为级描述: testbench仿真代码编写:

    2024年04月28日
    浏览(79)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包