dml语句级触发器 oracle 获得sql语句器_oracle ddl语句和dml语句区别 - CSDN
精华内容
参与话题
  • 本文将介绍如何使用PL/SQL Developer快速的创建一个触发器,应该明确的是鼠标的所有操作都是可以用代码实现的

    本文将介绍如何使用PL/SQL Developer快速的创建一个Oracle触发器,应该明确的是鼠标的所有操作都是可以用代码实现的


    一、打开PL/SQL Developer,登录到数据库


    二、在左侧Objects上右击,选new


    左侧如果没有Objects,在菜单里按Tools,下拉菜单中选中Object Browser


    三、弹出对话框


    其中

    1.Name是触发器名称

    2.Fires是触发时间,选项包括before、after以及instead of

    先介绍before和after,顾名思义,before是触发事件执行前触发,after是触发事件执行后触发,触发顺序如下

    1.        执行 BEFORE语句级触发器;

    2.        对于受语句影响的每一行:

    l         执行 BEFORE行级触发器

    l         执行 DML语句

    l         执行 AFTER行级触发器 

    3.        执行 AFTER语句级触发器 

    语句级和行级触发器见5

    instead of不介绍了,详细可以到我转载的文章里看http://blog.csdn.net/asdsa108/article/details/50540221#t8

    3.Event是触发事件,包括insert、update、delete,实际上还可以加上or进行连接,如insert or update

    4.Table or view选择表或视图

    5.Statement Level?该选项选择是语句级触发器还是行级触发器,介绍如下

    行触发器要求当一个DML语句操作影响数据库中的多行数据时,对于其中的每个数据行,只要它们符合触发约束条件,均激活一次触发器;而语句触发器将整个语句操作作为触发事件,当它符合约束条件时,激活一次触发器。当省略FOR EACH ROW 选项时,BEFORE AFTER 触发器为语句触发器,而INSTEAD OF 触发器则只能为行触发器

    Statement level总结:针对语句执行的则勾选,只触发一次,代码中没有For each row;针对语句操作的数据行则不勾选,每条受语句影响且符合触发条件的数据,都会触发一次触发器,代码中有For each row。

    四、根据需求选好后,进入Sql语句框(没写完,后面给个例子好了)

    随便找的例子:

    [sql] view plain copy
    1. CREATE OR REPLACE TRIGGER tr_reg_cou  
    2. AFTER update OF region_id  
    3. ON regions  
    4. FOR EACH ROW  
    5. BEGIN  
    6.  DBMS_OUTPUT.PUT_LINE('旧的region_id值是'||:old.region_id  
    7.                   ||'、新的region_id值是'||:new.region_id);  
    8.  UPDATE countries SET region_id = :new.region_id  
    9.  WHERE region_id = :old.region_id;  
    10. END;  

    想要取更改前后数据使用:old/new加上字段名,要注意old、new之前必须加冒号

    最后F8运行,没问题的话触发器就开始运行了

    延伸阅读:DML触发器相关知识

        触发器名与过程名和包的名字不一样,它是单独的名字空间,因而触发器名可以和表或过程有相同的名字,但在一个模式中触发器名不能相同。 

    DML触发器的限制

    l         CREATE TRIGGER语句文本的字符长度不能超过32KB

    l         触发器体内的SELECT 语句只能为SELECT … INTO …结构,或者为定义游标所使用的SELECT 语句。

    l         触发器中不能使用数据库事务控制语句 COMMIT; ROLLBACK, SVAEPOINT 语句;

    l         由触发器所调用的过程或函数也不能使用数据库事务控制语句;

    l         触发器中不能使用LONG, LONG RAW 类型;

    l         触发器内可以参照LOB 类型列的列值,但不能通过 :NEW 修改LOB列中的数据; 

    DML触发器基本要点

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

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

    l         条件谓词:当在触发器中包含多个触发事件(INSERTUPDATEDELETE)的组合时,为了分别针对不同的事件进行不同的处理,需要使用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

    解发对象:指定触发器是创建在哪个表、视图上。

    l         触发类型:是语句级还是行级触发器。

    l         触发条件:WHEN子句指定一个逻辑表达式,只允许在行级触发器上指定触发条件,指定UPDATING后面的列的列表 

      问题:当触发器被触发时,要使用被插入、更新或删除的记录中的列值,有时要使用操作前、        后列的值.

      实现:  :NEW 修饰符访问操作完成后列的值

                :OLD 修饰符访问操作完成前列的值 

    特性

    INSERT

    UPDATE

    DELETE

    OLD

    NULL

    实际值

    实际值

    NEW

    实际值

    实际值

    NULL



    出现的问题

    当触发器触发条件是对某表的DML操作时,触发器不能对该表再进行DML操作

    如触发条件是after update table,触发执行update table,则会报错【表table发生了变化,触发器/函数不能读它】

    修改方法只能是触发执行update table2,因为触发的DML命令还没有commit执行完毕就不能执行触发器里的语句

    展开全文
  • 1. 触发器的分类 DML触发器 DDL触发器 系统触发器 替代触发器 2. DML触发器

    参考网址:http://hi.baidu.com/bystander1983/item/f065c00cbe25508d03ce1b3b,原文稍微乱一些,感谢原作者的分享。


    1. 触发器的分类

    • DML触发器

    • DDL触发器

    • 系统触发器

    • 替代触发器

    2. 触发器的执行顺序

    1. 如果存在语句级BEFORE触发器,则先执行一次语句级BEFORE触发器。

    2. 在SQL语句的执行过程中,如果存在行级BEFORE触发器,则SQL语句在对每一行操作之前,都要先执行一次行级BEFORE触发器,然后才对行进行操作。

    如果存在行级AFTER触发器,则SQL语句在对每一行操作之后,都要再执行一次行级AFTER触发器。 

    3. 如果存在语句级AFTER触发器,则在SQL语句执行完毕后,要最后执行一次语句级AFTER触发器。


    3. 行级触发器与表级触发器(语句触发器)

    行级触发器对DML语句影响的每个行执行一次;

    语句级触发器对每个DML语句执行一次,如果在TABLE表中插入的数据为500行,那么这个表上的语句级触发器只执行一次,而行级的触发器就要执行500次了。 

    若在触发器定义中出现FOR EACH ROW子句,则为行级触发器,否则为表级触发器(语句触发器).

    4. DML触发器

    DML触发器是定义在表上的触发器,有DML事件引发。

    4.1 DML事件(3种)

    INSERT 在表或视图中插入数据时触发

    UPDATE 修改表或视图中的数据时触发

    DELETE 在删除表或视图中的数据时触发

    4.2 编写DML触发器的要素

    • 确定触发的表,即在其上定义触发器的表

    • 确定触发的事件,DML触发器的触发事件有INSERT、UPDATE和DELETE三种

    • 确定触发时间。触发的时间有BEFORE和AFTER两种,分别表示触发动作发生在DML语句执行之前和语句执行之后

    • 确定触发级别,有语句级触发器和行级触发器两种。语句级触发器表示SQL语句只触发一次触发器,行级触发器表示SQL语句影响的每一行都要触发一次

    4.3 相关问题备注

    1. 如果有多个触发器被定义成为相同时间、相同事件触发,且最后定义的触发器是有效的,则最后定义的触发器被触发,其他触发器不执行。 

    2. 一个触发器可由多个不同的DML操作触发。在触发器中,可用INSERTING、DELETING、UPDATING谓词来区别不同的DML操作。

         这些谓词可以在IF分支条件语句中作为判断条件来使用。 

    3. 在行级触发器中,用:new 和:old(称为伪记录)来访问数据变更前后的值。

        但要注意,INSERT语句插入一条新记录,所以没有:old记录,而DELETE语句删除掉一条已经存在的记录,所以没有:new记录。

         UPDATE语句既有:old记录,也有:new记录,分别代表修改前后的记录。

        引用具体的某一列的值的方法是: :old.字段名或:new.字段名。

        触发器体内禁止使用COMMIT、ROLLBACK、SAVEPOINT语句,也禁止直接或间接地调用含有上述语句的存储过程。 

    4.4 创建触发器

    CREATE [OR REPLACE] TRIGGER 触发器名
    {BEFORE|AFTER|INSTEAD OF} 触发事件1 [OR 触发事件2...]
    ON 表名
    WHEN 触发条件
    [FOR EACH ROW]
    DECLARE
    声明部分
    BEGIN
    主体部分
    END; 

    其中:

    OR REPLACE:表示如果存在同名触发器,则覆盖原有同名触发器。

    BEFORE、AFTER和INSTEAD OF:说明触发器的类型。

    WHEN 触发条件:表示当该条件满足时,触发器才能执行。

    触发事件:指INSERT、DELETE或UPDATE事件,事件可以并行出现,中间用OR连接。

    对于UPDATE事件,还可以用以下形式表示对某些列的修改会引起触发器的动作:

    UPDATE OF 列名1,列名2...

    ON 表名:表示为哪一个表创建触发器。

    FOR EACH ROW:表示触发器为行级触发器,省略则为语句级触发器。


    示例:

    表:

    很简单,只有一个ID,一个NAME

    create table T_YGY_DEMO_BOOK2
    (
      ID   NUMBER(11) not null,
      NAME VARCHAR2(100) not null
    )



    1. 对表T_YGY_DEMO_BOOK2进行INSERT,UPDATE,DELETE操作时,输出相应的记录。

    CREATE OR REPLACE TRIGGER TRI_YGY_BOOK2_LOG
    
    BEFORE INSERT OR UPDATE OR DELETE
    
    ON T_YGY_DEMO_BOOK2
    
    BEGIN
    
       IF INSERTING THEN DBMS_OUTPUT.put_line('触发器日志:要添加一条记录');
     
    
       ELSIF UPDATING THEN DBMS_OUTPUT.put_line('触发器日志:要修改一条记录');
      
    
       ELSIF DELETING THEN DBMS_OUTPUT.put_line('触发器日志:要删除一条记录');
       
       END IF;
    
    END;
    
    
    /

    2. 对表T_YGY_DEMO_BOOK2进行更新操作时,判断ID是否大于5000,并输出不同的记录

    CREATE OR REPLACE TRIGGER TRI_YGY_BOOK2_VALUE
    
    BEFORE UPDATE
    
    ON T_YGY_DEMO_BOOK2
    
    FOR EACH ROW
    
    BEGIN
    
       IF :OLD.ID>5000 THEN DBMS_OUTPUT.put_line('触发器日志:要更新的id大于5000.');
       
       ELSE DBMS_OUTPUT.put_line('触发器日志:要更新的id小于5000');
       
       END IF;
    
    END;
    
    /


    展开全文
  • Oracle触发器中执行DDL语句

    千次阅读 2008-05-15 00:12:00
    触发器无需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.

    展开全文
  • 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_...

    1、触发器说明

    触发器是一种在事件发生时隐式地自动执行的PL/SQL块,不能接受参数,不能被显式调用

    2、触发器类型

    根据触发器所创建的语句及所影响的对象的不同,将触发器分为以下3类

    (1)DML触发器

    对数据表进行DML语句操作(如insert、update、delete)时所触发的触发器,可以分为:

    语句级触发器或行级触发器:行级触发器会对数据库表中的受影响的每一行触发一次触发器代码,语句级触发器则只触发一次,与语句所影响到的行数无关

    before触发器或after触发器:before触发器在触发事件发生之前执行触发器代码,after触发器则在触发事件发生之后执行

    语法:
    create [or replace] trigger trigger_name
    {before | after} trigger_event
    on table_name
    [for each row]
    [when trigger_condition]
    trigger_body

    语法解释:

    trigger_name:触发器名称

    before | after : 指定触发器是在触发事件发生之前触发还暗示发生之后触发

    trigger_event:触发事件,在DML触发器中主要为insert、update、delete等

    table_name:表名,表示发生触发器作用的对象

    for each row:指定创建的是行级触发器,若没有该子句则创建的是语句级触发器

    when trigger_condition:添加的触发条件

    trigger_body:触发体,是标准的PL/SQL语句块


    (2)替代触发器(instead of触发器)

    对视图进行操作时定义的触发器,替代触发器只能定义在视图上

    语法:
    create [or replace] trigger trigger_name --触发器名称
    instead of trigger_event --触发事件
    on view_name --视图名称
    for each row  --替代触发器必须指定为行级的触发器
    [when trigger_condition] --触发条件
    trigger_body --触发体,PL/SQL块

    (3)系统事件触发器

    对数据库实例或某个用户模式进行操作时定义的触发器,可以分为:

    数据库系统触发器和用户触发器


    3、案例

    (1)DML触发器

    DML触发器的案例都是基于student表和stu_log表来进行的,所以先创建student表和stu_log表

    create table STUDENT   ---创建student表
    (
      id        NUMBER(19), --id
      stu_no    VARCHAR2(20), --学号
      stu_name  VARCHAR2(32), --姓名
      stu_age   NUMBER,  --年龄
      stu_major VARCHAR2(32) --专业
    )
    create table STU_LOG   ---创建stu_log表,用于记录对student表的操作日志
    (
      log_id     NUMBER,  --日志id
      log_action VARCHAR2(100),  --操作名称
      log_date   DATE,  --操作时间
      log_message   VARCHAR2(32) --
    )

     a、行级触发器(before触发器)

    创建触发器:实现id的隐式自增
    create or replace trigger modify_stu 
    before insert on student
    for each row
    declare
    next_id number;
    begin
      select seq_test.nextval into next_id from dual;
      :new.id :=next_id;
    end;

    插入一条数据,但是不插入id

    insert into student(stu_no,stu_name,stu_age,stu_major) values('NO1','张三',20,'中文系'); 

    查询结果如下,自动生成id了


    b、 行级触发器(after触发器)

    创建触发器:将对student表的操作都记录到stu_log表中(update of 用于指定一个或多个字段,指定字段被更新时才会触发触发器)
    create or replace trigger modify_stu
    after insert or delete or update of stu_name
    on student
    for each row
      begin 
        if inserting then
          insert into stu_log values(1,'insert',sysdate,:new.stu_name);
        elsif deleting then
           insert into stu_log values(2,'delete',sysdate,:old.stu_name);
        elsif updating then
          insert into stu_log values(3,'update_old',sysdate,:old.stu_name);
          insert into stu_log values(4,'update_new',sysdate,:new.stu_name);
         end if;
    end;
    insert into student values(1,'NO2','李四',21,'数学系');  --插入一条数据
    delete student where stu_name='张三';   --删除一条数据
    update student set stu_age=19 where stu_name='李四';  --修改李四的年龄
    update student set stu_name='王二' where stu_name='李四';  --修改李四的名称

    查询stu_log表的结果如下,第3条update语句没有触发该触发器,因为触发器指定只有修改stu_name字段才会触发触发器


     c、语句级触发器(before触发器):用来控制对表的修改

    create or replace trigger modify_stu
    before insert or update or delete on student
    begin
       if deleting then
         raise_application_error(-20001,'该表不允许删除数据');
       elsif updating then
         raise_application_error(-20002,'该表不允许修改数据');
        elsif inserting then
         raise_application_error(-20003,'该表不允许插入数据');
        end if;
    end;

    插入数据时报错如下,删除和修改数据同样也报错


     d、语句级触发器(after触发器):略


    展开全文
  • Oracle触发器、存储过程、函数、包
  • 行级触发器语句级触发器

    千次阅读 2016-04-30 14:30:32
    1、 行级触发器DML语句影响的每个行执行一次。(:NEW 和:OLD使用方法和意义,new 只出现在insert和update时,old只出现在update和delete时。在insert时new表示新插入的行数据,update时new表示要替换的新数据、...
  • Oracle trigger 启用/禁用

    万次阅读 2014-04-23 15:23:24
    节选自:http://www.cnblogs.com/huyong/archive/2011/04/27/2030466.html
  • Oracle数据库(十八):触发器

    千次阅读 2019-07-09 13:14:07
    DML触发器:当向一个特定的表插入、更新或者删除记录时可以触发DML触发器。可以在一个DML语句的执行之前或者之后触发;或者在语句每一行之前或者... 语句级别触发器:由整个SQL语句触发的; 行级别触发器:针对S...
  • oracle 行触发器与语句触发器的区别

    千次阅读 2010-09-07 10:31:00
    oracle 行触发与语句触发的区别: 1、行触发器有 for each row子句。语句触发器没有for each row 子句。 2、行触发器,可以有 when 作为触发限制,可以使用new/old。语句触发器不能有when 作为触发限制。 3、...
  • 需求:公司一系统升级,要维护的数据库表中已有数据,该表没有序列、触发器等。此表要直接插入一些数据,插入的数据为了和以前的数据兼容(就是一样)。该表主键的生成以前是在代码中分两步进行的,即查询、更新(现在...
  • oracle 触发器 for each row 理解

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

    万次阅读 多人点赞 2009-11-30 18:16:00
    利用序列产生主键值。 序列(Sequence)是一种可以被多个用户使用的用于产生一系列唯一数字的数据库对象。序列定义存储在数据字典中,通过提供唯一数值的顺序表来简化程序设计工作,可以使用序列自动产生主键的键值...
  • 学习Oracle从哪里入手呢,在这里,我将带你走进Oracle的大门,一天一章,7天入门不是梦 1. 游标 SQL语言是面向集合的,其结果一般是集合量(多条记录),而PL/SQL语言的变量一般是标量,其一组变量一次只能存放一...
  • oracle_DML触发器

    千次阅读 2011-12-22 11:59:46
    触发器 一.简介 触发器是由 PL/SQL 或 Java 编写的过程[procedure],当表或视图被修改或发生用户操作[user action]或数据库系统操作...· 用户提交了针对特定表或视图的 DML 语句(INSERT,UPDATE,DELETE)
  • ORACLE利用序列实现ID自增

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

    万次阅读 2012-02-27 22:54:41
     触发器与存储过程非常相似,触发器也是SQL语句集,两者唯一的区别是触发器不能用EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发(激活)执行。触发器是在一个修改了指定表中的数据时执行的存储过程。...
  • ORACLE触发器学习

    万次阅读 2017-07-28 15:39:37
    第二节:语句触发器语句触发器针对整个表,作用整个表操作; 语法结构: Create trigger 触发器名称 Before/after 触发动作 On 作用对象 触发器谓词:INSERTING、UPDATING、DELETING 创建触发器并使用:create ...
  • Oracle触发器及使用举例(几种触发器类型)
  •  1.1 DML触发器  1.2 替代触发器  1.3 系统触发器 2.触发器组成 3.创建触发器  3.1 触发器触发次序  3.2 创建DML触发器  3.3 创建替代(INSTEAD OF)触发器  3.3 创建系统事件触发器  3.4 系统触发器事件属性 ...
  • oracle自增auto_increment

    千次阅读 2013-05-25 11:46:06
    如果需要插入时自动增加还需要创建一个 trigger(触发器),否则需要在程序中手工设置  例如:将表fcbook的主键fid设置为自增  1. 创建squence  Name : 创建的名字  Min value : 最小计数  Max ...
1 2 3 4 5 ... 20
收藏数 12,567
精华内容 5,026
关键字:

dml语句级触发器 oracle 获得sql语句器