如何在PostgreSQL触发器中访问Hasura session_variables



我想使用触发器函数限制对PostgreSQLdepartment(business(的插入。每个business应该能够创建最多5个departments。我正在尝试访问Hasurasession_variables,其中包含用于标识business的标识符x-hasura-business-id

控制台显示了一个关于不存在的postgres函数to的错误,我认为我没有使用它。

我试图创建的SQL函数的代码是

--- Create function to check business's department count
CREATE FUNCTION check_dpt_quota()
RETURNS trigger AS $$
DECLARE department_count INTEGER;
DECLARE session_variables JSON;

BEGIN
session_variables := current_setting('hasura.user', 't');

SELECT count(*) INTO department_count FROM "public"."department"
WHERE business_id = (session_variables ->> 'x-hasura-business-id')::uuid;

IF department_count > 4 THEN
RAISE EXCEPTION 'Error: Department Quota Exceeded';
END IF;

RETURN NEW;
END;
$$ LANGUAGE plpgsql;
--- Create trigger to run function before INSERT
CREATE TRIGGER insert_department BEFORE INSERT ON "public"."department" FOR EACH ROW EXECUTE PROCEDURE check_dpt_quota();

当我通过Hasura控制台创建SQL函数时,得到的错误是

[
{
"definition": {
"schema": "public",
"name": "to"
},
"reason": "in function "to": no such function exists in postgres : "to"",
"type": "function"
}
]

我不知道我做错了什么,错误信息的描述也不够让我理解。有人能帮我处理这个代码吗?

终于想通了

我犯了两个错误。

  • 我在运行SQL查询时签出了Track this选项

    触发器功能不被跟踪

  • 在将值current_setting('hasura.user', 't')分配给session_variables之前,我没有将其强制转换为json类型

代码的校正版本将是(只是修改后的部分(

...
BEGIN
session_variables := current_setting('hasura.user', 't')::JSON;
...

最新更新