Oracle触发器

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

1.定义:

 数据库触发器是一个与表相关联、存储PL/SQL语句的“东西”。每当一个特定的数据操作语句(insert、update、delete)在指定的表上发出时,Oracle自动执行触发器中定义的语句序列(当 '触发条件' 成立时,其语句就会 '自动执行'   )

触发器分类:DML触发器、DDL触发器、Databse触发器、instead of 替代触发器(参考2有详解)

作用: 保护数据的安全,监视对数据的各种操作,如'日志记录': 对重要表的 '修改' 进行记录

例如:当员工信息插入后,自动输出“插入成功”的信息。

create or replace trigger empTrigger
after insert on emp 
for each row
declare
 -- 这里存放本地变量
begin
 dbms_output.put_line('插入成功!');
end empTrigger;

触发器和存储过程的区别:
   主要区别:'调用运行方式不同'
   (1) 存储过程: '用户'、'应用程序'、'触发器' 来调用
   (2) 触发器:   '自动执行'(满足 '触发条件'),与其它无关
 

2.语法:

create [or replace] trigger 触发器名(tr_)
   触发时间 {before | after}           -- view 中是 instead of
   触发事件 {insert | update | delete} -- dml、ddl、database
on 触发对象                            -- table、view、schema、database 
   触发频率 {for each row}            -- 行级触发器。默认:语句级触发器,指触发一次
   [follows 其它触发器名]              -- 多个触发器执行的 前后顺序
   [when 触发条件]                     --仅当 '触发条件' 为 True 时,才执行 pl/sql 语句
begin
   pl/sql 语句;
end;

/*
功能:after insert or update or delete 时,执行语句
命名:tr_aiud_student_info
*/
create or replace trigger scott.tr_aiud_student_info
   after insert or update or delete on scott.student_info
   for each row
begin
   case
      when inserting then
         dbms_output.put_line('插入成功!');
      when updating then
         dbms_output.put_line('更新成功!');
      when deleting then
         dbms_output.put_line('删除成功!');
      else
         dbms_output.put_line('无操作!');
   end case;
end;
/
--测试
update scott.student_info t
   set t.sex = '1'
 where t.sno <= 3;

3.一些关键字的使用:

follows:

前提:触发器的执行是否需要指定 '先后顺序'?
1. 若不需要,则无需 follows 关键字
2. 若需要
   (1) before 和 after 能否区分,若能,则无需 follows 关键字
   (2) 最后,才用 follows 区分

--触发器1
create or replace trigger scott.tr_ai_student_info_1
   after insert on scott.student_info
   for each row
begin
   if inserting then
      dbms_output.put_line('插入操作 1');
   end if;
end;
/
--(顺序:先触发器1,再触发器2)
create or replace trigger scott.tr_ai_student_info_2
   after insert on scott.student_info
   for each ROW
   FOLLOWS scott.tr_ai_student_info_1
begin
   if inserting then
      dbms_output.put_line('插入操作 2');
   end if;
end;
/

 when:

