首页 > 数据库 > 数据库开发技术 > PLSQL学习-【8trigger】
触发器在数据库里以独立的对象存储,它与存储过程不同的是,存储过程通过其他程序来启动运行或者直接启动运行,而触发器是由一个时间来启动运行。并且,触发器不能接受参数。所以运行触发器就叫触发或者点火。
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/ ,如需转载,请注明出处,否则将追究法律责任。