云数据库 GAUSSDB-CREATE TRIGGER:注意事项
时间:2025-06-03 09:33:14
注意事项
- 当前仅支持在普通行存表上创建触发器,不支持在临时表、unlogged表等类型表上创建触发器。
- 如果为同一事件定义了多个相同类型的触发器,则按触发器的名称字母顺序触发它们。
- 触发器常用于多表间数据关联同步场景,对SQL执行性能影响较大,不建议在大数据量同步及对性能要求高的场景中使用。
- 当触发器满足如下条件时,触发语句能和触发器一起下推到DN执行并提升触发器执行性能:
- GUC参数enable_trigger_shipping和enable_fast_query_shipping开启。
- 源表触发器使用的触发器函数为plpgsql类型(推荐类型)。
- 源表与触发表分布键的类型、数量完全相同,均为行存表,且所属相同的NODEGROUP。
- 原INSERT/UPDATE/DELETE语句条件中包含所有分布键与NEW/OLD等值比较表达式。
- 原INSERT/UPDATE/DELETE语句在没有触发器的情况下就能query shipping。
- 源表上只有BEFORE INSERT FOR EACH ROW、AFTER INSERT FOR EACH ROW、BEFORE UPDATE FOR EACH ROW、AFTER UPDATE FOR EACH ROW、BEFORE DELETE FOR EACH ROW、AFTER DELETE FOR EACH ROW六类触发器,且所有触发器都可下推。
- 执行触发器语句时是通过触发器创建者的身份进行权限判断的。
- 执行创建触发器操作的用户需要拥有指定表的TRIGGER权限或被授予了CREATE ANY TRIGGER权限。
- BEFORE触发的行级触发器函数可以返回一个NULL值,表示忽略对该行的操作,之后的触发器将不再执行,并且不会对该行产生INSERT/UPDATE/DELETE动作。
- BEFORE DELETE的情况下,触发器函数返回值NEW等于NULL。BEFORE INSERT的情况下,触发器函数返回值OLD等于NULL。BEFORE UPDATE的情况下,触发器函数返回值只有显示为NULL才是NULL值。
- 对于event为INSERT/UPDATE的触发器函数,正常返回值是NEW。如果返回一个非NULL的行,将修改插入或者更新的行。对于event为DELETE的触发器函数,正常返回值是OLD。
support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0573.html