dml触发器 oracle_mysql dml语句触发器 - CSDN
精华内容
参与话题
  • oracle触发器,commit 的问题

    万次阅读 2011-07-05 22:47:10
    触发器无需commit也不能写commit触发器和触发它的DML是同一个事务DML提交了,触发器的操作也提交了,要不就一起回滚了当然,如果你一定要在触发器里写COMMIT那就用自治事务相当于一个事务里的子事务正常情况下,...

    触发器无需commit
    也不能写commit
    触发器和触发它的DML是同一个事务
    DML提交了,触发器的操作也提交了,要不就一起回滚了

    当然,如果你一定要在触发器里写COMMIT
    那就用自治事务
    相当于一个事务里的子事务

    正常情况下,Oracle规定在触发器中不能运行 ddl语句和commit,rollback语句。

    解决办法有两种:

    1.在可以在触发器中加入:pragma autonomous_transaction; 表示自由事务处理。
    如:

    CREATE OR REPLACE TRIGGER T_create BEFORE insert ON T_RCatalogue
    for each row
    DECLARE
    pragma autonomous_transaction;

    NRDSId varchar(500):='';

    begin

    2.可以另外写一个方法,把dll语句传递到这个方法中去执行。

    注释:
       ddl语句:DDL语句用语定义和管理数据库中的对象,如Create,Alter,Drop,truncate等;DDL操作是隐性提交的!操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger
       DML(Data Manipulation Language)数据操纵语言命令使用户能够查询数据库以及操作已有数据库中的数据。如insert,delete,update,select等都是DML

    展开全文
  • 行级触发器DML语句影响的每个行执行一次,触发器表(如:您的定义触发器的emp表)变化一个记录(I、D、U)就执行一次。 语句级触发器对每个DML语句执行一次,完成一次“事务”触发一次。 如果在TABLE表中插入的...
    1. 行级触发器对DML语句影响的每个行执行一次,触发器表(如:您的定义触发器的emp表)变化一个记录(I、D、U)就执行一次。
      语句级触发器对每个DML语句执行一次,完成一次“事务”触发一次。 如果在TABLE表中插入的数据为500行,那么这个表上的语句级触发器只执行一次,而行级的触发器就要执行500次了。

    2. 语句级别触发器
      是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。能够与INSERT、UPDATE、DELETE或者组合上进行关联。 但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次。比如,无论update多少行,也只会调用一次update语句触发器。
      例子:需要对在表上进行DML操作的用户进行安全检查,看是否具有合适的特权。
    create trigger tri_study 
    
      before insert or update or delete on zrp 
    
    begin 
    
      if user not in (‘DONNY’) then 
    
      Raise_application_error(-20001, ‘You can not access to modify this table.’); 
    
      end if; 
    
    end; 
    

    3、 行触发器

    是指为受到影响的各个行激活的触发器,定义与语句触发器类似,有以下两个例外:

    1、 定义语句中包含FOR EACH ROW子句

    2、 在BEFORE……FOR EACH ROW触发器中,用户可以引用受到影响的行值。

    定义:

    create trigger tri_study 
    
      before insert or update 
    
      of department_id 
    
      on employees_copy 
    
      referencing old as old_value 
    
      new as new_value 
    
      for each row 
      www.2cto.com  
      when (new_value.department_id<>80 ) 
    
    begin 
    
      :new_value.commission_pct :=0; 
    
    end; 
    展开全文
  • Oracle开发之触发器调用存储过程

    千次阅读 2012-11-29 09:34:11
    大家都知道触发器是无需commit的,而且也不能写commit;触发器和触发它的DML是同一个事务 DML提交了,触发器的操作也提交了...当然,如果你一定要在触发器里写COMMIT,那也是可以的,可以用Oracle中的自治事务来处理

    转载原文地址:http://blog.csdn.net/zftang/article/details/6586996
    大家都知道触发器是无需commit的,而且也不能写commit;触发器和触发它的DML是同一个事务
    DML提交了,触发器的操作也提交了,所以无需Commit;否则就会造成错误信息。
    当然,如果你一定要在触发器里写COMMIT,那也是可以的,可以用Oracle中的自治事务来处理,自治事务就相当于一个事务里的子事务。
    在正常情况下,Oracle规定在触发器中不能运行 DDL(即Create/Alter/Drop)语句和Commit/Rollback语句的,因为DDL操作是隐性提交的,在触发器不允许有Commit,如在触发器中加入DDL语句,这种隐性提交就会导致错误信息;但有时特殊情况下需要在触发器中使用DDL语句,这时怎么办。
    可以采取以下的解决办法:

    create or replace trigger trigger_table1 
      after update or insert on  martin.table1 
      for each row
    declare
      PRAGMA AUTONOMOUS_TRANSACTION;--自制事务处理
    begin
      --调用拆分存储过程,触发器每次只拆分一条
      mc_print(
    	 :NEW.id,:NEW.name
    			   );
       commit;
    end trigger_table1 ;



     

    展开全文
  • oracle 列级别的触发器

    千次阅读 2009-02-03 15:51:00
    oracle 触发器可分为DML触发器,instead of 触发器,系统触发器三种。 其中只有DML的update 才支持列级别的触发器。、格式如下:create or replace trigger T_namebefore update of column1,colum2 on tablefor ...

    oracle 触发器可分为DML触发器,instead of 触发器,系统触发器三种。

      其中只有DML的update 才支持列级别的触发器。、

    格式如下:

    create or replace trigger T_name

    before update of column1,colum2 on table

    for each row

    begin

    end T_name;

     

    instead of 触发器都是行级别的触发器

     

     权限的也可以控制到列级别

    update(表的列)

    grant update(列1,列2) on tablename to username

     

     

     

    展开全文
  • 一图搞定 看图说话 老师都这么说:
  • Oracle触发器中执行DDL语句

    千次阅读 2008-05-15 00:12:00
    触发器无需commit也不能写commit触发器和触发它的DML是同一个事务DML提交了,触发器的操作也提交了,要不就一起回滚了当然,如果你一定要在触发器里写COMMIT那就用自治事务相当于一个事务里的子事务正常情况下,...
  • 创建触发器时,触发器类型为after insert , 在begin中 Select fieldA into v_a from tableA; 执行到此句时,会出错: --弹出错误信息提示   --ORA-04091:表tr_table发生了变化触发器/函数不能读它   --...
  • [转]在oracle触发器实现主键自增

    万次阅读 多人点赞 2009-11-30 18:16:00
    利用序列产生主键值。 序列(Sequence)是一种可以被多个用户使用的用于产生一系列唯一数字的数据库对象。序列定义存储在数据字典中,通过提供唯一数值的顺序表来简化程序设计工作,可以使用序列自动产生主键的键值...
  • 本文将介绍如何使用PL/SQL Developer快速的创建一个触发器,应该明确的是鼠标的所有操作都是可以用代码实现的
  • ORACLE触发器(trigger)的使用

    万次阅读 多人点赞 2018-07-03 15:10:16
    1、触发器说明触发器是一种在事件发生时隐式地自动执行的PL/SQL块,不能接受参数,不能被显式调用2、触发器语法create [or replace] trigger trigger_name {before | after | instead of} trigger_event on {table_...
  • 触发器里面before和after的区别

    万次阅读 2017-10-09 22:56:58
    关键字before和after用于标识触发时间,顾名思义,before代表触发器里面的命令在DML修改数据之前执行,after代表触发器里面的命令在DML修改数据之后执行。  读者可以结合应用场景选择使用before或者after。  下面...
  • 1. 触发器的分类 DML触发器 DDL触发器 系统触发器 替代触发器 2. DML触发器
  • ORACLE使用触发器更新数据

    千次阅读 2011-07-06 01:21:02
    在CSDN中,帮别人 写了一个简单的触发器进行更新数据,中间牵扯到好几个问题 create or replace trigger tri_Aafter inserton test11DECLAREpragma autonomous_transaction; -
  • ORACLE利用序列实现ID自增

    千次阅读 2018-07-23 16:53:24
    1、仅使用序列产生自增主键 序列(Sequence)是一种可以被多个用户使用的用于产生一系列唯一数字的数据库对象。序列定义存储在数据字典中,通过提供唯一数值的顺序表来简化程序设计工作,可以使用序列自动产生主键的...
  • Oracle trigger 启用/禁用

    万次阅读 2014-04-23 15:23:24
    节选自:http://www.cnblogs.com/huyong/archive/2011/04/27/2030466.html
  • ORACLE触发器学习

    万次阅读 2017-07-28 15:39:37
    第一节:触发器简介 具备某些条件,由数据库自动执行的一些 DML 操作行为。 第二节:语句触发器语句触发器针对整个表,作用整个表操作; 语法结构: Create trigger 触发器名称 Before/after 触发动作 On 作用对象...
  • Oracle触发器、存储过程、函数、包
  • oracle 触发器 for each row 理解

    万次阅读 2017-03-27 16:48:10
    看到了触发器 中有个 for each row 不是很明白就查了查资料,因为只是简单研究,就先写总结一下。 触发器的一般语法: CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER } {INSERT | DELETE |...
  • ora-04091问题的解决

    千次阅读 2011-08-14 11:12:26
    报告“ora-04091:表已经被修改,对于触发器/函数不可见” 查看oracle developers guide ,在其中trigger的章节搜索ora-04091,根据说明,对于使用了for each row 的触发器,做了DML操作(delete,update
1 2 3 4 5 ... 20
收藏数 14,621
精华内容 5,848
关键字:

dml触发器 oracle