PostgreSQL触发器使用继承重写对表的插入

时间:2019-05-21 19:31:00

标签: sql postgresql triggers partitioning postgres-9.6

我们有一个表documents,该表按时间划分为子表,如documents_2019_01documents_2019_02。我们通过在父表BEFORE上使用documents触发器来插入正确的子表中,然后返回NULL来中止管道,因此仅将其插入子表中来完成此操作(您猜对了),这使插入文档很麻烦,因为您必须重新查询创建的ID。我们已经研究过使用INSTEAD OF触发器类型,但是它们不能应用于表,只能应用于视图。

这是触发器当前使用的函数:

CREATE OR REPLACE FUNCTION create_article_partition_and_insert() RETURNS TRIGGER
    LANGUAGE plpgsql
AS
$$
DECLARE
    partition_date TEXT;
    partition      TEXT;
    resultId       BIGINT;
BEGIN
    partition_date := to_char(NEW.updated, 'YYYY_MM');
    partition := TG_RELNAME || '_' || partition_date;
    IF NOT EXISTS(SELECT relname FROM pg_class WHERE relname = partition)
    THEN
        RAISE NOTICE 'A partition has been created %',partition;
        EXECUTE 'CREATE TABLE ' || partition || ' (LIKE ' || TG_RELNAME || ' INCLUDING ALL) INHERITS (' || TG_RELNAME ||
                '); ';
    END IF;
    RAISE NOTICE 'Inserting into %',partition;
    EXECUTE 'INSERT INTO ' || partition || ' SELECT(' || TG_RELNAME || ' ' || quote_literal(NEW) || ').* RETURNING id;'
        INTO resultId;
    NEW.id := resultId;
    RETURN NEW;
END;
$$;

是否有更好的方法来按时间分区插入并返回子表的已插入行,而不必同时插入父表?

使用PG版本9.6.11

谢谢!

0 个答案:

没有答案