oracle dml触发器写法,Oracle基础知识(五) - 触发器的分类:DML触发器

参考网址:http://hi.baidu.com/bystander1983/item/f065c00cbe25508d03ce1b3b,原文稍微乱一些,感谢原作者的分享。

1. 触发器的分类

DML触发器

DDL触发器

系统触发器

替代触发器

2. 触发器的执行顺序

1. 如果存在语句级BEFORE触发器,则先执行一次语句级BEFORE触发器。

2. 在SQL语句的执行过程中,如果存在行级BEFORE触发器,则SQL语句在对每一行操作之前,都要先执行一次行级BEFORE触发器,然后才对行进行操作。

如果存在行级AFTER触发器,则SQL语句在对每一行操作之后,都要再执行一次行级AFTER触发器。

3. 如果存在语句级AFTER触发器,则在SQL语句执行完毕后,要最后执行一次语句级AFTER触发器。

3. 行级触发器与表级触发器(语句触发器)

行级触发器对DML语句影响的每个行执行一次;

语句级触发器对每个DML语句执行一次,如果在TABLE表中插入的数据为500行,那么这个表上的语句级触发器只执行一次,而行级的触发器就要执行500次了。

若在触发器定义中出现FOR EACH ROW子句,则为行级触发器,否则为表级触发器(语句触发器).

4. DML触发器

DML触发器是定义在表上的触发器,有DML事件引发。

4.1 DML事件(3种)

INSERT 在表或视图中插入数据时触发

UPDATE 修改表或视图中的数据时触发

DELETE 在删除表或视图中的数据时触发

4.2 编写DML触发器的要素

确定触发的表,即在其上定义触发器的表

确定触发的事件,DML触发器的触发事件有INSERT、UPDATE和DELETE三种

确定触发时间。触发的时间有BEFORE和AFTER两种,分别表示触发动作发生在DML语句执行之前和语句执行之后

确定触发级别,有语句级触发器和行级触发器两种。语句级触发器表示SQL语句只触发一次触发器,行级触发器表示SQL语句影响的每一行都要触发一次

4.3 相关问题备注

1. 如果有多个触发器被定义成为相同时间、相同事件触发,且最后定义的触发器是有效的,则最后定义的触发器被触发,其他触发器不执行。

2. 一个触发器可由多个不同的DML操作触发。在触发器中,可用INSERTING、DELETING、UPDATING谓词来区别不同的DML操作。

这些谓词可以在IF分支条件语句中作为判断条件来使用。

3. 在行级触发器中,用:new 和:old(称为伪记录)来访问数据变更前后的值。

但要注意,INSERT语句插入一条新记录,所以没有:old记录,而DELETE语句删除掉一条已经存在的记录,所以没有:new记录。

UPDATE语句既有:old记录,也有:new记录,分别代表修改前后的记录。

引用具体的某一列的值的方法是: :old.字段名或:new.字段名。

触发器体内禁止使用COMMIT、ROLLBACK、SAVEPOINT语句,也禁止直接或间接地调用含有上述语句的存储过程。

4.4 创建触发器

CREATE [OR REPLACE] TRIGGER 触发器名

{BEFORE|AFTER|INSTEAD OF} 触发事件1 [OR 触发事件2...]

ON 表名

WHEN 触发条件

[FOR EACH ROW]

DECLARE

声明部分

BEGIN

主体部分

END;

其中:

OR REPLACE:表示如果存在同名触发器,则覆盖原有同名触发器。

BEFORE、AFTER和INSTEAD OF:说明触发器的类型。

WHEN 触发条件:表示当该条件满足时,触发器才能执行。

触发事件:指INSERT、DELETE或UPDATE事件,事件可以并行出现,中间用OR连接。

对于UPDATE事件,还可以用以下形式表示对某些列的修改会引起触发器的动作:

UPDATE OF 列名1,列名2...

ON 表名:表示为哪一个表创建触发器。

FOR EACH ROW:表示触发器为行级触发器,省略则为语句级触发器。

示例:

表:

很简单,只有一个ID,一个NAME

create table T_YGY_DEMO_BOOK2

(

ID NUMBER(11) not null,

NAME VARCHAR2(100) not null

)

a4be0dd0dccf5fff3ce908e03ec5a0e5.png

1. 对表T_YGY_DEMO_BOOK2进行INSERT,UPDATE,DELETE操作时,输出相应的记录。

CREATE OR REPLACE TRIGGER TRI_YGY_BOOK2_LOG

BEFORE INSERT OR UPDATE OR DELETE

ON T_YGY_DEMO_BOOK2

BEGIN

IF INSERTING THEN DBMS_OUTPUT.put_line('触发器日志:要添加一条记录');

ELSIF UPDATING THEN DBMS_OUTPUT.put_line('触发器日志:要修改一条记录');

ELSIF DELETING THEN DBMS_OUTPUT.put_line('触发器日志:要删除一条记录');

END IF;

END;

/

2. 对表T_YGY_DEMO_BOOK2进行更新操作时,判断ID是否大于5000,并输出不同的记录

CREATE OR REPLACE TRIGGER TRI_YGY_BOOK2_VALUE

BEFORE UPDATE

ON T_YGY_DEMO_BOOK2

FOR EACH ROW

BEGIN

IF :OLD.ID>5000 THEN DBMS_OUTPUT.put_line('触发器日志:要更新的id大于5000.');

ELSE DBMS_OUTPUT.put_line('触发器日志:要更新的id小于5000');

END IF;

END;

/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当涉及到Oracle数据库触发器时,以下是一些基础知识: 1. 触发器的定义:触发器是一种数据库对象,它与表相关联,并在表上的特定操作(如插入、更新或删除)发生时自动触发。 2. 触发器的类型:Oracle数据库支持三种类型的触发器:BEFORE触发器、AFTER触发器和INSTEAD OF触发器。 - BEFORE触发器:在触发操作执行之前触发。 - AFTER触发器:在触发操作执行之后触发。 - INSTEAD OF触发器:用于替代DML语句(如INSERT、UPDATE或DELETE),在执行操作之前触发。 3. 触发器的事件:触发器可以与一种或多种事件相关联,包括INSERT(插入)、UPDATE(更新)和DELETE(删除)。 4. 触发器的创建语法:创建触发器时,需要指定触发器的名称、关联的表、触发事件和触发时机(BEFORE或AFTER),并定义触发时要执行的逻辑。 ```sql CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name [FOR EACH ROW] [WHEN (condition)] BEGIN -- 触发时要执行的逻辑 END; ``` 5. 触发器中的NEW和OLD:在触发器的逻辑中,可以使用NEW和OLD关键字来引用新旧值。NEW代表触发操作后的新值,而OLD代表触发操作前的旧值。 ```sql :NEW.column_name -- 新值 :OLD.column_name -- 旧值 ``` 6. 触发器的管理:可以使用ALTER TRIGGER语句来修改触发器定义,使用DROP TRIGGER语句来删除触发器。 以上是Oracle触发器的一些基础知识,希望对你有所帮助。如果你有任何其他问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值