介绍:触发器在数据库里以独立的对象存储,它与存储过程不同的是,存储过程通过其它程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。所以运行触发器就叫触发或点火(firing)。ORACLE事件指的是对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作。ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。
触发器的组成:
触发事件:即在何种情况下触发TRIGGER; 例如:INSERT, UPDATE, DELETE。
触发时间:即该TRIGGER 是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER 的操作顺序。
触发器本身:即该TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。 例如:PL/SQL 块。
触发频率:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。
语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次;
行级(ROW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独
创建触发器执
创建触发器的一般语法是 :
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER }
{INSERT | DELETE | UPDATE [OF column [, column …]]}
ON [schema.] table_name
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
trigger_body;
下面我就用ORACLE数据库自带的SCOTT用户的DEPT表做一个案例供大家参考:
做这个案例之前复制一个与DEPT表结构一样的表,我们命名为COPY_DEPT
--复制表结构的同时复制表中的数据--
create table copy_dept as select * from dept where 1=1;
--复制表结构但不复制表中的数据--
create table copy_dept as select * from dept where 1=1;
我的触发器:
create or replace trigger test_triggger
after insert or delete or update on dept
for each row
begin
if inserting then
insert into copy_dept values (:new.deptno,:new.dname,:new.loc);
elsif deleting then
delete from copy_dept where deptno=:old.deptno;
else
update copy_dept set deptno=:new.deptno,dname=:new.dname,loc=:new.loc
where deptno=:old.deptno;
end if;
end;
--测试数据--
insert into DEPT values(50,'张三','金融部');
delete from dept where deptno=50;
update dept set dname='赵日天',loc='北京' where deptno=50;
其中test_trigger是该触发器的名字,for each now 表示该触发器是一个行级触发器,new表示新值 old表示旧值
--删除触发器--
drop trigger trigger_name;
行一次。