我想使用触发器函数限制对PostgreSQL表department
(business
(的插入。每个business
应该能够创建最多5个department
s。我正在尝试访问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;
...