1

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

然后我创建了从表 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 = $1 AND is_deleted = FALSE AND is_flagged = TRUE;
RETURN approved_count;
END;
$$ LANGUAGE plpgsql

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

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

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

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

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

我试图以其他顺序运行查询。我成功创建了一个表、分布式表和函数。但我无法添加约束并得到同样的错误。

据我了解,我的 Worker 看不到我的功能。我该如何解决这个问题?

4

1 回答 1

3

Citus 当前不将CREATE FUNCTION查询传播到工作节点。您需要自己在工作人员中手动创建该功能。

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

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 = $1 
      AND is_deleted = FALSE 
      AND is_flagged = TRUE;
    RETURN approved_count;
    END;
  $$ LANGUAGE plpgsql
$cmd$);

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

run_command_on_workers() 您可以在此处查看文档。

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

编辑:create_distributed_functionUDF 在 Citus >=v9.0您可以在https://docs.citusdata.com/en/v9.0/develop/api_udf.html#create-distributed-functionhttps://中查看更多文档docs.citusdata.com/en/v9.0/faq/faq.html#how-do-i-create-database-roles-functions-extensions-etc-in-a-citus-cluster

于 2019-09-03T07:48:13.680 回答