当前位置:首页 > 数据库 > Oracle触发器

Oracle触发器

2022年11月08日 10:47:36数据库8

  Oracle触发器

一.触发器的概念理解。

  数据库触发器是一个与表关联的存储下来的可以自动执行的PL/SQL程序。每当一个特定的数据操作语句在指定的表上发出时,Oracle自动的执行触发器中定义的语句序列。比如,你要实现银行卡数据的插入,插入姓名,数据库就自动的为你插入卡的ID和你账户的ID,这样的功能就可以使用触发器来实现。当然,还有其他的作用。

  一个表可以创建多个触发器。

  一个触发器可以实现多个功能。

  在触发器中可以用IF INSERTING THEN 、IF DELETING THEN 、 IF UPDATING THEN 结构来判断哪种操纵触发了触发器从而来实现对应的触发器功能。(相当于多个触发器总合在一起)

  触发器是一把双刃剑,添加了触发器,在项目开发的过程中,如果遇到了工作交接,这时就必须沟通好,所以触发器的注释一定要写好。

  触发器也可以调用存储过程和存储函数。

  什么情况下可能会用到触发器:

    1.数据确认。

    2.实施复杂的安全性检查。

    3.做审计,跟踪表上所做的数据操作等。

    4.数据的备份和同步。

  查询触发器: select * from user_triggers;

  查询触发器、函数、过程: select * from user_source;  

二.触发器的分类。

  •   语句级触发器

     语句级触发器就是在数据操作前或者操作后执行的一次性的触发器。不管这个操作影响了多少行。

  •       行级触发器

     数据操作影响到的每一条记录都被触发,使用old和new伪记录变量,识别值的状态。

     在行级触发器中伪变量与触发语句的适用。

 

触发语句 :old :new
insert   将要插入的数据
update 更新前该行的值 更新后的值
delete 删除前该行的值  
      通过    :new.属性值  来调用。
  •       列级触发器

     列级触发器仅限于update操作时才会触发。

三.通过实例来创建触发器。

    -----------触发器的语法---------
    CREATE [OR REPLACE] TRIGGER 触发器名称
    {BEFORE|AFTER}                                                                            BEFORE|AFTER:触发触发器数据操作之前执行触发器还是之后执行触发器。
    {DELETE|INSERT|UPDATE[OF列名]}                 DELETE|INSERT|UPDATE[OF列名]:触发触发器数据操作的类型。    
    ON 表名
    [FOR EACH ROW [WHEN(条件)]]                  FOR EACH ROW:行级触发器的关键字。WHEN:给行级触发器加一个条件,满足条件才执行,从而实现行级判断。
    PL/SQL块                  

    ------------实现一个自动增长的ID列的触发器-------------


    --创建一个id,name的person表--
    create table person(
    id number primary key,
    name varchar2(20) not null
    );

    ---因为是自动增长的触发器,所以要先创建一个增长的序列--
    create sequence id_incr
    start with 1001
    increment by 1
    nomaxvalue
    nocycle
    cache 10;

    --------创建好序列之后就可以创建触发器了------------------


    

    --创建一个插入name时触发ID自动插入的触发器--

    create or replace trigger id_tri
    before
    insert on person
    for each row
    declare
    nextid number;
    begin
    select id_incr.nextval into nextid from dual;
    :new.id:=nextid;
    end;

    -----所有准备工作完成就可以插入数据了----
    insert into person(name) values('张三');
    insert into person(name) values('李四');

    select * from person;

    

    -----------实现一个插入数据时判断姓名是否以j开头的触发器-------------
    表还是person表


    create or replace trigger j_name
    before
    insert on person for each row
    begin
    if :new.name like 'j%' then
    raise_application_error(-20000,'不能使用j开头的姓名');
    end if;
    end;

    insert into person(name) values('j云霞');执行这条语句时就会抛出应用程序异常,提示不能使用j开头的姓名。相当于高级的约束。

 

    

    ------------------在触发器中针对某种类型的触发实现针对的功能---------
    表还是person表

    create or replace trigger is_what
    before
    insert or update or delete on person
    begin
    if inserting then
    dbms_output.put_line('这是插入数据时触发的');
    elsif updating then
    dbms_output.put_line('这是更新数据时触发的');
    else
    dbms_output.put_line('这是删除数据时触发的');
    end if;
    end;

    使用下列三条语句体来检测:
    set serveroutput on;
    insert into person(name) values('徐文帅');

    set serveroutput on;
    update person set name='张三' where name='徐文帅';

    set serveroutput on;
    delete person where name='张三';

    注意:is_what触发器是语句级触发器,所以你在增删改检测的时候,不论person有几条语句被牵扯到,它只会put_line一条提示语句。这就是语句级触发器和行级触发器的一个区别。

    

    ------------------------给id创建一个列级触发器--------
    create or replace trigger id_up
    before update of id on person
    begin
    dbms_output.put_line('更新id的触发器被触发了');
    end;

    

    set serveroutput on;
    update person set id=0000 where id='1001'; 这条语句执行的时候就会触发id_up触发器。   

    set serveroutput on;
    update person set name='aaa' where name='bbb';这条语句执行的时候就不会触发id_up触发器。

    

 

