Trigger Before 与 After 区别
用户在使用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 区别的更多相关文章
- trigger和triggerhandler的区别
1. trigger会触发默认行为2. trigger会触发所有元素的模拟事件,而triggerHandler只触发一次3. trigger可以链式操作,triggerHandler不能4. trig ...
- jQuery triger与trigerHandler的区别
trigger(event, [data]) 与 triggerHandler(event, [data]) 都是用于触发一个事件. 其两者的区别在于,如果触发的事件是有浏览器默认行为的,trigge ...
- FireFox下上传控件的显示问题
Chrome正常 FireFox显示不正常 上传控件一直有个问题,就是样式问题,解决方法就是用一个大的背景层挡住,然后点大的背景层去触发上传控件的Click事件. Html: <span id= ...
- jquery远程班备忘
基础第一课: 1. $(obj)获取的是一个集合,因此length最小是1, jquery,如果元素不存在,也不会报错,可通过$(obj).length<1就可以查看该元素是否存在. 2. at ...
- 编码器芯片MLX90363的使用
文档资料 MLX90363 Datasheet MLX90363 Application Note 使用 对于编码器来说,Rotary Application模式 SPI驱动中,CS必须在8个字节都发 ...
- 【持续更新】JavaScript常见面试题整理
[重点提前说]这篇博客里的问题涉及到了了JS中常见的的基础知识点,也是面试中常见的一些问题,建议初入职场的园友Mark收藏,本文会持续更新~ 1. 引入JS的三种方式 1.在HTML标签中直接使用,直 ...
- Jquery的方法(二)
一.文档操作1.html()和text()的区别 <div id="J_div"><b><i>我是谁</i></b>&l ...
- jQuery的event事件
1.冒泡和默认行为 <div class="aa"> <div class="bb"> <div class="cc&q ...
- Unity面试问题归总
Unity面试问题归总 C#中Struct和Class的区别 Struct是Class的一种 A*寻路 https://blog.csdn.net/windcao/article/details/15 ...
随机推荐
- django--ORM表的多对一关系
多对一关系是什么 Django使用django.db.models.ForeignKey定义多对一关系. ForeignKey需要一个位置参数:与该模型关联的类 class Info(models. ...
- 在linux上配置Maven环境变量
1.首先下载maven ,这里我使用的是3.8.1 Maven – Download Apache Maven 2.在linux环境中,将maven上传至 /usr/local/目录中 这里我将mav ...
- Java 图片生成PDF
public static void main(String[] args) { String imageFolderPath = "E:\\Tencet\\图片\\test\\" ...
- Golang并发编程——goroutine、channel、sync
并发与并行 并发和并行是有区别的,并发不等于并行. 并发 两个或多个事件在同一时间不同时间间隔发生.对应在Go中,就是指多个 goroutine 在单个CPU上的交替运行. 并行 两个或者多个事件在同 ...
- 这么强?!Erda MySQL Migrator:持续集成的数据库版本控制
为什么要进行数据库版本控制? 现代软件工程逐渐向持续集成.持续交付演进,软件一次性交付了事的场景逐渐无法满足复杂多变的业务需求,"如何高效地进行软件版本控制"成为我们面临的挑战.同 ...
- 基于yarn1.x的monorepo实践分享
背景介绍 几天前,晓东船长微信问我,你们团队有没有monorepo的实践,我很遗憾的告诉他没有,但这在我心里播下了一颗探索的种子,刚好最近老总要搞内蒙古的新项目,我和另一个前端兄弟组成双枪敢死队进行保 ...
- Neo4j应用
CQL函数 1. 字符串函数 功能 描述 UPPER 将所有字母改为大写 LOWER 将所有字母改为小写 SUBSTRING 将获取指定范围的子字符串 REPLACE 替换一个字符串的子字符串 mat ...
- Java的学习日常
当2020年10月进入大学,我选择了计算机专业,本想着自己会摒弃高中的不良习惯,认真学习.但随着和同学们的熟悉,自己的本性也逐渐暴露出来.两年懒散表现,让现在回过头的自己都不忍直视. 虽然在学习期间, ...
- 建立二叉树的二叉链表(严6.65)--------西工大noj
需要注意的点:在创建二叉树的函数中,如果len1==len2==0,一定要把(*T)置为NULL然后退出循环 #include <stdio.h> #include <stdlib. ...
- C# 基础知识-特性
C基础 - 特性 一.特性 1>特性本质就是一个类,直接或者间接的继承了Attribute 2>特性就是在不破话类封装的前提下,加点额外的信息或者行为 特性添加后,编译会在元素内部产生IL ...