用户在使用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. Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)

    在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...

  2. Python 用configparser读写ini文件

    一.configparser 简介Python用于读写ini文件的一个官方标准库.具体详见官网链接 二.configparser 部分方法介绍 方法 描述 read(filenames) filesn ...

  3. Thread类的常用方法_获取线程名称的方法和设置线程名称的方法

    Thread类的常用方法 获取线程的名称: 1.使用Thread类中的方法getName() String getName() 返回该线程的名称 2.可以先获取到当前正在执行的线程,使用线程中的方法g ...

  4. 最佳实践 | 疫情之下,了解 eolink 如何助力远程办公!

    新冠疫情肆虐,eolink 结合自身长期的远程研发协作经验,为企业推出 API 管理远程协作指南,以下方案不仅在 Eolinker 内部,也在众多客户中得到验证,希望能够帮助您快速了解如何将 API ...

  5. day03 Java_运算符_分支结构

    列表: 运算符的练习:算术.关系.逻辑.赋值.字符串连接.条件 分支结构的练习:if结构 分支结构的练习:if...else结构 参考 运算符的练习:算术 输出几个整数取模,验证结果 声明两个整型变量 ...

  6. 一张图进阶 RocketMQ - 消息存储

    前言 三此君看了好几本书,看了很多遍源码整理的 一张图进阶 RocketMQ 图片,关于 RocketMQ 你只需要记住这张图!觉得不错的话,记得点赞关注哦. [重要]视频在 B 站同步更新,欢迎围观 ...

  7. 【黄啊码】MySQL入门—3、我用select *,老板直接赶我坐火车回家去,买的还是站票

    大家好!我是黄啊码,学会了DDL语句了吗?那我们今天就来学习一下基本的查询语法,我见过很多外包机构的程序员都是万物皆可select *,然后项目跑了一段时间就基本跑不动了,问就回答:服务器配置不够,加 ...

  8. MyBatis-Plus联表查询的短板,终于有一款工具补齐了

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. mybatis-plus作为mybatis的增强工具,它的出现极大的简化了开发中的数据库操作,但是长久以来,它的 ...

  9. linux学习随笔2之防火墙

    centos7默认使用的防火墙是firewalld 查看所有打开的端口: firewall-cmd --zone=public --list-ports 更新防火墙规则: firewall-cmd - ...

  10. 你的工具包已到货「GitHub 热点速览 v.22.31」

    如果你经常用 shell 记得看看本周特推里的 gum,它能给你的 shell 增加新趣味.除了这个 shell kit,我们还有 dashboard kit--tabler,功能技能 kit eng ...