作者:博智星
来源链接:https://www.cnblogs.com/bzx888/p/4813175.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/database/68473.html

标签: Oracle
分享给朋友:

“Oracle触发器” 的相关文章

Oracle报错ORA-00904: 标识符无效

执行sql时,oracle 报错ORA-00904: 标识符无效,原因: 列名写错,表中没有那个字段; 查询语句需要加上租户名 比如:表A是 common 租户下的,用工具直接执行 select * from A where id =...

解决:ORA-01034: ORACLE not available问题

1 先看oracle的监听和oracle的服务是否都启动了。启动oracle监听: cmd的命令行窗口下,输入lsnrctl start,回车即启动监听。 2 查看oracle的sid叫什么,比如创建数据库的时候,实例名叫“orcl”,那么先手工设置一下...

Oracle闪回详解

Oracle 9i 开始支持闪回,Oracle10g开始全面支持闪回功能,Oracle11g有所完善,为大家快速的恢复数据,查询历史数据提供了很大的便捷方法。 本文主要对Oracle常用闪回使用做些详细介绍,其中对于不常用的事务和版本闪回,这里就不做介绍 一、Oracle闪...

ORACLE EXECUTE IMMEDIATE 用法

1. 在PL/SQL运行DDL语句 begin execute immediate 'set role all'; end; 2. 给动态语句传值(USING 子句) declare...

win10 oracle

plsql安装后没有连接 可以自己输入database:127.0.0.1:1521/orcl 在plsql中查看表 tools–object browser打开object窗口,左边中间 Object窗口的上面找到对应表空间名 下面找ta...

Oracle 19c 安装步骤

Oracle 19c 安装步骤

第一步:选择【创建并配置单实例数据库】 第二步:选择【服务器类】 第三步:选择【高级安装】 第四步:选择【企业版】 第五步:选择【虚拟账户】 第六步:安装路径会默认最大内存硬盘,也可自己调磁盘位置 第七步:选择【...

安装Oracle 19c 的系统配置要求

安装19c 版本数据库的系统最低配置要求 针对于:Linux x86_64平台 整理自Oracle 19c 官方文档 参数 最低要求 Oracle d...

oracle: 按时间排序,查询第一条数据

有些业务需求,我们需要获取排序后的第一条数据,Oracle需要一个子查询来实现. with t as (select * from t_table order by createdTime desc)...

Oracle物化视图的创建及使用

oracle物化视图 一、oracle物化视图基本概念  物化视图首先需要创建物化视图日志,  oracle依据用户创建的物化视图日志来创建物化视图日志表,  物化视图日志表的名称为mlog$_后面跟基表的名称,...

oracle 用户 入门,Oracle数据库  入门教程(一)

oracle 用户 入门,Oracle数据库 入门教程(一)

前言 我什么都没有,只有,一个不确定的明天,一个不知道的未来 Oracle数据库 Oracle Database,又名Oracle RDBMS,或简称Oracle。是 Oracle数据库环境安装 1、Oracle数据库产...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。