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 ...
随机推荐
- 手把手教你实现一个Vue无限级联树形表格(增删改)
前言平时我们可能在做项目时,会遇到一个业务逻辑.实现一个无限级联树形表格,什么叫做无限级联树形表格呢?就是下图所展示的内容,有一个祖元素,然后下面可能有很多子孙元素,你可以实现添加.编辑.删除这样几个 ...
- Linux文本三剑客-sed
sed工作原理: sed: Stream Editor.流编辑器 --- 属于行编辑工具 sed和vim一样都是文本编辑工具. 行编辑工具:一行一行处理文件内容 全屏编辑工具:一次性将文件内容加载到内 ...
- 【python基础】第07回 运算符和流程控制 2
本章内容概要 1.逻辑运算符补充 2.循环结构 本章内容详解 1.逻辑运算符补充 两边都不为0的情况 or 直接取前面的值 and 直接取后面的值如果存在0的情况 and 直接取0 or 直接取非0 ...
- SpringBoot项目启动org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException解决方法
将Pom文件中的SpringBoot版本调低即可. 我的是调成了2.5.6
- 在矩池云使用Disco Diffusion生成AI艺术图
在 Disco Diffusion 官方说明的第一段,其对自身是这样定义: AI Image generating technique called CLIP-Guided Diffusion.DD ...
- jupyter 反向代理配置
抓了下包,看了一下WS连不上,参考这个,问题解决 location / { proxy_pass http://127.0.0.1:8813/; # JUPYTER_PORT 为 Jupyter 运行 ...
- python sock5代理
安装 pysocks:pip install pysocks # coding:utf-8 ''' @version: python3.6 @author: 'eric' @license: Apac ...
- [ERROR] Another process with pid 914 is using unix socket file.
mysql启动报错 1.首先到mysql的配置文件中,确定socket文件路径 vim /etc/my.cnf 2.删除mysql.sock.lock 3.启动mysql
- CodeSys中编程实现串口通讯
第一步:Linux中启用串口设备.[以树莓派4B为例] 树莓派4B有6个串口,参考上一篇<>,在 /boot/config.txt 中添加一行,开启 uart2 功能: dtoverl ...
- 基础数学知识 / Math(updating)
埃氏筛:朴素筛法求素数,o(nloglogn) int prime[N], tot; bool st[N]; // true:not prime, false:is prime void get_pr ...