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

简介:

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 例1:创建行级触发器,在更新学生信息后打印helloworld
--创建触发器
create or replace trigger update_std_trigger
--在什么时候触发
after update 
--触发事件
on student
--触发器频率若为空则是语句级
for each row 
--触发器本体
begin 
  dbms_output.put_line('更新学生触发器');
end ;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

  • 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

触发器的执行次序

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

删除、打开、关闭触发器

  • 删除触发器
DROP TRIGGER trigger_name;
  • 1
  • 关闭触发器
ALTER TIGGER trigger_name DISABLE;
  • 1
  • 打开触发器
ALTER TIGGER trigger_name ENABLE ;
相关文章
|
27天前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之数据查询
【数据库SQL server】关系数据库标准语言SQL之数据查询
46 0
|
27天前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之视图
【数据库SQL server】关系数据库标准语言SQL之视图
36 0
|
10天前
|
SQL 存储 关系型数据库
sql数据库的相关概念与底层介绍
sql数据库的相关概念与底层介绍
31 0
|
21天前
|
存储 SQL 数据库连接
连接并操作数据库:Python 数据库案例
数据库是一种用于存储和管理数据的工具,它以一种有组织的方式将数据存储在文件或内存中,以便于检索和处理。数据库系统通常使用 SQL(Structured Query Language)语言来进行数据的操作,包括数据的插入、查询、更新和删除等。
|
21天前
|
前端开发 数据库连接 数据库
ASP.NETMVC数据库完整CRUD操作示例
ASP.NETMVC数据库完整CRUD操作示例
20 0
|
26天前
|
SQL 人工智能 运维
数据库基础入门 — SQL排序与分页
数据库基础入门 — SQL排序与分页
16 0
|
26天前
|
SQL 人工智能 运维
数据库基础入门 — SQL运算符
数据库基础入门 — SQL运算符
15 0
|
26天前
|
SQL 人工智能 运维
数据库基础入门 — SQL
数据库基础入门 — SQL
26 0
|
27天前
|
SQL 存储 数据库
【数据库SQL server】自学终极笔记
【数据库SQL server】自学终极笔记
75 0
|
27天前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之数据更新
【数据库SQL server】关系数据库标准语言SQL之数据更新
22 0

热门文章

最新文章