• pl/sql--触发器 Triggers


    一:触发器简介

    pl/sql--触发器 Triggers

      Oracle 可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对各个行或者语句操作上进行触发.

    1.替代触发器

      由于在Oracle里,不能直接对由两个以上的表建立的视图进行操作,所以给出了替代触发器。

    2.系统触发器

      他可以在Oracle数据库系统中的时间中进行触发,如Oracle系统的启动与关闭等。

    触发器组成:

    • 触发事件:即在何种情况下触发Trigger;例如: insert,update,delete。
    • 触发时间即在Trigger是在触发时间发生之前(before)还是之后(after)触发,也就是触发事件和该trigger的操作顺序。
    • 触发器本身:即该trigger被触发后的目的和意图,正是触发器本身要做的事情。例如:pl/sql块。
    • 触发频率:说明触发器内定义的动作被执行的次数。即语句级(statement)触发器和行级(row)触发器

        语句级(statement)触发器:是指当某触发事件发生时,该触发器只执行一次。

        行级(row):是指当某触发时间发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。

    二:trigger 实验

    1.helloworld trigger  后期用plsq工具创建更加简单

    一个helloworld级别的触发器
    create or replace trigger hello_trigger
    after 
    update on employees
    --for each row
    begin 
        dbms_output.put_line('hello...');
        --dbms_output.put_line('old.salary:'|| :OLD.salary||',new.salary'||:NEW.salary);
    end;
    然后执行:
    update employees set salary = salary + 1000 where employee_id=100

    2.行级触发器: for each row  每更新 employees 表中的一条记录, 都会导致触发器执行

    create or replace trigger employees_trigger
    after 
    update on employees
    for each row
    begin
           dbms_output.put_line('修改了一条记录!');
    end;

    3.语句级触发器: 一个 update/delete/insert 语句只使触发器执行一次

    create or replace trigger employees_trigger
    after 
    update on employees
    begin
           dbms_output.put_line('修改了一条记录!');
    end;

    4.使用 :new, :old 修饰符 

       :old    触发器触发之前的数据

       :new  触发器触发之后的数据

    create or replace trigger employees_trigger
    after 
    update on employees
    for each row
    begin
           dbms_output.put_line('old salary: ' || :old.salary || ', new salary: ' || :new.salary);
    end;

    5.综合例子:编写一个触发器, 在对 my_emp 记录进行删除的时候, 在 my_emp_bak 表中备份对应的记录

    1). 准备工作:
        create table my_emp as select employee_id id, last_name name, salary sal from employees
        create table my_emp_bak as select employee_id id, last_name name, salary sal from employees where 1 = 2
    
    2). 
    create or replace trigger bak_emp_trigger
           before delete on my_emp
           for each row
           
    begin
           insert into my_emp_bak values(:old.id, :old.name, :old.sal);
    end; 
  • 相关阅读:
    UTF-8 的理解
    P4779 【模板】单源最短路径(标准版)
    Proj THUDBFuzz Paper Reading: FuzzFactory: Domain-Specific Fuzzing with Waypoints
    记一次ctf文件上传
    使用vue创建项目的详细步骤
    Vue进行事件处理的方法(指南
    规则引擎-可视化平台-构思1
    常用正则校验
    tomcat无法启动socket bind failed 的解决方法
    mysql修改root密码
  • 原文地址:https://www.cnblogs.com/cbpm-wuhq/p/11971322.html
Copyright © 2020-2023  润新知