pl/sql操作数据库之触发器的使用-阿里云开发者社区

开发者社区> 优惠券活动> 正文

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 ;

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MySQL 基础---数据操作
数据的操作(CRUD): 插入数据记录(CREATE) 查询数据记录(READ) 更新数据记录(UPDATE) 删除数据记录(DELETE) 插入数据记录("INSERT INTO") 插入数据: 插入完整数据记录、插入数据记录一部分、插入多条数据记录、插入查询结果。
499 0
thinkphp对数据库操作有哪些内置函数
原文:thinkphp对数据库操作有哪些内置函数 getModelName() 获取当前Model的名称 getTableName() 获取当前Model的数据表名称 switchModel(type,vars=array()) 动态切换模型 table() 设置当前操作的数据表 field...
934 0
使用 Math 类操作数据
使用 Math 类操作数据 Math 类位于 java.lang 包中,包含用于执行基本数学运算的方法, Math 类的所有方法都是静态方法,所以使用该类中的方法时,可以直接使用类名.
573 0
MySql数据库批量备份命令
rd d:\mysql_data-BAK /s /qmd d:\mysql_data-BAKxcopy d:\mysql_data d:\mysql_data-BAK /e
658 0
使用iOS原生sqlite3框架对sqlite数据库进行操作(二)
使用iOS原生sqlite3框架对sqlite数据库进行操作
44 0
Node.js使用mongodb操作MongoDB数据库
Node.js使用mongodb操作MongoDB数据库
35 0
python3使用Lxml库操作XPath
download address: http://pypi.python.org/pypi/lxml/2.3 lxml is a Pythonic, mature binding for the libxml2 and libxslt libraries.
854 0
+关注
优惠券活动
阿里云优惠码阿里云推荐券bieryun.com
387
文章
9
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载