用户在使用trigger时,经常会面临before or after的选择问题。二者有什么区别?从字面理解,before trigger 是在触发操作完成之前完成,而after 是在触发操作完成之后完成。显然,before触发器(针对insert和update操作)可以修改NEW的值。如果需要修改NEW值的时候,就使用before,其余场景一律使用after。

一、例子:所有trigger都可取到OLD 和 NEW值

create table t1(id integer,name varchar);
create table t2(id integer,name varchar); create or replace trigger test_tri_before
before update on t1 for each row
begin
raise notice 'before trigger, old value %, new value %' , coalesce(OLD.id,0) , coalesce(NEW.id,0);
end;
/ create or replace trigger test_tri_after
after update on t1 for each row
begin
raise notice 'after trigger, old value %, new value %' , coalesce(OLD.id,0) , coalesce(NEW.id,0);
end;
/ test=# update t1 set id=2 where id=1;
NOTICE: before trigger, old value 1, new value 2
NOTICE: after trigger, old value 1, new value 2
UPDATE 1
test=#

测试结果:不管是before or after,都可以取得 old and new 值。

二、例子:before可以修改 new值

create or replace trigger test_tri_before
before insert on t1 for each row
begin
if NEW.name = 'a' then
NEW.name = 'b';
end if;
end;
/ test=# insert into t1 values(1,'a');
INSERT 0 1
test=# select * from t1;
id | name
----+------
1 | b
(1 row)

可以看到,在insert 之前,将name 值修改为 ‘b’

三、例子:暂不支持自治事务

CREATE OR REPLACE  FUNCTION test_tri_pragma RETURNS trigger
AS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
insert into t2 values(NEW.id,NEW.name);
commit;
END
/ create trigger test_tri_pragma before insert on t1 for each row execute procedure test_tri_pragma(); test=# insert into t1 values(1,'a');
ERROR: invalid transaction termination
CONTEXT: PL/SQL function test_tri_pragma() line 5 at COMMIT

KingbaseES 目前只对 procedure 和 function 支持自治事务,对于trigger 暂不支持,后续应该会支持自治事务。

Trigger Before 与 After 区别的更多相关文章

  1. trigger和triggerhandler的区别

    1. trigger会触发默认行为2. trigger会触发所有元素的模拟事件,而triggerHandler只触发一次3. trigger可以链式操作,triggerHandler不能4. trig ...

  2. jQuery triger与trigerHandler的区别

    trigger(event, [data]) 与 triggerHandler(event, [data]) 都是用于触发一个事件. 其两者的区别在于,如果触发的事件是有浏览器默认行为的,trigge ...

  3. FireFox下上传控件的显示问题

    Chrome正常 FireFox显示不正常 上传控件一直有个问题,就是样式问题,解决方法就是用一个大的背景层挡住,然后点大的背景层去触发上传控件的Click事件. Html: <span id= ...

  4. jquery远程班备忘

    基础第一课: 1. $(obj)获取的是一个集合,因此length最小是1, jquery,如果元素不存在,也不会报错,可通过$(obj).length<1就可以查看该元素是否存在. 2. at ...

  5. 编码器芯片MLX90363的使用

    文档资料 MLX90363 Datasheet MLX90363 Application Note 使用 对于编码器来说,Rotary Application模式 SPI驱动中,CS必须在8个字节都发 ...

  6. 【持续更新】JavaScript常见面试题整理

    [重点提前说]这篇博客里的问题涉及到了了JS中常见的的基础知识点,也是面试中常见的一些问题,建议初入职场的园友Mark收藏,本文会持续更新~ 1. 引入JS的三种方式 1.在HTML标签中直接使用,直 ...

  7. Jquery的方法(二)

    一.文档操作1.html()和text()的区别 <div id="J_div"><b><i>我是谁</i></b>&l ...

  8. jQuery的event事件

    1.冒泡和默认行为 <div class="aa"> <div class="bb"> <div class="cc&q ...

  9. Unity面试问题归总

    Unity面试问题归总 C#中Struct和Class的区别 Struct是Class的一种 A*寻路 https://blog.csdn.net/windcao/article/details/15 ...

随机推荐

  1. c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比

    c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比对比 在6.22 号发布了 c# sqlsugar,his ...

  2. Lydon 分解与最小表示法

    我们定义一个串是 \(\text{Lyndon}\) 串,当且仅当这个串的最小后缀就是这个串本身. 该命题等价于这个串是它的所有循环表示中字典序最小的. 引理 1:如果 \(u\) 和 \(v\) 都 ...

  3. 重磅硬核 | 一文聊透对象在 JVM 中的内存布局,以及内存对齐和压缩指针的原理及应用

    欢迎关注公众号:bin的技术小屋 大家好,我是bin,又到了每周我们见面的时刻了,我的公众号在1月10号那天发布了第一篇文章<从内核角度看IO模型的演变>,在这篇文章中我们通过图解的方式以 ...

  4. java的类

    public class demo01 { public static void main(String[] args) { //类名可用中文也可用英文,但是不建议用中文 String 王者荣耀=&q ...

  5. 近期碰到的一些面试题--WPF、C#、数据库

    最近想换工作的念头特别强烈,面了几家公司没有拿到满意的offer,心仪的公司面完锁HC,有点无奈,感觉今年有点卷,把碰到过的面试题总结下. WPF相关: 1.定义依赖属性需要注意哪些地方? (1)依赖 ...

  6. e.printStackTrace() 原理的分析

    e.printStackTrace(); 先查看下源码 如图片中1所示,使用的是 PrintStreamOrWriter public void printStackTrace() { printSt ...

  7. C++多文件源程序

    一.多文件结构的源代码组织 一个C++程序开发工程(project)可以包含多个源程序文件,一个源程序文件(.cpp)可以包含多个函数.一个函数只能集中放在一个源程序文件中,不能将其定义代码拆开存放在 ...

  8. 类型转换_float()函数

    float()函数不能将文字类的字符串类型转换成小数类型 同时将整数转换成浮点数类型的时候会在整数后买你加上.0 print(float(1))//output:1.0 print(float('1' ...

  9. Go语言基础一:环境配置与基础语法

    配置开发环境 开始使用Go,首先需要一个完善的开发环境. 下载并安装Go 安装包的下载地址为:https://golang.org/dl/ go语言中文社区下载:https://studygolang ...

  10. YII学习总结2(命名空间和操作响应)

    YII基础准备1.命名空间<?php /****假设有三个同名的类,输出的值为A,B,C****/ use a\b\c\apple; use d\e\f\apple as bApple; use ...