警告
TimescaleDB v2.13 是最后一个包含对 PostgreSQL 13、14 和 15 版本多节点支持的版本。
分布式超表上的触发器与标准超表上的触发器工作方式大致相同,并且具有相同的限制。但由于数据分布在多个节点上,因此存在一些差异
- 行级触发器在插入该行的数据节点上触发。触发器必须在数据存储的位置触发,因为 `BEFORE` 和 `AFTER` 行触发器需要访问存储的数据。访问节点上的 chunk 不包含任何数据,因此它们没有触发器。
- 语句级触发器在每个受影响的节点上触发一次,包括访问节点。例如,如果一个分布式超表包含 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 上编辑此页面
。