警告
TimescaleDB v2.13 是最后一个包含对 PostgreSQL 版本 13、14 和 15 的多节点支持的版本。
分布式超表上的触发器与标准超表上的触发器工作方式大致相同,并且具有相同的限制。但是,由于数据分布在多个节点上,因此存在一些差异
- 行级触发器在插入行的数据节点上触发。触发器必须在数据存储的位置触发,因为
BEFORE
和AFTER
行触发器需要访问存储的数据。访问节点上的数据块不包含任何数据,因此它们没有触发器。 - 语句级触发器在每个受影响的节点(包括访问节点)上触发一次。例如,如果分布式超表包含 3 个数据节点,则插入 2 行数据会在访问节点以及 1 个或 2 个数据节点上执行语句级触发器,具体取决于行是否转到相同或不同的节点。
- 大于 1 的复制因子还会导致触发器在多个节点上触发。每个副本节点都会触发触发器。
通常,使用 CREATE TRIGGER
在分布式超表上创建触发器。触发器及其执行的函数会在每个数据节点上自动创建。如果触发器函数引用任何其他函数或对象,则在创建触发器之前,它们需要存在于所有节点上。
如果您的触发器需要引用另一个函数或对象,请使用
distributed_exec
在所有节点上创建函数或对象。在访问节点上创建触发器函数。此示例创建一个虚拟触发器,该触发器引发通知“trigger fired”
CREATE OR REPLACE FUNCTION my_trigger_func()RETURNS TRIGGER LANGUAGE PLPGSQL AS$BODY$BEGINRAISE NOTICE 'trigger fired';RETURN NEW;END$BODY$;在访问节点上创建触发器本身。此示例使触发器在每次将行插入到超表
hyper
时触发。请注意,您无需手动在数据节点上创建触发器。这是自动为您完成的。CREATE TRIGGER my_triggerAFTER INSERT ON hyperFOR EACH ROWEXECUTE FUNCTION my_trigger_func();
如果您有语句级触发器或复制因子大于 1,则触发器会多次触发。为避免重复触发,您可以设置触发器函数以检查它正在哪个数据节点上执行。
例如,编写一个触发器函数,该函数在访问节点上引发与数据节点上不同的通知
CREATE OR REPLACE FUNCTION my_trigger_func()RETURNS TRIGGER LANGUAGE PLPGSQL AS$BODY$DECLAREis_access_node boolean;BEGINSELECT is_distributed INTO is_access_nodeFROM timescaledb_information.hypertablesWHERE hypertable_name = <TABLE_NAME>AND hypertable_schema = <TABLE_SCHEMA>;IF is_access_node THENRAISE NOTICE 'trigger fired on the access node';ELSERAISE NOTICE 'trigger fired on a data node';END IF;RETURN NEW;END$BODY$;
关键词
在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页。