警告

多节点支持已弃用.

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

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

  • 行级触发器在插入行的数据节点上触发。触发器必须在数据存储的位置触发,因为 BEFOREAFTER 行触发器需要访问存储的数据。访问节点上的数据块不包含任何数据,因此它们没有触发器。
  • 语句级触发器在每个受影响的节点(包括访问节点)上触发一次。例如,如果分布式超表包含 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$;

关键词

在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页。