触发器是一种特殊的过程,但是用户不能直接调用触发器。触发器是特定事件出现时自动执行的代码块
触发器示例
create or replace trigger biufer_emp_empno --触发器名称 before insert or update --触发语句 of empno on emp --on 目标表 referencing old as old_value new as new_value for each row when(new value.empno<>7782) --触发器限制 begin :new_value.comm:=0; --触发操作 end; /
触发器名称中应该包含触发器执行时间、执行的操作、涉及的表或列
如:
biufer --> before insert or update for each row
emp代表emp表,empno代表empno列,这可以指出触发器会涉及哪个列的值
语句触发器
1、用户可能需要在表上进行安全检查的insert、update或delete语句触发器,以便根据用户的具体业务规则验证正在进行操作的用户是否具有指定的权限
CREATE TABLE FOO(a number); create or replace trigger biud_foo_a before insert or update or delete on foo begin if user not in ('jack','Clinton') then raise_application_error(-20001,'你没有修改此表的权限') end if; end; /
如果用户不是...没有权限修改
在emp_copy表上创建一个触发器,当对emp_copy表执行插入、删除或更新操作是,该触发器将会填充emp_copy_log
create or replace trigger biufer_emp_copy before insert or update or delete on emp_copy begin insert into emp_copy_log values(user,sysdate); end; /
然后测试该触发器。修改emp_copy
create table emp_copy_log( who varchar2(30), when date) /
行触发器 http://swordshadow.iteye.com/admin/blogs/1966002
instead of 触发器
instead of触发器是Oracle系统用来替换所使用的实际语句而执行的触发器,与导致触发器激活的语句执行之前或执行之后的语句触发器和行触发器不同
示例:首先在emp表上创建emp_job视图
create or replace view emp_job as select empno, ename, job from emp;
接着在emp_job视图上创建一个触发器。使得对emp_job视图的数据更新转变为对emp表的数据更新
create or replace trigger update_emp_job_view instead of update on emp_job begin update emp set empno = :new.empno, ename = :new.ename, job = :new.job where empno = :old.empno
在触发器的主体有一个对表emp的update关键字。由于emp_job视图是建立在emp表上的视图,如果更新这个视图,实际上就是更新该图的基本表
删除触发器:
ALTER TRIGGER 名称 DISABLE; drop trigger 名称;
其他资料参考:
两个经典的Oracle触发器示例