云数据库 GAUSSDB-CREATE TRIGGER:注意事项

时间:2024-12-13 17:15:46

注意事项

  • 当前仅支持在普通行存表上创建触发器,不支持在临时表、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动作。

    AFTER触发器函数返回值无影响。

  • BEFORE DELETE的情况下,触发器函数返回值NEW等于NULL。BEFORE INSERT的情况下,触发器函数返回值OLD等于NULL。BEFORE UPDATE的情况下,触发器函数返回值只有显示为NULL才是NULL值。
  • 对于event为INSERT/UPDATE的触发器函数,正常返回值是NEW。如果返回一个非NULL的行,将修改插入或者更新的行。对于event为DELETE的触发器函数,正常返回值是OLD。
  • INSTEAD OF触发器只能作用于视图,其触发器函数同样可以返回NULL值,表示随后的触发器将不再执行。

support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0573.html