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记录的日志:
三、行触发器
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
四、触发器禁用和开启
禁用不等于删除,只是将其不起作用,可以再次开启;