我在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我试着按另一个顺序运行查询。我成功地创建了一个表、分布式表和函数。但我无法添加约束,得到了同样的错误。
据我所知,我的工人没有看到我的作用。我如何解决这个问题?
发布于 2019-09-03 07:48:13
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() udf和CREATE SCHEMA IF NOT EXISTS命令来完成这一任务。
您可以查看run_command_on_workers() 这里的文档。
FYI:我目前正在开发一个特性,用于在工作节点中分发函数。我们计划在下一版的“奇图斯”中发布。
编辑:create_distributed_function UDF在>= v9.0中,您可以在udf.html#create-distributed-function上看到文档,在https://docs.citusdata.com/en/v9.0/faq/faq.html#how-do-i-create-database-roles-functions-extensions-etc-in-a-citus-cluster中可以看到更多。
https://stackoverflow.com/questions/57713649
复制相似问题