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

四、触发器禁用和开启                                    

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

原文地址:https://www.cnblogs.com/tenWood/p/6637790.html