oracle触发器 订阅
触发器是在事件发生时隐式地自动运行的PL/SQL程序块,不能接收参数,不能被调用。 展开全文
触发器是在事件发生时隐式地自动运行的PL/SQL程序块,不能接收参数,不能被调用。
信息
语句体
trigger_body;
构    成
触发器名称,触发器的触发条件等
中文名
Oracle触发器
触发器的名称
trigger_name
Oracle触发器概念
触发器是在事件发生时隐式地自动运行的PL/SQL程序块,不能接收参数,不能被调用。
收起全文
精华内容
下载资源
问答
  • oracle触发器
    千次阅读
    2022-04-25 16:19:01
    create or replace trigger t_after_user_copy --create or replace trigger 触发器名称
    after insert or update or delete   ---时间 after/before 事件 insert or update or delete
    on t_user   ---作用的表 on tablename
    FOR EACH ROW --  指定是否对受影响的每行都执行触发器,即行级触发器,如果不使用此子句,则为语句级触发器
    
    BEGIN
        IF INSERTING THEN
            insert into t_user_copy(ID,NAME) values(:NEW.ID,:NEW.NAME);
        ELSIF UPDATING THEN
            UPDATE t_user_copy SET NAME = :NEW.NAME WHERE ID = :OLD.ID;
        ELSIF DELETING THEN
            DELETE FROM t_user_copy WHERE ID = :OLD.ID;
        END IF;
    END;
    
    相关参数注解:
    before和after:指在事件发生之前或之后激活触发器。
    insert、delete和update:指定构成触发器事件的数据操纵类型,update还可以制定列的列表。
    referencing:指定新行(即将更新)和旧行(更新前)的其他名称,默认为NEW和OLD。
    for each row:指定是否对受影响的每行都执行触发器,即行级触发器,如果不使用此子句,则为语句级触发器

    更多相关内容
  • 本文实例讲述了Oracle触发器用法。分享给大家供大家参考,具体如下: 一、触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。因此触发器不需要人为的去调用,也不能调用。...
  • 1.通过行触发器备份表数据  – 创建备份表,首次将数据全部备份  create table emp2_bak as select * from emp2;  – 给备份表增加备份时间和是否被删除字段(1为删除)  alter table emp2_bak add bakTime ...
  • 下面小编就为大家带来一篇Oracle触发器表发生了变化 触发器不能读它的解决方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • Oracle触发器

    2020-12-14 16:37:08
    Oracle触发器 –今天我们根据学到的东西实现一个id列自动增长的触发器 –首先我们需要建个表,主键id,name不为空 create table student( id number primary key, name varchar2(50) not null ) –查一下看看 select...
  • oracle触发器

    2021-05-06 02:45:33
    oracle触发器系统默认用户浏览 4438oracle触发器怎么写?通过编写数据库触发器,在HR数据库上实现下面的业务规则:1.如果某工种的最低工资进行上涨,则相应的员工的工资应自动增长...通过编写数据库触发器,在HR...

    oracle触发器

    b23d28d994245b6b314b144bdf6ae12f.png

    系统默认用户

    浏览 4438

    oracle触发器怎么写?

    通过编写数据库触发器,在HR数据库上实现下面的业务规则:1.如果某工种的最低工资进行上涨,则相应的员工的工资应自动增长...

    通过编写数据库触发器,在HR数据库上实现下面的业务规则:

    1.如果某工种的最低工资进行上涨,则相应的员工的工资应自动增长

    推荐于2019-06-04 21:52:46

    创建触发器,给触发器命名,在哪个表上的增删改进行触发,是否为行级触发

    编写你的逻辑

    编译检查是否有语法错误啥的

    测试,这里的话,就是你某一个工种的最低工资增加,那属于这个工种的员工中原来是最低工资的也要增加,所以你要先把工种中最低工资查出来,根据工种号,查询属于该工种的人有哪些,把这些员工的工资查出来,再修改工种的最低工资,再查员工工资是否也增加了。

    你这表也没有,我门也没有办法给你写一个很详细的。大致思路一般是这样

    26905人赞同了该观点

    909ec6d30222b2f45933291a092d354c.png

    系统默认用户

    浏览 1933

    ORACLE更新触发器的写法

    我想写一个触发器,当BILL表中的status字段为50时,使得ACCOUNT字段更新为Y,请指导,谢谢!status字段的值是由其它值更新为50的...

    我想写一个触发器,当BILL表中的status字段为50时,使得ACCOUNT字段更新为Y,请指导,谢谢!

    status字段的值是由其它值更新为50的

    推荐于2019-06-04 21:52:46

    创建测试表:create table bill

    (id int,

    status int,

    aacount varchar2(1));

    一条测试数据:insert into bill values (1,49,'N');

    commit;

    创建触发器:create or replace trigger t_update_bill

    before insert or update on bill

    for each row

    begin

    if :new.status=50

    then :new.aacount:='Y';

    end if;

    end;

    测试1:

    将id=1那条数据的status改成50,然后检查结果(请自行测试,我这边验证无误了):update bill set status=50 where id=1;

    commit;

    测试2:

    插入一条id=2,status为50,account为N的数据(请自行测试,我这边验证无误了):insert into bill values (2,50,'N');

    commit;

    30014人赞同了该观点

    2ae6a8909489ab756bf3adb94d9cbf79.png

    系统默认用户

    浏览 6660

    Oracle数据库触发器问题

    有Oracle数据库有两个一样表结构的表A,B,现在想写触发器实现当把多条数据同时导入表A时先清空原来表A里面的所有数据,并把新导入的数据同步到表B中去。现在我的触发器是这样写的crea...

    有Oracle数据库有两个一样表结构的表A,B,现在想写触发器实现当把多条数据同时导入表A时先清空原来表A里面的所有数据,并把新导入的数据同步到表B中去。

    现在我的触发器是这样写的

    create or replace trigger A_trigger

    before insert on A for each row

    begin

    insert into

    B(id,num,name)VALUES(:new.id,:new.num,:new.name);

    delete from A;

    end ;

    得出的结果是能把数据成功同步到B表中去,但是A表中只有导入的多数据中最后面的一条数据,这个要怎么改进才行?求教各位大神!谢谢

    现在主要的问题是A导入多条数据时只剩下最后一条数据,这不是我想要的结果,我想要的是导入多条数据时表A里面的数据删除,新导入的全部保留。

    展开

    推荐于2019-06-04 21:52:46

    你怎么界定哪些是新导入的呢?因为你说每次导入都把旧数据删除,你这次导入数据之后,对于下一次导入,你上一次的就是旧数据,所以应该删除也是没错的。

    然后你这样写因为你的delete from a;是写在触发器里面,每导入一次 都会触发一次,所以A表每次都只会保留一条数据。

    我有个建议就是把每天最新一天的数据当做新数据,这样你在触发器删除的时候可以加个日期判断,如果是当天的数据 就不删除,delete from a where date<>'今天日期'

    5193人赞同了该观点

    ff1da576a75e219ec74e53e9a439f832.png

    系统默认用户

    浏览 2006

    oracle触发器无效且未通过验证

    BEGINtmpVar:=0;SELECTironout_seq.NEXTVALINTOtmpVarFROMdual;:NEW.Sequence_id:=tmpVar;EXCEPTIONWHENOTHERSTHEN--Considerloggingtheerrorandthenre-raiseRAISE;insertintoIRONOUT...

    BEGIN

    tmpVar := 0;

    SELECT ironout_seq.NEXTVAL INTO tmpVar FROM dual;

    :NEW.Sequence_id := tmpVar;

    EXCEPTION

    WHEN OTHERS THEN

    -- Consider logging the error and then re-raise

    RAISE;

    insert into IRONOUT@LADLETRACK61 (SEQUENCE_ID,TRAIN_ID,IRONOUT_STARTTIME,IRONOUT_ENDTIME,FLAGE,PORT,WEIGHT,CREATER,TAREWET,GROSSWET,JLCH,NETWET)

    VALUES(:new.SEQUENCE_ID,:new.TRAIN_ID,:new.IRONOUT_STARTTIME,:new.IRONOUT_ENDTIME,:new.FLAGE,:new.PORT,:new.WEIGHT,:new.CREATER,:new.TAREWET,:new.GROSSWET,:new.JLCH,:new.NETWET);

    END ;

    展开

    推荐于2019-06-04 21:52:46

    31506人赞同了该观点

    245139345d09fbc8ed50420492b0f6a5.png

    系统默认用户

    浏览 6094

    关于oracle触发器,根据条件插入并赋值的问题

    比如现有一张表A,里面有id,name,phone,type(type值会有1,2,3),applytype(值会有11,12)和result5个字段。然后我现在需要创建一个触发器实时将数据插入到B表(插入B表的字段除了pho...

    比如现有一张表A,里面有id,name,phone,type(type值会有1,2,3), applytype(值会有11,12)和result5个字段。然后我现在需要创建一个触发器实时将数据插入到 B表(插入B表的字段除了phone以外的字段),只要A表有一行数据就同步到B表,并且A表不会手动修改数据,同步条件是type为2且applytypoe=11时,再插入B表,并且将B表的result字段值设定为"Y"。

    本人对触发器小白,请大神尽量详细的解答,谢谢!

    展开

    推荐于2019-06-04 21:52:46

    6620人赞同了该观点

    4ff4b8aeeadfdd174d3408033743d113.png

    系统默认用户

    浏览 7598

    arcgis有没有类似oracle触发器的工具

    就是当我删除或者增加一个要素时,数据库自己会备份一个相同的要素在另一个要素集里...

    就是当我删除或者增加一个要素时,数据库自己会备份一个相同的要素在另一个要素集里

    推荐于2019-06-04 21:52:46

    oracle中触发器有三种

    1.DML触发器

    ORACLE可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。

    2 .替代触发器

    由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。它就是ORACLE 8专门为进行视图操作的一种处理方法。

    3. 系统触发器

    ORACLE 8i 提供了第三种类型的触发器叫系统触发器。它可以在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。

    16939人赞同了该观点

    343892f57bf1c04c8d7d2fd1a6dbff47.png

    系统默认用户

    浏览 18

    oracle 触发器修改数据问题

    createorreplacetriggermodify_gradebeforeupdateonscforeachrowbeginif:new.grade<:old.gradethenraise_application_error>

    create or replace trigger modify_gradebefore update on scfor each rowbeginif :new.grade<:old.grade thenraise_application_error if>

    展开

    46d25d0544ea2d0f9aa65b5d0b6b7e13.png

    推荐于2019-06-04 21:52:46

    楼主你好:

    每个触发器都会有自己的作用,而你上面触发器写的规则就是,当你对表scfor 中的grade列在更新(update)的时候,如果更新的值小于原先的值的时候,就会触发你自定义的异常错误代码信息。

    所以,当你更新scfor.grade列值,对其进行赋值小的数值的时候,就会出现你上面的自定义错误信息报错,这也就是你这个触发器的作用。

    24278人赞同了该观点

    f3cbbcc075facb024a2fd03f81471dd5.png

    系统默认用户

    浏览 5456

    Oracle 创建触发器报错 pls-00103

    各位大神好,小女因工作需要学习oracle,今天在学到创建触发器时,一直报错,请各位大神帮忙看一下,怎么修改。万分感谢!!!这是我建的account表的代码:CREATETABLEaccount(acct_n...

    各位大神好,小女因工作需要学习oracle,今天在学到创建触发器时,一直报错,请各位大神帮忙看一下,怎么修改。万分感谢!!!这是我建的account表的代码:CREATE TABLE account (acct_num NUMBER(6), amount NUMBER(10,2));这是我建的触发器的要求,:要求:创建一个名为INS_SUM的触发器,触发的条件是向数据表account插入数据之前,输出提示信息。触发器代码:CREATE OR REPLACE TRIGGER INS_SUMBEFORE INSERTON accountBEGINIF INSERT THENDBMS_OUTPUT.PUT_LINE('下面将开始插入数据');END IF;END;执行触发器代码后,报错:错误:PLS-00103: 出现符号 "INSERT"在需要下列之一时: ( - + case mod new not null continue avg count current exists max min prior sql stddev sum variance execute forall merge time timestamp interval date pipe purge json_exis行:5文本:IF INSERT THEN请各位大神看一下,到底哪里错了,怎么修改。谢谢各位大神!!!

    展开

    dfd83be6357702d86ffd433930de3f58.png

    推荐于2019-06-04 21:52:46

    29276人赞同了该观点

    d7e81a38ff1edd690d7adc05bd7adb7c.png

    系统默认用户

    浏览 5411

    Oracle 触发器和存储过程需要单独备份吗?

    推荐于2019-06-04 21:52:46

    看你具体需求了。无论是触发器还是存储过程,都是数据库的一个对象,所以你可以备份在一起,也可以分开。都可以的。

    20347人赞同了该观点

    0ca48223b182dcdd166a35a3eb6ed907.png

    系统默认用户

    浏览 1040

    oracle 怎么在执行查询语句的时候触发触发器?如果不能有办法实现相同的功能吗?

    推荐于2019-06-04 21:52:46

    查询的时候在程序里调用存储过程不是一样的么。

    我们这里都已经禁止使用触发器、存储过程了,出了问题排查太困难,不知道是程序的问题还是DB那边的问题,找的头大。

    所有逻辑放到程序那边。

    16383人赞同了该观点

    展开全文
  • oracle insert数据成功之后调用触发器触发器调用存储过程,存储实时调用java http
  • NULL 博文链接:https://softwarexiang120.iteye.com/blog/773557
  • Oracle触发器trigger详解

    2020-09-09 23:53:30
    主要为大家详细介绍了Oracle触发器trigger,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Oracle 触发器

    2021-05-06 02:46:53
    Oracle触发器是使用者对Oracle数据库的对象做特定的操作时,触发的一段PL/SQL程序代码,叫做触发器。触发的事件包括对表的DML操作,用户的DDL操作以及数据库事件等。一、触发器的作用Oracle触发器可以根据不同的...

    Oracle触发器是使用者对Oracle数据库的对象做特定的操作时,触发的一段PL/SQL程序代码,叫做触发器。触发的事件包括对表的DML操作,用户的DDL操作以及数据库事件等。

    一、触发器的作用

    Oracle触发器可以根据不同的数据库事件进行特定的调用触发器程序块,因此,它可以帮助开发者完成一些PL/SQL存储过程完成不了的问题,比如操作日志的记录、防止一些无效的操作、校验数据的正确性、限制一些对数据库对象的操作、提供数据同步的可行性。但是不推荐在触发器当中写业务逻辑程序,因为这样对后期数据的维护将大大提高成本。

    二、触发器的类型

    触发器按照用户具体的操作事件的类型,可以分为5种触发器。大致如下:

    1、数据操作(DML)触发器:此触发器是定义在Oracle表上的,当对表执行insert、update、delete操作时可以触发该触发器。如果按照对表中行级数据进行触发或语句级触发,又可以分为行级(row)触发器,语句级触发器,按照修改数据的前后触发触发器,又可以分为 after 触发器和before触发器之分。

    2、数据定义操作(DDL)触发器:当对数据库对象进行create、alter、drop操作时,触发触发器进行一些操作记录保存、或者限定操作。

    3、用户和系统事件触发器:该类型的触发器是作用在Oracle数据库系统上,当进行数据库事件时,触发触发器,一般用来记录登录的相关信息。

    4、INSTEAD OF 触发器:此类型的触发器是作用在视图上,当用户对视图进行操作时,触发该触发器把相关的操作转换为对表进行操作。

    5、复合触发器:指的是对数据操作(DML)触发器当中的多种类型触发器进行复合,比如;一个触发器当中包含着after(或before)的行级触发器和after(或before)的语句级触发器,来完成一些更为复杂的操作。

    案例1、创建一个简单的触发器来校验学生基本信息的正确性,代码如下:create or replace trigger tr_xsjbxx_insert

    before insert on stuinfo

    for each row

    begin

    --对性别的数据进行校验

    if :new.SEX not in ('1', '2') then

    raise_application_error(-20001, '性别错误,请正确选择。');

    end if;

    end;

    insert into STUINFO

    (STUID,

    STUNAME,

    SEX,

    AGE,

    CLASSNO,

    STUADDRESS,

    GRADE,

    ENROLDATE,

    IDNUMBER)

    values

    ('SC201801006',

    '张三丰',

    '3',

    26,

    'C201801',

    '福建省厦门市XXX号',

    '2018',

    to_date('01-09-2018', 'dd-mm-yyyy'),

    '3503021992XXXXXXXX');

    结果如下:

    d2794052f52c638f4c9a9b8ca2ed320e.png

    代码解析:这是一个DML触发器,是对学生信息表(stuinfo)学生数据插入(insert)之前做的一个性别的校验,当性别的值不符合规范的时候报数据错误。

    三、DML类型触发器

    Oracle DML类型触发器是Oracle开发过程当中最经常用到,也是最常见的触发器,主要是对DML操作,如:insert、delete、update操作事件进行触发。

    DML类型触发器安装触发的事件的前后和数据触发的类型可以分为四类:前置行级触发器、后置行级触发器、前置语句级触发器、后置语句级触发器。

    创建DML类型触发器的语法结构如下:create [ or replace] trigger tr_name(触发器名)

    before|after

    delete| insert | update [of column1,column2...]

    [or delete |insert| update of colum1,colum2...]

    on table_name(表名)

    [for each row]

    [follows tr_name1(其它触发器名)]

    [when 条件]

    declare

    --声明部分

    begin

    --触发器内容部分

    end;

    语法解析:

    1、or replace :存在同名的触发器就覆盖保存。

    2、trigger:创建触发器的关键词。

    3、before|after表示是选择的触发器是数据改变之前触发、数据改变之后触发。

    4、delete| insert | update:表示触发器触发的事件类型是删除、插入或更新。

    5、for each row: 表示行级触发器、不填就是语句级触发器

    6、follows :表示触发器的顺序是跟在哪个之后。

    7、when 表示触发器语句触发的条件

    行级触发器

    行级触发器一般用来做数据的校验或者记录数据的操作日志,下面是一个行级触发器的例子:

    案例1、利用行级触发器记录更新学生信息表时的操作记录,代码如下:create or replace trigger tr_stuinfo_update

    before update on stuinfo

    for each row

    begin

    --当学生班号发生变化时,

    if :new.CLASSNO <> :old.CLASSNO then

    --插入操作日志表

    insert into oplog

    (LOGID, --日志ID

    TABLENAME, --表名

    COLNAME, --列名

    NEWDATA, --改变后数据

    OLDDATA, --改变前数据

    OPDATE, --操作时间

    OPERATOR) --操作人

    values

    (pk_oplog_id.nextval,

    'stuinfo',

    'classno',

    :new.classno,

    :old.classno,

    sysdate,

    'jsq');

    end if;

    end;

    代码解析:

    1、这是一个学生信息表(stuinfo)update的前置行级触发器,当修改学生的班号时,会把修改的记录的操作信息记录在日志表(oplog)中。

    2、行级触发器通过:new和:old来访问变化之后的数据和变化之前的数据,update类型触发器,新旧数据都可以访问,delete类型触发器,只能访问:old值,insert类型触发器只能访问:new值。

    建立好触发器,我们更改一条数据看下效果,代码如下:update stuinfo t set t.classno = 'C201802' where t.stuid = 'SC201801006';

    select * from oplog;

    结果如下:

    8a8d3d5930bc1026e164d1ca21349de4.png

    语句级触发器

    语句级触发器一般是用来做特定限制语句操作的作用,比如在某一段时间内禁止某一部分语句操作,下面是一个语句级触发器的案例:

    案例2、比如今天是12月15号,我就禁止每月的15号禁止操作学生信息表(stuinfo)的插入和删除或修改操作。代码如下:create or replace trigger tr_stuinfo_sql

    before update or insert or delete on stuinfo

    begin

    --每月15号禁止操作学生信息表

    if to_char(sysdate,'dd')='15' then

    raise_application_error(-20001,'每月15号不能对学生信息表进行正删改操作!');

    end if;

    end;

    代码解析:

    1、DML语句触发器就是行级触发器省略掉for each row的写法。

    2、raise_application_error是主动给客户端抛出-20001代码错误的信息。

    建立好触发器,我们更新一条数据看下效果,结果如下:

    aca5438527d095981fc7b4f59d40bb92.png

    总结:

    同一个对象上可以有多个DML触发器,但是触发器触发的时候有先后顺序,比如before型触发器比after型触发器先触发,在此基础上行级触发器,比语句级触发器更早触发。同类型的触发器的先后顺序就按follows关键词+触发器名进行排序。

    四、DDL类型触发器

    Oracle DDL类型触发器主要是对于Oracle数据库的DDL操作触发的触发器,主要包括create、drop、alter等DDL事件,经常利用DDL类型触发器记录DDL操作记录或者限定对某个对象进行DDL操作。也可以根据对应DDL操作做对应的操作。

    Oracle DDL类型触发器的语法结构

    DDL类型触发器的编写语法如下:create [ or replace] trigger tr_name(触发器名)

    before|after

    ddl_event|database_event

    on SCHEMA(数据库对象)|DATABASE(数据库)

    [follows tr_name1(其它触发器名)]

    [when 条件]

    declare

    --声明部分

    begin

    --触发器内容部分

    end;

    语法解析:

    1、or replace :存在同名的触发器就覆盖保存。

    2、trigger:创建触发器的关键词。

    3、before|after表示是选择的触发器是在进行DDL操作之前触发还是之后触发。

    4、ddl_event:表示的DDL事件,有create(创建)、alter(修改)、drop(删除)等常用DDL操作。

    5、SCHEMA|DATABASE:表示触发器是作用在数据库对象上还是数据库上。

    6、follows :表示触发器的顺序是跟在哪个之后。

    7、when 表示触发器触发的附带条件,比如时间。

    下面通过一个案例来解析Oracle DDL类型触发器的写法:

    案例1、利用Oracle DDL类型触发器给学生信息表(stuinfo)做一个禁止删除、修改表结构的触发器,代码如下:create or replace trigger tr_stuinfo_ddl

    before alter or drop  on schema

    begin

    --禁止对学生信息表进行删除和修改操作

    if dictionary_obj_name = 'STUINFO' THEN

    --修改表结构

    if sysevent = 'ALTER' then

    --抛出错误

    raise_application_error(-20001,

    '禁止学生信息表stuinfo进行alter操作!');

    end if;

    --删除表结构

    if sysevent = 'DROP' then

    --抛出错误

    raise_application_error(-20001,

    '禁止学生信息表stuinfo进行drop操作!');

    end if;

    END IF;

    end;

    执行完案例1触发器,我们通过修改学生信息表(stuinfo)测试一下触发器的效果,代码如下:--修改表结构

    alter table STUINFO modify stuaddress VARCHAR2(200);

    --删除表结构

    drop table stuinfo;

    结果如下:

    44b23dd426385ddf7e51783accfef89c.png

    案例2、利用DDL类型触发器的创建一个数据库级别的触发器,记录用户登录数据库的记录信息。再次我们需要设计一个登录记录表,来保存用户登录信息,代码如下:-- Create table

    create table LOGIN_LOG

    (

    logid     VARCHAR2(20),

    loginuser VARCHAR2(100),

    logindate DATE

    )

    tablespace USERS

    pctfree 10

    initrans 1

    maxtrans 255

    storage

    (

    initial 64K

    minextents 1

    maxextents unlimited

    );

    -- Add comments to the table

    comment on table LOGIN_LOG

    is '登录日志表';

    -- Add comments to the columns

    comment on column LOGIN_LOG.logid

    is '日志id';

    comment on column LOGIN_LOG.loginuser

    is '登录用户名';

    comment on column LOGIN_LOG.logindate

    is '登入时间';

    建立DDL类型触发器(数据库级):create or replace trigger tr_stuinfo_ddl_login

    after  logon--数据库系统事件

    on database

    begin

    --插入登录日志表

    insert into login_log

    (LOGID, LOGINUSER, LOGINDATE)

    values

    (pk_oplog_id.nextval,sys.login_user, sysdate);

    end;

    建立好案例2触发器,我们通过登录数据库,然后查看下登录日志表,查看一下效果,结果如下:

    dd76cd46a7b589ccbafac12c5dea7178.png

    转载本站内容时,请务必注明来自W3xue,违者必究。

    展开全文
  • Oracle触发器实例代码

    2020-09-09 17:48:10
    Oracle触发器,用于选单后修改选单的表的触发动作。接下来通过本文给大家分享Oracle触发器实例代码,需要的的朋友参考下吧
  • 出库入库这样的功能在许多系统中都有。可能叫法不一。有的可能是数量,有的可能是金额。我这里以金额为例实现出库入库也有许多方法,一种是用语言实现,一种是用触发器实现。它们各有千秋。
  • oracle 异常及触发器;异常处理;e_toomanystudents的作用域和本块的其他变量相同 预定义型异常情态 预定义型异常情态可以直接使用没有必要声明 Invalid_cursor:当执行非法的游标操作时会引发这个错误如试图关闭已关闭...
  • oracle触发器使用

    2021-05-04 06:29:30
    创建在表上,由DML事件引发2.instead of触发器: 创建在视图上并且只能在行级上触发,用于替代insert,delete等操作(由于oracle中不能直接对有两个以上的表建立的视图进行DML操作,所以给出替代触发器,它是专门为...

    2)触发器分类:

    1.DML触发器: 创建在表上,由DML事件引发

    2.instead of触发器: 创建在视图上并且只能在行级上触发,用于替代insert,delete等操作(由于oracle中不能直接对有两个以上的表建立的视图进行DML操作,所以给出替代触发器,它是专门为进行视图操作的一种处理方法)

    3.DDL触发器: 触发事件时数据库对象的创建和修改

    4.数据库事件触发器:定义在数据库或者模式上,由数据库事件触发

    3)组成:

    1.触发事件:引发触发器被触发的事件 DML语句(INSERT, UPDATE, DELETE语句对表或视图执行数据处理操作)、DDL语句(如CREATE、ALTER、DROP语句在数据库中创建、修改、删除模式对象)、数据库系统事件(如系统启动或退出、异常错误)、用户事件(如登录或退出数据库)。

    2.触发时间:即该触发器是在触发事件发生之前(BEFORE)还是之后(AFTER)触发

    3.触发操作:触发器触发后要完成的事情

    4.触发对象:包括表、视图、模式、数据库。只有在这些对象上发生了符合触发条件的触发事件,触发器才会执行触发操作。

    5.触发条件:由WHEN子句指定一个逻辑表达式。只有当该表达式的值为TRUE时,遇到触发事件才会自动执行触发操作。

    6.触发频率:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。(比如delete多条数据时,行级触发器可能会执行多次,语句级触发器只会触发一次)

    2.语法

    1)说明

    不同类型的触发器例如DML触发器,Instead of触发器,系统触发器语法格式区别较大

    2)一般语法

    CREATE [OR REPLACE] TIGGER触发器名 触发时间 触发事件

    ON表名/视图名

    [FOR EACH ROW]  //加上FOR EACH ROW 即为行级触发器,不加时为语句级触发器

    BEGIN

    pl/sql语句

    END

    create [or replace] trigger [schema.]trigger_name

    {before | after | instead of}

    {delete [or insert][or update [of column,...n]]}

    on [schema.]table_name | view_name

    [for each row [when(condition)]]

    sql_statement[,...n]

    例如:

    CREATE OR REPLACE TRIGGER   trigger_name

    < before | after | instead of > < insert | update | delete>  ON table_name

    [FOR EACH ROW]

    WHEN (condition)

    DECLARE

    BEGIN

    END;

    3)instead of 触发器语法

    语法:

    CREATE [OR REPLACE] TRIGGER trigger_name

    INSTEAD OF

    {INSERT|DELETE|UPDATE [OF COLUMN...]}

    [OR {INSERT| DELETE| UPDATE [OF COLUMN...]}]

    ON VIEW_NAME

    [REFFERENCING{OLD [AS] OLD | NEW [AS] NEW| PARENT AS PARENT}]   // 可以指定相关名称,当前的默认相关名称为OLD和NEW,

    [FOR EACH ROW]                     //instead of 触发器只能在行级上触发,因为没有必要指定

    [WHEN CONDITION]

    DECLARE

    BEGIN

    END;

    说明:INSTEAD OF 用于对视图的DML触发,由于视图可能有多个表进行联结而成,因而并非所有的联结均可更新,运用 INSTEAD OF 触发器可完成相应的操作。

    3.实例

    创建测试表格:

    CREATE TABLE "HNZC"."TRIGGERTEST"

    (

    "ID"    VARCHAR2(20 BYTE),

    "NAME"  VARCHAR2(20 BYTE),

    "SCORE" NUMBER

    );

    create table tab1 select * from triggertest;

    1)DML触发器/行级触发器

    触发器如下:

    CREATE OR REPLACE TRIGGER TRIGGER1

    AFTER INSERT ON TRIGGERTEST    //插入后触发

    FOR EACH ROW                   //行级触发器

    BEGIN

    INSERT INTO tab1(ID,NAME) VALUES(‘22‘,‘33‘);

    END;

    执行语句:

    insert into triggertest (id) values (‘aabbcc‘);

    语句执行结束,表tab1中新增加一条数据

    2)限制对表的修改(例如非工作时间不能修改某些表)

    触发器如下:

    CREATE OR REPLACE TRIGGER TRIGGER1

    AFTER INSERT ON TRIGGERTEST

    FOR EACH ROW

    BEGIN

    IF(TO_CHAR(SYSDATE,‘DAY‘) IN (‘星期三‘,‘星期天‘))

    THEN RAISE_APPLICATION_ERROR(-20001,‘不是上班时间,不能修改表格triggertest‘);

    END IF;

    END;

    执行语句:

    insert into triggertest (id) values (‘aabbcc‘);

    今天周三因而输出结果为:

    在行 1 上开始执行命令时出错:

    insert into triggertest (id) values (‘aabbcc‘)

    错误报告:

    SQL 错误: ORA-20001: 不是上班时间,不能修改表格triggertest

    ORA-06512: 在 "HNZC.TRIGGER1", line 3

    ORA-04088: 触发器 ‘HNZC.TRIGGER1‘ 执行过程中出错

    通常对表的修改限制如下(即周一至周五9——18点能修改表格)

    CREATE OR REPLACE TRIGGER TRIGGER1

    BEFORE INSERT OR DELETE OR UPDATE ON TRIGGERTEST

    FOR EACH ROW

    BEGIN

    IF(TO_CHAR(SYSDATE,‘DAY‘) IN (‘星期六‘,‘星期天‘))

    OR(TO_CHAR(SYSDATE,‘HH24:MI‘) NOT BETWEEN ‘9:00‘ AND ‘18:00‘)

    THEN RAISE_APPLICATION_ERROR(-20001,‘不是上班时间,不能修改表格triggertest‘);

    END IF;

    END;

    3)增加限制条件(如不能更改某个员工的记录)

    触发器如下:(如下实现月儿的分数只能增加)

    CREATE OR REPLACE TRIGGER TRIGGER1

    BEFORE INSERT OR DELETE OR UPDATE ON TRIGGERTEST

    FOR EACH ROW

    WHEN(OLD.NAME=‘月儿‘)

    BEGIN

    CASE WHEN UPDATING(‘SCORE‘) THEN

    IF:NEW.SCORE<:old.score>

    THEN RAISE_APPLICATION_ERROR(-20001,‘月儿的分数只能提升不能下降‘);

    END IF;

    END CASE;

    END;

    当前月儿的分数为20

    当修改为10时出错

    UPDATE "HNZC"."TRIGGERTEST" SET SCORE = ‘10‘ WHERE ROWID = ‘AAAdEzAAPAAAAH+AAB‘ AND ORA_ROWSCN = ‘47685303‘

    ORA-20001: 月儿的分数只能提升不能下降

    ORA-06512: 在 "HNZC.TRIGGER1", line 4

    ORA-04088: 触发器 ‘HNZC.TRIGGER1‘ 执行过程中出错

    当修改为30时成功

    UPDATE "HNZC"."TRIGGERTEST" SET SCORE = ‘30‘ WHERE ROWID = ‘AAAdEzAAPAAAAH+AAB‘ AND ORA_ROWSCN = ‘47685303‘

    提交成功

    4)在触发器中调用存储过程

    触发器为:

    CREATE OR REPLACE TRIGGER TRIGGER1

    BEFORE INSERT OR DELETE OR UPDATE ON TRIGGERTEST

    FOR EACH ROW

    BEGIN

    TESTPRO1();

    END;

    存储过程为:

    create or replace

    PROCEDURE TESTPRO1 AS

    BEGIN

    insert into tab1(id,name,score) VALUES(‘AAA‘,‘BBB‘,200);

    END TESTPRO1;

    执行完毕后tab1中增加一条数据

    5)级联更新

    触发器如下(triggertest表中name修改时同时修改tab1中的name)

    create or replace

    PROCEDURE TESTPRO1 AS

    BEGIN

    insert into tab1(id,name,score) VALUES(‘AAA‘,‘BBB‘,200);

    END TESTPRO1;

    执行语句:

    update  triggertest set name= ‘水儿‘ where name=‘月儿‘;

    结果:tab1中name为月儿的也更改为水儿

    6)instead of触发器

    TABLE STUDENT表格数据如下

    720f1c0833ee5e1ddeffdd02af0eee12.png

    创建视图student_view

    CREATE OR REPLACE VIEW STUDNET_VIEW

    AS SELECT CLASSID,AVG(SCORE) AVERAGE_SCORE FROM STUDENT

    GROUP BY CLASSID;

    视图数据如下:

    ce0f5055642fd1b38c845eb7b2d31814.png

    对视图student_view 执行如下操作:

    DELETE FROM STUDNET_VIEW WHERE CLASSID=‘111‘;

    执行结果:

    错误报告:

    SQL 错误: ORA-01732: 此视图的数据操纵操作非法

    01732. 00000 -  "data manipulation operation not legal on this view"

    解决方法:创建INSTEAD OF 视图

    CREATE OR REPLACE TRIGGER STUDENT_VIEW_DELETE

    INSTEAD OF DELETE ON STUDNET_VIEW

    FOR EACH ROW

    BEGIN

    DELETE FROM STUDENT WHERE CLASSID=:OLD.CLASSID;

    END STUDENT_VIEW_DELETE;

    执行删除语句

    DELETE FROM STUDNET_VIEW WHERE CLASSID=‘111‘;

    执行结果:删除成功

    1 行已删除。

    4.注意事项

    1) 在触发器的执行部分只能用DML语句(SELECT、INSERT、UPDATE、DELETE),不能使用DDL语句(CREATE、ALTER、DROP)

    2) 触发器中不能使用commit语句,触发器的操作与触发事件(INSERT,UPDATE,DELETE)一起进行COMMIT和ROLLBACK;

    3)  一个表上的触发器越多,对于表的DML操作性能影响越大

    4) 触发器最大为32K

    oracle触发器使用

    标签:scn   values   系统触发器   级联   工作   分享   llb   多次   ror

    本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉 本文系统来源:http://www.cnblogs.com/sunziying/p/7190278.html

    展开全文
  • Oracle 触发器语法及实例Oracle触发器语法(一)一 Oracle触发器语法触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不...
  • Oracle触发器 概述 本篇博文中主要探讨以下内容: 为什么要使用触发器? DML触发器(insert、update、delete等操作之前或者之后触发的事件) 系统事件触发器(系统事件和用户事件) 替代触发器(instead of) 设置触发器...
  • Oracle触发器的使用

    千次阅读 2021-05-04 06:29:42
    Oracle触发器的使用触发器是指存放在数据库中,并被隐藏执行的存储过程。在Oracle8i之前,只允许基于表或视图的DML操作(insert,update,delete)建立触发器,在oracle8i之后,不仅支持DML操作,也允许基于系统事件...
  • ORACLE触发器类型

    2021-05-05 03:32:18
    ORACLE触发器类型1.DML触发器由对表的INSERT,DELETE,UPDATE激发CREATE OR REPLACE TRIGGER trigger_nameAFTER -- TIMING :BEFORE OR AFTERDELETE OR INSERT OR UPDATE ON table_name -- STATEM...
  • oracle触发器加条件判断 oracle触发器加条件判断,如果某个字段,isnode=0,那么不执行下面的方法,数据如下: create or replace trigger tr_basestation_insert_emp ... mysql left join中on后加条件判断和where中加...
  • oracle10g数据库触发器加载java文件访问webservice,里面包含详细的说明文档,完整的测试代码以及所需要的jar包等。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 73,499
精华内容 29,399
关键字:

oracle触发器

友情链接: S3C2440.rar