当前位置:网站首页>GBase 8c触发器(三)
GBase 8c触发器(三)
2022-07-03 02:18:00 【大壮十二】
一个触发器定义也能指定一个布尔的WHEN条件,它将被测试来看该触发器是否应该被触发。在行级触发器中,WHEN条件可以检查该行的旧列值和/或新列值(语句级触发器也能有WHEN条件,但是该特性对它们不太有用)。在一个BEFORE触发器中,WHEN条件只是在该函数被或者将被执行前计算,因此使用WHEN条件与在该触发器函数的开始测试相同的条件没有本质区别。不过,在一个AFTER触发器中,WHEN条件只是在行更新发生之后被计算,并且它决定在语句的末尾一个事件是否被排队来触发该触发器。因此当一个AFTER触发器的WHEN不返回真时,在语句的末尾没有必要将一个事件进行排队,也没有必要重新取出该行。如果触发器只对少数行触发,这可以使得修改很多行的语句明显加快。INSTEAD OF触发器不支持WHEN条件。
通常,行级BEFORE被用来检查或修改即将被插入或更新的数据。例如,一个BEFORE触发器可以被用来把当前时间插入到一个timestamp列中,或者检查该行的两个元素之间是否一致。行级AFTER触发器大多数被用来将更新传播到其他表,或者针对其他表进行一致性检查。进行这种工作分工的原因是,一个AFTER触发器可以肯定它看到的是该行的最终值,而一个BEFORE触发器则不能,因为还可能有其他BEFORE触发器在它之后触发。如果你不知道让一个触发器是BEFORE或AFTER,则BEFORE形式更加有效,因为关于该操作的信息直到语句的末尾都不需要被保存。
如果一个触发器函数执行 SQL 命令,则这些命令可能会再次引发触发器。这就是所谓的级联触发器。对于级联的层数没有直接的限制。级联有可能会导致对同一个触发器的递归调用。例如,一个INSERT触发器可能执行一个向同一个表插入一个额外行的命令,这就导致该INSERT触发器被再次引发。所以在这种情形下,触发器程序员应该负责避免无限递归。
在定义一个触发器时,可以为它指定参数。在触发器定义中包括参数的目的是允许具有相似需求的不同触发器调用同一个函数。例如,可能有一个一般性的触发器函数,它需要两个列名作为参数,一个放当前用户而另一个放当前时间戳。在正确编写的情况下,这个触发器函数应该独立于它所触发的表。因此同一个函数可以被用于具有适当列的任意表上的INSERT事件,这样做的用途之一是可以自动追踪一个交易表中记录的创建。如果被定义成一个UPDATE触发器,它也可以被用来追踪最新的更新事件。
每一种支持触发器的编程语言都有自己的方法来让触发器输入数据对触发器函数可用。这种输入数据包括触发器事件的类型(如INSERT或UPDATE)以及被列在CREATE TRIGGER中的任何参数。对于一个行级触发器,输入数据还包括用于INSERT和UPDATE触发器的NEW行,和/或用于UPDATE和DELETE触发器的OLD行。
默认的,语句级触发器没有任何方法检查被语句修改的单个行。 但是AFTER STATEMENT触发器可以请求创建转换表以使受影响的行集可用于触发器。AFTER ROW触发器也可以请求转换表, 以便他们可以看到表中的全部更改以及它们当前正在触发的单个行中的更改。 再次检查转换表的方法取决于正在使用的编程语言,但典型方法是
边栏推荐
- 可视化yolov5格式数据集(labelme json文件)
- 各国Web3现状与未来
- How can retail enterprises open the second growth curve under the full link digital transformation
- Iptables layer 4 forwarding
- 4. Classes and objects
- es6 filter() 数组过滤方法总结
- [Yu Yue education] reference materials of chemical experiment safety knowledge of University of science and technology of China
- Redis: simple use of redis
- 通达OA 首页门户工作台
- Deep learning notes (constantly updating...)
猜你喜欢
Bottleneck period must see: how can testers who have worked for 3-5 years avoid detours and break through smoothly
深度学习笔记(持续更新中。。。)
[shutter] shutter debugging (debugging fallback function | debug method of viewing variables in debugging | console information)
Introduce in detail how to communicate with Huawei cloud IOT through mqtt protocol
Hard core observation 547 large neural network may be beginning to become aware?
MySQL学习03
How can retail enterprises open the second growth curve under the full link digital transformation
Solution for processing overtime orders (Overtime unpaid)
Stm32f407 ------- IIC communication protocol
Pytorch convolution network regularization dropblock
随机推荐
[Yu Yue education] China Ocean University job search OMG reference
通达OA v12流程中心
awk从入门到入土(1)awk初次会面
[shutter] hero animation (hero realizes radial animation | hero component createrecttween setting)
Wechat applet Development Tool Post net:: Err Proxy Connexion Problèmes d'agent défectueux
es6 filter() 数组过滤方法总结
The use of Flink CDC mongodb and the implementation of Flink SQL parsing complex nested JSON data in monggo
【CodeForces】CF1338A - Powered Addition【二进制】
Depth (penetration) selector:: v-deep/deep/ and > > >
[Flutter] dart: class; abstract class; factory; Class, abstract class, factory constructor
easyExcel
Restcloud ETL cross database data aggregation operation
力扣(LeetCode)183. 从不订购的客户(2022.07.02)
Machine learning process and method
Tongda OA homepage portal workbench
Coroutinecontext in kotlin
深度学习笔记(持续更新中。。。)
缺少库while loading shared libraries: libisl.so.15: cannot open shared object file: No such file
Ni visa fails after LabVIEW installs the third-party visa software
File class (check)