如何将Hasura会话变量作为参数传入PostgreSQL自定义函数
Hasura 传入会话变量给自定义PostgreSQL函数的实现方法
Hasura 原生支持将x-hasura-*类会话变量作为参数传入自定义函数,适配通过函数计算列默认值的场景,有两种可落地的实现方式:
方式一:列预设中显式传参(完全匹配传参需求)
不需要修改现有函数的调用入口,直接在表的列权限配置中绑定参数即可,配置路径:- 进入Hasura控制台,打开目标数据表的「Permissions」配置页
- 找到对应角色的插入/更新权限规则,进入编辑页
- 定位到「Column presets」区域,给需要计算默认值的列选择预设类型为SQL expression
- 在表达式输入框中直接写函数调用语句,按规则引用会话变量作为入参即可,比如传入
x-hasura-user-id给get_value()的写法:
get_value(("x-hasura-user-id")::text)注意根据用户ID实际类型做类型转换,比如存UUID就转
::uuid,存整数就转::integer。Hasura在生成执行SQL时会自动将引用的会话变量替换为当前请求的实际值,作为入参传入函数,函数返回值会直接作为该列的写入值,不需要前端或上层逻辑传值。方式二:函数内部直接读取会话上下文(无需显式传参)
Hasura处理每一个请求时,都会在当前数据库事务中通过SET LOCAL把所有JWT携带的x-hasura-*变量注入PostgreSQL会话上下文,你可以直接在自定义函数内部读取这些值,不需要在调用时显式传参。
函数示例:CREATE OR REPLACE FUNCTION get_value() RETURNS text AS $$ DECLARE current_user_id text; BEGIN -- 读取当前会话的x-hasura-user-id值,第二个参数true表示不存在时返回null不报错 current_user_id := current_setting('request.jwt.claim.x-hasura-user-id', true); -- 这里写业务计算逻辑,最终返回对应列需要的默认值 RETURN concat(current_user_id, '_computed_suffix'); END; $$ LANGUAGE plpgsql STABLE;这种方式下列预设的SQL表达式直接填
get_value()即可,配置更简洁。
配置注意事项:
- 列预设触发函数调用的生效逻辑和直接填充会话变量的列预设完全一致,仅在对应角色执行插入/更新操作时触发,不会额外引入权限风险
- 如果自定义函数是直接暴露为GraphQL查询/变更的根字段函数,可以直接在函数的权限配置页给入参绑定会话变量作为默认值,配置逻辑和表字段规则一致
- 自定义函数不要标记为
IMMUTABLE类型,纯计算逻辑用STABLE,带写入逻辑用VOLATILE,否则会因为函数缓存拿不到动态会话值返回错误结果
内容的提问来源于stack exchange,提问作者Nenad Jovanovski
相关产品推荐
相关产品推荐

