触发器的作用

触发器
触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由个事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。

触发器可以查询其他表,而且可以包含复杂的 SQL 语句。它们主要用于强制服从复杂的业务规则或要求。例如,您可以根据客户当前的帐户状态,控制是否允许插入新订单。

触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。 

 

ORACLE 触发器其实是PL/SQL块

ORACLE 触发器其实是PL/SQL块,它类似于存储过程和函数,不过有一点不同的是,触发器是隐式调用的,并不能接收参数.    ORACLE触发器有三种类型,分别是:DML触发器, 替代触发器和系统触发器. 下面对这三种类型一一进行讲述
 1.DML触发器
  顾名思义,DML触发器是由DML语句触发的.例如数据库的INSERT/UPDATE/DELETE操作都可以触发该类型的触发器. 它们可以在这些语句之前或之后触发,或者在行级上触发(就是说对于每个受影响的行都触发一次)
 例如我们有一张表TABLE1 ,总共有三个字段  ID,姓名,年龄 ,当我们在插入时希望ID可以自动生成,那么可以建立一个触发器
CREATE OR REPLACE TRIGGER TR_INSERT_ID 

BEFORE INSERT ON  TABLE1

BEGIN

 SELECT  T.NEXTVAL INTO :NEW.ID FROM DUAL;

END;  
那么当我们插入该表的时候,ID字段会自动填充.
2.替代触发器
替代触发器只能使用在视图上,与DML不同的是,DML触发器是运行在DML之外的,而替代触发器是代替激发它的DML语句运行.替代触发器是行级,举个例子,这里有个视图:
--例子来源insteadOf.sql
 
CREATE OR REPLACE VIEW classes_rooms AS
SELECT department, course, building, room_numbe
FROM rooms, classes
WHERE rooms.room_id = classes.room_id;3.并且对于行级触发器,可以通过:NEW和:OLD标志来访问正在处理中的行数据. 对于DML触发器,这两个标志符的意义如下: 
触发语句                           标识符: o l d                                           标识符: n e w
I N S E RT           无定义-所有字段为空N U L L                    该语句结束时将插入的值
U P D A E                 更新前行的原始值                               该语句结束时将更新的值
D E L E T E          行删除前的原始值                                无定义-所有字段为空N U L L [Page]
注意 标识符 : o l d对I N S E RT语句无定义,而标识符 : n e w对D E L E T E语句无定义。
P L / S Q L编译器不会对在I N S E RT语句中使用的: o l d和在D E L E T E语句中使用的: n e w标识
符报错,编译的结果将使该字段为空。同时,我们不能在行级触发器之后改变 : n e w,其原因是该语句已被处理了。总的来说,对: n e w的修改只能在行级触发器之前修改。:o l d具有只读属性,只能读入。
n e w和: o l d只在行级触发器内部合法。如果企图引用在语句级触发器之内的: n e w
或: o l d的话,编译器将报错。由于语句级的触发器只运行一次,即使存在很多被语句处理过的行
的话,n e w和: o l d也没有定义。编译器不知道该引用那一行
 
WHEN子句
W H E N子句只适用于行级触发器。如果使用该子句的话,触发器体将只对满足由 W H E N子
句说明的条件的行执行。W H E N子句的语法是:
WHEN trigger_condition
其中,t r i g g e r _ c o n d i t i o n是逻辑表达式。该表达式将为每行求值。 : n e w和:o l d记录可以在
t r i g g e r _ c o n d i t i o n内部引用,但不需使用冒号。该冒号只在触发器体内有效。例如,触发器
C h e c k C r e d i t s的体只在当前的学生得到的学分超出2 0时才运行:
CREATE OR REPLACE TRIGGER CheckCredits
BEFORE INSERT OR UPDATE OF current_credits ON students
FOR EACH ROW
WHEN (new.current_credits > 20)
BEGIN
/* Trigger body goes here. */
END;
顺便贴上最近写触发器
 
create or replace trigger InsertOrder
  before insert on orderstate_jul  

 for each row
declare
  -- local variables here
  --地区
v_region orderstate_jul.region %TYPE;
 
begin
 
 
if :new.position != 3  then
:new.region:= v_region;
 
SELECT region
INTO v_region
FROM orderstate_jul s
WHERE s.ctxjlineid like concat(substr(:new.ctxjlineid,0,14),’%’) and s.position=’3’  [Page]
and s.time_stamp =(select max(time_stamp) from orderstate_jul r 
                        where substr(r.ctxjlineid,0,15)= substr(s.ctxjlineid,0,15)
                         and r.position = ’3’)
                         and rownum = 1;


end if;

end InsertOrder;  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值