oracle 触发器

一 Oracle触发器语法

触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,触发器与存储过程 的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。

功能:

1、 允许/限制对表的修改

2、 自动生成派生列,比如自增字段

3、 强制数据一致性

4、 提供审计和日志记录

5、 防止无效的事务处理

6、 启用复杂的业务逻辑

触发器触发时间有两种:after和before。

1、触发器的语法:

CREATE [OR REPLACE] TIGGER触发器名 触发时间 触发事件

ON表名

[FOR EACH ROW]

BEGIN

pl/sql语句

END

其中:

触发器名:触发器对象的名称。

由于触发器是自动执行的,因此该名称只是一个名称,没有实质的用途。

触发时间:指明触发器何时执行,该值可取:

before---表示在数据库动作之前触发器执行;

after---表示在数据库动作之后出发器执行。

触发事件:指明哪些数据库动作会触发此触发 器:                        

insert:数据库插入会触发此触发器;


< src="http://ad.ccw.com.cn/adshow.asp?positionID=35&js=1&innerJs=1">
Oracle触发器语法 (二)

update:修改会触发此触发器;


delete:数据库删除会触发此触发器。

表 名:数据库触发器所在的表。

for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。

2、举例:

下面的触发器在更新表auths之前触发,目的是不允许在周末修改表:


      create triggerauth_secure before insert or update or delete // 对整表更新前触发
on auths

begin

if(to_char(sysdate,'DY')='SUN'

RAISE_APPLICATION_ERROR(-20600,' 不能在周末修改表auths');

end if;

end

二:Oracle 通过触发器级联更新 .

  create or replace trigger t1_update_cascade
  2  after update on t1
  3  for each row
  4  begin
  5  if :old.a<>:new.a then
  6  update t2 set a=:new.a where a=:old.a;
  7  end if;
  8  end;
  9  /

三:编写触发器时,需要注意以下几点:

l         触发器不接受参数。

l         一个表上最多可有12个触发器,但同一时间、同一事件、同一类型的触发器只能有一个。并各触发器之间不能有矛盾。

l         在一个表上的触发器越多,对在该表上的DML操作的性能影响就越大。

l        触发器最大为32KB。若确实需要,可以先建立过程,然后在触发器中用CALL语句进行调用。

l         在触发器的执行部分只能用DML语句(SELECT、INSERT、UPDATE、DELETE),不能使用DDL语句(CREATE、ALTER、DROP)。

l         触发器中不能包含事务控制语句(COMMIT,ROLLBACK,SAVEPOINT)。因为触发器是触发语句的一部分,触发语句被提交、回退时,触发器也被提交、回退了。

l         在触发器主体中调用的任何过程、函数,都不能使用事务控制语句。

l         在触发器主体中不能申明任何Long和blob变量。新值new和旧值old也不能向表中的任何long和blob列。

l         不同类型的触发器(如DML触发器、INSTEAD OF触发器、系统触发器)的语法格式和作用有较大区别。

 

四:实际使用触发器:

 CREATE OR REPLACE TRIGGER "GIORZIO"."OA_TO_BI" after update on users
for each row
begin
   if :old.passwordhash<>:new.passwordhash then
   update bbi_users set password=:new.passwordhash where usid=:old.id;
   end if;
end;

 

你可能感兴趣的:(oracle 触发器)