oracle触发器

触发器:当特定时间出现时,自动执行的代码块。是对数据进行监控的一个对象。

触发器的使用场景:

 触发器的致命缺陷就是性能低下,不建议大量使用触发器

触发器的语法:

CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF}
{INSERT |DELETE | UPDATE | [OF 字段[,字段]。。。]}
[OR {INSERT | DELETE | UPDATE [OF 字段[,字段]。。。]}]
ON [用户名.]表视图名
[REFERENCING [NEW AS 新行名称 ] [OLD AS 旧行名称] ]
[FOR EACH ROW]
[WHEN (条件)]
DECLARE
--声明
BEGIN
--sql代码
EXCEPTION
--异常处理
END [trigger_name];


BEFORE | AFTER --表示在事件之前还是之后激活触发器
INSTEAD OF --如果使用此自句,表示可以由触发器代码来替代激活触发器的事件
INSERT |DELETE | UPDATE | [OF 字段[,字段]。。。]
--表示指定构成触发器事件的操作类型,update还可以指定列的列表
REFERENCING --指定新行(更新后)的别名,旧行(更新后)的别称,默认为new 和 old
ON [用户名.]表名 --要创建触发器的表或者视图的名称。
FOR EACH ROW --指定是否对受影响的每个行都执行触发器,即行级触发器,
--不使用此句子表示语句级触发器
WHEN (条件) --限制执行触发器的条件

 ------------------------------------示例一,创建触发器(行级)--------------------   

如果职位不是部门经理,就把新增或者更改的员工的经理指定为员工id为2的经理

(如果要通过触发器在插入行中设置新值,必须使用 before instead 访问新值,否则不允许设置新值。如示例)

CREATE OR REPLACE TRIGGER trig_emp
BEFORE INSERT OR UPDATE OF position
ON employees
FOR EACH ROW
WHEN (new.position<>5)
  BEGIN
    :new.manager_id := 2;
    END trig_emp;

触发器分为三个部分:触发器语句,触发器限制,触发器操作

     触发器语句:是那些所有可以导致触发器的事件。即在表或者视图上执行dml语句,在模式对象上执行的ddl语句或者数据库事件。

     触发器限制:触发器限制条件包含一个布尔表达式,,该值为真时才能激活触发器。

     触发器操作:是触发器的主体,,包含一些sql语句和代码,在触发器限制条件为真时运行。行级触发器允许触发操作中的语句访问行的列值。

触发器的类型:

     行级触发器,语句触发器 (合称为dml触发器)

            语句触发器是指一个dml语句触发一个操作。oracle主要掌握

     instead of 触发器 , 模式触发器 , 数据库触发器

            instead of 触发器主要是在视图上定义的触发器。

            模式触发器   也就是用户事务触发器。

            数据库触发器 是指创建在数据库事件上的触发器

      行级触发器:对dml语句影响的每一行执行一次。

--------------示例二,行级触发器和使用序列自动生成id----

 先创建序列xulei

CREATE OR REPLACE TRIGGER trig_new_test
BEFORE  INSERT ON new_test
FOR EACH ROW
  BEGIN 
    SELECT xulei INTO :new.id FOR dual;
    END trig_new_test;
原文地址:https://www.cnblogs.com/hjiongjiong/p/4232226.html