ITPub博客

首页 > 数据库 > 数据库开发技术 > PLSQL学习-【8trigger】

PLSQL学习-【8trigger】

原创 数据库开发技术 作者:哎呀我的天呐 时间:2014-11-24 16:36:53 0 删除 编辑



触发器在数据库里以独立的对象存储,它与存储过程不同的是,存储过程通过其他程序来启动运行或者直接启动运行,而触发器是由一个时间来启动运行。并且,触发器不能接受参数。所以运行触发器就叫触发或者点火。
ORACLE事件指的是对数据库的表进行的insert、update、delete操作或者对视图进行类似的操作。
ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。


语句级触发器:是指当某触发事件发生时,该触发器只执行一次;
行级触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。
old 代表旧数据,new代表修改或插入的新数据。
所以insert只有new delete只有old


在删除动作之前备份。


03:27:31 SQL> create table emp_bak as select * from emp where 1 = 2;
Table created.
Elapsed: 00:00:00.06
03:29:13 SQL> 
03:29:13 SQL> select * from emp_bak;
no rows selected



create or replace trigger br_bak
  before delete or update on emp for each row 
  declare
  begin
    insert into emp_bak 
    values(:old.empno,:old.ename,:old.job,:old.mgr,:old.hiredate,old.sal,old.comm,old.deptno);
  commit;
end;


这里不能用commit,以为触发器本身就是一个事务,删除和备份看成一个整体,删除成功必须保障备份成功。

create or replace trigger br_bak
  before delete or update on emp for each row   --针对行的触发
  declare
begin
    insert into emp_bak 
    values(:old.empno,:old.ename,:old.job,:old.mgr,:old.hiredate,:old.sal,:old.comm,:old.deptno);
end;


03:29:27 SQL> delete from emp where empno = 9999;
1 row deleted.
Elapsed: 00:00:00.04
03:31:33 SQL> commit;
Commit complete.
Elapsed: 00:00:00.00
03:31:36 SQL> select * from emp_bak; 
     EMPNO ENAME      JOB           MGR HIREDATE           SAL     COMM      DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
      9999 LOU
Elapsed: 00:00:00.07
这样就可以了。

替换触发器:
create or replace trigger tr_delete
   instead of delete on emp_back for each row 
   declare 
begin
   delete from emp where empno=:old.empno; 
end;


记录用户的操作行为:
   
语句触发:

create or replace trigger tr_action 
  after insert or delete or update on emp 
  declare
    v_action varchar2(30);
  begin
    if inserting then
     v_action:='insert';
    elsif deleting then
    v_action:='delete';
    elsif updating then
     v_action:='update';
    else 
     v_action:='others';
    end if;
    insert into t_action values(v_action ,sysdate);
end;


当对emp中记录进行操作的时候,我们就会在这个表中有记录。

04:32:48 SQL> select * from t_action;
ACTION_NAME                     ACTION_TIME
------------------------------ ------------
delete                          24-NOV-14
Elapsed: 00:00:00.00

系统触发器:记录哪些用户偷偷的登陆你的数据库了

create or replace trigger tr_login
   after logon on database
   declare
 begin
   insert into scott.login_tab values(USER,sysdate);
 end;
 Trigger created.


去login_tab表中查看记录。





来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29990276/viewspace-1344852/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: PLSQL学习-【9包】
请登录后发表评论 登录
全部评论
https://cloud.tencent.com/developer/inventory/14362

注册时间:2014-10-30

  • 博文量
    403
  • 访问量
    2528705