1. when:增加触发条件
2. when 中的 new、old 是不带 : 的哦(不是 :new、:old

create or replace trigger scott.tr_ad_student_info
   after delete on scott.student_info
   for each row
   when (old.sno = 1) -- sno = 1 的记录禁止被删除!
begin
   if deleting then
      raise_application_error(-20001, '此条记录禁止删除,sno = ' || :old.sno);
   end if;
end;
/
--测试
delete from scott.student_info t where t.sno = 1;

inserting、updating、deleting:

1. 前提条件:无 
2. 表示含义
   inserting = insert 操作
   updating  = update 操作
   deleting  = delete 操作

 now、old:

1. 前提条件:for each row
2. 表示含义
   :new = 触发后的值
   :old = 触发前的值
3. 说明 
   (1) new、old 均为 '默认值', 常用, 一般无需更改
       referencing new as new old as old       
   (2) 若想要更改,如:new => new_new,old => old_old  
       referencing new as new_new old as old_old
:new , :old值分布情况
insert updata delete
:new ×
:old ×
create or replace trigger scott.tr_au_student_info
   after update on scott.student_info
   for each row
begin
   -- 旧值
   dbms_output.put_line('old.sno = ' || :old.sno);
   dbms_output.put_line('old.name = ' || :old.name);
   dbms_output.put_line('old.sex = ' || :old.sex);
   dbms_output.put_line('------');
   -- 新值
   dbms_output.put_line('new.sno = ' || :new.sno);
   dbms_output.put_line('new.name = ' || :new.name);
   dbms_output.put_line('new.sex = ' || :new.sex);
end;
/
--测试
update scott.student_info t
   set t.name = 'name',
       t.sex = '2'
 where t.sno = 1;

--输出窗口
old.sno = 1
old.name = 张三
old.sex = 女
------
new.sno = 1
new.name = name
new.sex = 2

4、DML触发器基本要点

       (1)触发时机:指定触发器的触发时间。如果指定为BEFORE,则表示在执行DML操作之前触发,以便防止某些错误操作发生或实现某些业务规则;如果指定为AFTER,则表示在执行DML操作之后触发,以便记录该操作或做某些事后处理。

       (2)触发事件:引起触发器被触发的事件,即DML操作(INSERT、UPDATE、DELETE)。既可以是单个触发事件,也可以是多个触发事件的组合(只能使用OR逻辑组合,不能使用AND逻辑组合)。

       (3)条件谓词:当在触发器中包含多个触发事件(INSERT、UPDATE、DELETE)的组合时,为了分别针对不同的事件进行不同的处理,需要使用ORACLE提供的如下条件谓词。
       1)INSERTING:当触发事件是INSERT时,取值为TRUE,否则为FALSE。
       2)UPDATING [(column_1,column_2,…,column_x)]:当触发事件是UPDATE时,如果修改了column_x列,则取值为TRUE,否则为FALSE。其中column_x是可选的。
       3)DELETING:当触发事件是DELETE时,则取值为TRUE,否则为FALSE。
       (4)解发对象:指定触发器是创建在哪个表、视图上。
       (5)触发类型:是语句级还是行级触发器。
       (6)触发条件:由WHEN子句指定一个逻辑表达式,只允许在行级触发器上指定触发条件,指定UPDATING后面的列的列表。

查询触发器

show triggers;

删除触发器

drop trigger 触发器名;

5.触发器实例:

1)禁止在非工作时间插入数据。

create or replace trigger addEmpInfoCheck
 before insert on emp_info 
declare
begin
 if to_char(sysdate, 'day') in ('星期六', '星期日') or
 to_number(to_char(sysdate, 'hh24')) not between 9 and 18 then
 --禁止insert 
 raise_application_error(-20001,'非工作时间禁止插入数据!');
 end if;
end addEmpInfoCheck;

        raise_application_error用于在plsql使用程序中自定义不正确消息。该异常只在数据库端的子程序(流程、函数、包、触发器)中运用,而无法在匿名块和客户端的子程序中运用。语法为raise_application_error(error_number,message[,[truefalse]])。其中error_number用于定义不正确号,该不正确号必须在-20000到-20999之间的负整数;message用于指定不正确消息,并且该消息的长度无法超过2048字节。

2)涨薪后的工资应该大于涨薪前的工资。

create or replace trigger checkSalary
 before update 
 on salary_info 
 for each row
declare
 --没有变量声明的话,declare可以省略
begin 
 if :new.sal < :old.sal then
 raise_application_error(-20002,'涨后的薪水:'|| :new.sal ||'小于涨前的薪水:'||:old.sal);
 end if;
end checkSalary;


(3)创建基于值的触发器

create table xzw_test(info varchar2(256));
 
create or replace trigger addData
 after update
 on xzw_test 
 for each row
declare
begin
 
 if :new.sal > 6000 then 
 insert into xzw_test values(:new.sal ||'-'|| :new.username ||'-'|| :new.job);
 end if;
 
end addData;

参考:

1.Oracle中的触发器(trigger)_象在舞的博客-CSDN博客_oracle触发器触发条件

2.(1条消息) Oracle 触发器详解(trigger)_越努力越幸运再努力的博客-CSDN博客_oracle 触发器 

3.(1条消息) 触发器(Trigger)_yefufeng的博客-CSDN博客_触发器 

