警告

多节点支持已停止.

TimescaleDB v2.13 是最后一个包含对 PostgreSQL 13、14 和 15 版本多节点支持的版本。

分布式超表上的触发器与标准超表上的触发器工作方式大致相同,并且具有相同的限制。但由于数据分布在多个节点上,因此存在一些差异

  • 行级触发器在插入该行的数据节点上触发。触发器必须在数据存储的位置触发,因为 `BEFORE` 和 `AFTER` 行触发器需要访问存储的数据。访问节点上的 chunk 不包含任何数据,因此它们没有触发器。
  • 语句级触发器在每个受影响的节点上触发一次,包括访问节点。例如,如果一个分布式超表包含 3 个数据节点,插入 2 行数据会在访问节点和 1 或 2 个数据节点上执行语句级触发器,这取决于这些行是去到同一个节点还是不同的节点。
  • 大于 1 的复制因子会进一步导致触发器在多个节点上触发。每个副本节点都会触发触发器。

使用 `CREATE TRIGGER` 照常在分布式超表上创建触发器。触发器及其执行的函数会自动在每个数据节点上创建。如果触发器函数引用了任何其他函数或对象,则在创建触发器之前,它们需要存在于所有节点上。

  1. 如果你的触发器需要引用另一个函数或对象,请使用 `distributed_exec` 在所有节点上创建该函数或对象。

  2. 在访问节点上创建触发器函数。此示例创建一个虚拟触发器,引发“trigger fired”通知

    CREATE OR REPLACE FUNCTION my_trigger_func()
    RETURNS TRIGGER LANGUAGE PLPGSQL AS
    $BODY$
    BEGIN
    RAISE NOTICE 'trigger fired';
    RETURN NEW;
    END
    $BODY$;
  3. 在访问节点上创建触发器本身。此示例使得每当行插入到超表 `hyper` 中时,触发器都会触发。请注意,你不需要手动在数据节点上创建触发器。这会自动为你完成。

    CREATE TRIGGER my_trigger
    AFTER INSERT ON hyper
    FOR EACH ROW
    EXECUTE FUNCTION my_trigger_func();

如果你有一个语句级触发器,或复制因子大于 1,触发器会多次触发。为避免重复触发,你可以设置触发器函数来检查它正在哪个数据节点上执行。

例如,编写一个触发器函数,在访问节点上引发与数据节点不同的通知

CREATE OR REPLACE FUNCTION my_trigger_func()
RETURNS TRIGGER LANGUAGE PLPGSQL AS
$BODY$
DECLARE
is_access_node boolean;
BEGIN
SELECT is_distributed INTO is_access_node
FROM timescaledb_information.hypertables
WHERE hypertable_name = <TABLE_NAME>
AND hypertable_schema = <TABLE_SCHEMA>;
IF is_access_node THEN
RAISE NOTICE 'trigger fired on the access node';
ELSE
RAISE NOTICE 'trigger fired on a data node';
END IF;
RETURN NEW;
END
$BODY$;

关键词