• Oracle学习操作(5)触发器


    Oracle触发器

    一、触发器简介                                          

    具备某些条件,由数据库自动执行的一些DML操作行为;

    二、语句触发器                                          

    现在数据库创建t_book表;t_booktype表:t_book表的typeid存在外键参考t_booktype的id:

    1.需求:当前用户不是CC时,insert/delete/update t_book表就提示‘权限不足’:

    SQL> create or replace trigger tr_book
      2  before insert or update or delete
      3  on t_book
      4  begin
      5     if user!='CC' then
      6             raise_application_error(-20001,user||'权限不足');
      7     end if;
      8  end;
      9  /
    
    触发器已创建
    
    //如果没有创建触发器的权限,sys dba登陆:
    SQL> grant create trigger to c##chengyu;

    当前用户为c##chengyu,在t_book中插入数据报错:

    SQL> insert into t_book values(4, 'xxx', 1);
    insert into t_book values(4, 'xxx', 1)
    *
    第 1 行出现错误:
    ORA-20001: C##CHENGYU权限不足
    ORA-06512: 在 "C##CHENGYU.TR_BOOK", line 3
    ORA-04088: 触发器 'C##CHENGYU.TR_BOOK' 执行过程中出错

    2.触发器谓词: 把用户的某些操作记录在日志中: 现在将t_book的增、删、改操作记录到t_book_log这个表中:

    SQL> create or replace trigger tr_book_log
      2  after insert or update or delete
      3  on t_book
      4  begin
      5     if updating then
      6             insert into t_book_log values(user,'update',sysdate);
      7     else if inserting then
      8             insert into t_book_log values(user,'insert',sysdate);
      9     else if deleting then
     10             insert into t_book_log values(user,'delete',sysdate);
     11     end if;
     12     end if;
     13     end if;
     14  end;
     15  /
    
    触发器已创建
    
    //user:内置变量,能够获取到当前用户;

    进行一些增、删、改的操作,查看t_book_log记录的日志:

    三、行触发器                                          

    现在需求是 由触发器来维护t_booktype的num这个字段;当t_book的typeId为1的 有insert/delete时,触发器自动更新t_booktype表的num字段:
    SQL> create trigger tr_book_add
      2  after insert
      3  on t_book
      4  for each row
      5  begin
      6     update t_booktype set num = num+1 where id=:new.typeid;
      7  end;
      8  /
    
    触发器已创建
    
    SQL> create trigger tr_book_delete
      2  after delete
      3  on t_book
      4  for each row
      5  begin
      6     update t_booktype set num = num-1 where id=:old.typeid;
      7  end;
      8  /
    
    触发器已创建
    
    //:new     新增的行记录
    //:old      删除的行记录;

    现在新增记录,查看num已自动维护:

    SQL> delete from t_book where id = 4;

    已删除 1 行。

    SQL> select * from t_booktype;

    ID TYPENAME NUM
    ---------- ---------- ----------
    1 计算机类 2
    2 生物类 1

    四、触发器禁用和开启                                    

    禁用不等于删除,只是将其不起作用,可以再次开启;

  • 相关阅读:
    CCCC L2-023. 图着色问题【set去重判不同种类个数/简单图论/判断两相邻点是否存在同色以及颜色个数】
    百练 04 简单的整数划分问题
    NYOJ90 整数划分(经典递归和dp)
    图遍历问题
    图着色问题
    Java 大数(整数+浮点数) 基本函数
    根据规律绘制图形(俗称蛇皮走位)
    KMP算法之我见
    CCCC L1-039. 古风排版【图形输出/循环控制行列/模拟/细节】
    HYSBZ 2818 Gcd【欧拉函数/莫比乌斯】
  • 原文地址:https://www.cnblogs.com/tenWood/p/6637790.html
Copyright © 2020-2023  润新知