4.oracle 触发器管理(以及行级触发器中有两个伪变量 :new 与 :old 的使用方法)(三个谓词inserting、deleting、updating的使用方法)_爱睡觉的小馨的博客-CSDN博客_oracle触发器old和new的用法 文章来源地址https://www.toymoban.com/news/detail-499322.html

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

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

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

相关文章

  • 数据库原理及应用实验报告-实验10-触发器

     实验题目   实验 10触发器    10.1 实验目的 通过实验使学生加深对数据完整性的理解,学会理解、创建和使用触发器。 10.2 实验内容   (用实验9的Teacher表) (1) 为 Teacher 表建立触发器T1,当插入或使更新表中的数据时,保证所操作的纪录的 Tage 值大于0。 (2) 为 Teacher 表建立

    2024年02月05日
    浏览(56)
  • 五、C#与数据库交互(数据存储过程与触发器)

    在C#中与数据库交互时,除了基本的查询和更新操作,还经常需要使用存储过程和触发器。下面我将简要介绍如何在C#中使用存储过程和触发器。 存储过程 存储过程是一组为了完成特定功能的SQL语句集,它可以被存储在数据库中,并可以被调用执行。在C#中,你可以使用 Sql

    2024年01月25日
    浏览(49)
  • 数据库24:触发器的创建和使用(头歌云课)

      任务描述 相关知识 触发器的定义 触发器和存储过程的区别 触发器的优点 触发器的作用 触发器的分类 DML触发器 DDL触发器 登录触发器 触发器的工作原理 inserted表 deleted表 创建触发器 编程要求 测试说明 任务描述 本关任务:通过实验,加深对数据完整性的理解,掌握创建

    2024年02月05日
    浏览(84)
  • Mysql数据库实验报告--实验五 存储过程和触发器

    在这个系列会更新一些最近老师要求写的实验报告~ 大家尽量对着我的文章做一个参考,不要盲目的cv,毕竟这个对于我们以后的工作学习还是十分重要的。 从这个实验开始,就不在cmd命令行里面进行mysql数据库的操作,因为代码长度和代码的复杂性,需使用 MySQL Workbench: 双

    2024年02月09日
    浏览(68)
  • MySQL数据库——MySQL创建触发器(CREATE TRIGGER)

    触发器是与 MySQL 数据表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。 在 MySQL 5.7 中,可以使用 CREATE TRIGGER 语句创建触发器。 语法格式如下: 语法说明如下。 1) 触发器名 触发器

    2024年02月10日
    浏览(50)
  • 数据库系统原理及MySQL应用教程实验八触发器创建与管理

    1.理解触发器的概念与类型。 2.理解触发器的功能及工作原理。 3.掌握创建、更改、删除触发器的方法。 4.掌握利用触发器维护数据完整性的方法。 1.验证性实验:某同学定义产品信息product表,并对其触发器创建与管理 2.设计性试验:某同学定义产品信息product表,并对其

    2024年02月04日
    浏览(51)
  • 达梦数据库(DM7)自动更新时间触发器及时间排序

    达梦数据库(DM7)目前支持的列属性并不多,比如并不支持直接创建自动记录更新时间的列属性,但是这个功能在实际数据库使用中又比较频繁,本文简单记录如何通过时间触发器设置某列自动记录更新时间,即所谓的update_time列。另外,实际使用中可能会有这种排序需求:永远

    2024年02月14日
    浏览(61)
  • 【SQL Server】数据库开发指南(九)详细讲解 MS-SQL 触发器的的创建、修改、应用与适用场景

    本系列博文还在更新中,收录在专栏:#MS-SQL Server 专栏中。 本系列文章列表如下: 【SQL Server】 Linux 运维下对 SQL Server 进行安装、升级、回滚、卸载操作 【SQL Server】数据库开发指南(一)数据库设计的核心概念和基本步骤 【SQL Server】数据库开发指南(二)MSSQL数据库开发对

    2024年02月08日
    浏览(82)
  • Oracle触发器

     数据库触发器是一个与表相关联、存储PL/SQL语句的“东西”。每当一个特定的数据操作语句(insert、update、delete)在指定的表上发出时,Oracle自动执行触发器中定义的语句序列(当 \\\'触发条件\\\' 成立时,其语句就会 \\\'自动执行\\\'   ) 触发器分类:DML触发器、DDL触发器、Databs

    2024年02月10日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包