pl/sql操作数据库之触发器的使用

这篇文章讲述的是pl/sql操作数据库之触发器的使用,如有错误或不当之处,还望各位大神批评指正。

什么是触发器?

  • 触发器是许多关系数据库系统都提供的一项技术。在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。

触发器的类型

触发器在数据库里以独立的对象存储,它与存储过程不同的是,存储过程通过其它程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。所以运行触发器就叫触发或点火(firing)。ORACLE事件指的是对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作。ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。

  • DML触发器:ORACLE可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。
  • 替代触发器:由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。它就是ORACLE 8专门为进行视图操作的一种处理方法。
  • 系统触发器:ORACLE 8i 提供了第三种类型的触发器叫系统触发器。它可以在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。

  • 触发器的组成:

    1. 触发事件:即在何种情况下触发TRIGGER; 例如:INSERT, UPDATE, DELETE。
    2. 触发时间:即该TRIGGER 是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER 的操作顺序。
    3. 触发器本身:即该TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。 例如:PL/SQL 块。
    4. 触发频率:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。
      语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次;
      行级(ROW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。

触发器的创建

  • 触发器创建的格式

  • 可选项:BEFORE | AFTER | INSTEAD OF
    触发事件:是在之前(before)还是在之后(after)还是只激活触发器而不出发事件。

注:INSTEAD OF 选项使ORACLE激活触发器,而不执行触发事件。只能对视图和对象视图建立INSTEAD OF触发器,而不能对表、模式和数据库建立INSTEAD OF 触发器。

  • 可选项:INSERT | DELETE | UPDATE [OF column [, column …]]指的是出发事件,即什么操作下激活触发器。
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF}
{INSERT | DELETE | UPDATE [OF column [, column …]]}
ON {[schema.] table_name | [schema.] view_name}
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
trigger_body;
  • 例1:创建行级触发器,在更新学生信息后打印helloworld
--创建触发器
create or replace trigger update_std_trigger
--在什么时候触发
after update 
--触发事件
on student
--触发器频率若为空则是语句级
for each row 
--触发器本体
begin 
  dbms_output.put_line('更新学生触发器');
end ;

这样在更新学生时就会打印‘更新学生触发器’

  • old和new
    当触发器被触发时,要使用被插入、更新或删除的记录中的列值,有时要使用操作前、 后列的值,:old表示操作前的值,:new表示操作后的值

  • 例2:创建触发器在更新学生,年龄加一时输出更新前的年龄和更新后的年龄

--创建触发器
create or replace trigger update_std_trigger2
--在什么时候触发
after update 
--触发事件
on student
--触发器频率若为空则是语句级
for each row 
--触发器本体
begin 
  dbms_output.put_line('更新前年龄:'||:old.age||' 更新后年龄:'||:new.age);
end ;

触发器的执行次序

  1. 执行 BEFORE语句级触发器;
  2. 对与受语句影响的每一行:
    • 执行 BEFORE行级触发器
    • 执行 DML语句
    • 执行 AFTER行级触发器
  3. 执行 AFTER语句级触发器

删除、打开、关闭触发器

  • 删除触发器
DROP TRIGGER trigger_name;
  • 关闭触发器
ALTER TIGGER trigger_name DISABLE;
  • 打开触发器
ALTER TIGGER trigger_name ENABLE ;

猜你喜欢

转载自blog.csdn.net/u013634252/article/details/80856096