在 citus (postgres) 上创建分布式 table 时出现错误

I get error when create distributed table on citus (postgres)

我在 Citus 上创建了一个 table: CREATE TABLE myschema.mytable

然后我创建了从 table myschema.mytable:

获取数据的函数
CREATE FUNCTION myschema.myfunction(id INT)
RETURNS INT AS $$
DECLARE approved_count INT;
BEGIN
SELECT COUNT(id) INTO approved_count 
FROM myschema.mytable
WHERE id =  AND is_deleted = FALSE AND is_flagged = TRUE;
RETURN approved_count;
END;
$$ LANGUAGE plpgsql

然后我在table myschema.mytable上添加了约束:

ALTER TABLE myschema.mytable ADD CONSTRAINT myconstraint CHECK ((myschema.myfunction()=(0)));

以上所有查询均已成功执行。

最后,我创建了一个分布式的table:

SELECT create_distributed_table('myschema.mytable', 'tenant_id');

我得到了错误:

ERROR:  function myschema.myfunction() does not exist
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
CONTEXT:  while executing command on 10.0.0.***:****
SQL state: 42883

我尝试 运行 以其他顺序查询。我创建了一个 table,分发了 table,并成功运行。但是我无法添加约束并得到相同的错误。

据我所知,我的工作人员看不到我的功能。我该如何解决这个问题?

Citus 当前不会将 CREATE FUNCTION 查询传播到工作节点。您需要自己在workers中手动创建函数。

您还可以使用以下查询在工作节点中手动创建函数:

SELECT *
FROM run_command_on_workers($cmd$
  CREATE FUNCTION myschema.myfunction(id INT) RETURNS INT AS
  $$ DECLARE approved_count INT;
    BEGIN 
    SELECT 
      COUNT(id)
    INTO
      approved_count 
    FROM 
      myschema.mytable 
    WHERE 
      id =  
      AND is_deleted = FALSE 
      AND is_flagged = TRUE;
    RETURN approved_count;
    END;
  $$ LANGUAGE plpgsql
$cmd$);

您可能还需要在工作节点上创建 myschema(取决于您的 Citus 版本)。您也可以使用 run_command_on_workers() udf 和 CREATE SCHEMA IF NOT EXISTS 命令来执行此操作。

您可以查看 run_command_on_workers() here 的文档。

仅供参考:我目前正在研究一项在工作节点中分发功能的功能。我们计划在下一个 Citus 主要版本中发布它

编辑:create_distributed_function Citus 中有 UDF >= v9.0 您可以在 https://docs.citusdata.com/en/v9.0/develop/api_udf.html#create-distributed-function and some more in https://docs.citusdata.com/en/v9.0/faq/faq.html#how-do-i-create-database-roles-functions-extensions-etc-in-a-citus-cluster

查看文档