• Oracle系列之触发器


    涉及到表的处理请参看原表结构与数据  Oracle建表插数据等等

    创建一个触发器,使其可以修改tb_Department表的deptno。

    create or replace trigger update_dept
    after update on deptno
    for each row
    begin
    update tb_Department set deptno=:new.deptno where deptno=:old.deptno;
    end;
    /

    建立一个语句级触发器,防止在非工作时间对于某个表的更新,插入和删除

    create or replace trigger tr_dept_time
    before insert or delete or update
    on tb_Department
    begin
    if(to_char(sysdate, 'DAY') in ('星期六', '星期日')) or
     (to_char(sysdate, 'HH24:MI') not between '08:00' and '18:00')
    then
    raise_application_error(-20001, '非工作时间,不能对tb_Department修改');
    end if;
    end;
    /
    select trigger_name, trigger_type from user_triggers
    where table_name = 'tb_Department';

    在tb_Department表中加入一个列,用于统计部门的总工资,在tb_Employee表上建立一个行级触发器,用于同步这个数据

    alter table tb_Department add  sum_salary number(10) default 0;
    declare
    sum_sal tb_Employee.salary % type;
    cursor dep_sal_cur is
    select deptno,sum(sal) as sum_sal
    from tb_Employee
    group by deptno;
    begin
    for dep_sal in dep_sal_cur loop
    update tb_Department 
    set sum_salary = dep_sal.sum_sal
    where deptno = dep_sal.deptno;
    end loop; 
    end;
    create or replace trigger tri_emp_dep
    after insert or delete or update of sal
    on tb_Employee
    for each row
    begin
    dbms_output.put_line('行触发器执行');
    update departments 
    set sum_salary = sum_salary + nvl(:new.salary, 0) - nvl(:old.salary, 0);
    end;
    /

    使用序列和触发器,给流水号列自动添加流水号。

    create sequence seq_table1 
    start with 1
    increment by 1
    maxvalue 9999999;
    create table table1(num1 number, name1 varchar2(20));
    create or replace trigger trg_table1
    before insert on table1
    for each row
    declare
    begin
    select seq_table1.nextval into :new.num1 from dual;
    end;
    /

    在一个多事件的触发器中,使用条件谓词,对插入,删除,更新进行不同的处理。

    create or replace trigger mul_event_tri
    after insert or delete or update on table1
    begin
    case 
    when inserting then
    dbms_output.put_line('data has been inserted');
    when deleting then
    dbms_output.put_line('data has been deleted');
    when updating then
    dbms_output.put_line('data has been updated');
    end case;
    end;
    /

    建立一个审计表,把某个表更新,插入,删除的数据,通过行级触发器,记录到审计表,需要记录更新前后数据的变化,操作的类型和时间。

    create table audit_table1(  
    old_num number,
    new_num number,
    old_name varchar2(20),
    new_name varchar2(20),
    op_type varchar2(20),
    op_date varchar2(20)
    );
    
    create or replace trigger audit_tri
    before update or insert or delete
    on table1
    for each row
    declare 
    str varchar2(20);
    begin
    case 
    when updating then
    str := 'update';
    when inserting then
    str := 'insert';
    when deleting then
    str := 'delete';
    end case;
    insert into audit_table1 values(
    :old.num1, :new.num1, :old.name1, :new.name1, str, 
    to_char(sysdate) || ' ' || to_char(sysdate, 'HH24:MI'));
    end;
    /
    -- test -- 
    insert into table1 values(17, 'TFJ');
    select * from table1;
    select * from audit_table1;
    -- test --
  • 相关阅读:
    【Unity学习笔记】Unity网络游戏开发实战(一)---网络编程的开端:Echo程序
    【DX11学习笔记】GerstnerWave波浪模拟(基于GPU计算着色器的实现)
    【DX11学习笔记】粒子系统--爆炸特效
    【设计模式】(二)观察者模式是什么?
    【设计模式】(一)工厂模式是什么?
    【C++笔记】C++中常见智能指针auto_ptr、unique_ptr、shared_ptr和weak_ptr的用法
    【C++笔记】C++关联容器set和map的概述和操作
    【C++笔记】C++函数模版与类模版
    【C++笔记】C++中vector、stack、deque、list的简易实际使用方法
    python之赋值、浅拷贝、深拷贝
  • 原文地址:https://www.cnblogs.com/tufujie/p/5074356.html
Copyright © 2020-2023  润新知