You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL CREATE POLICY 问题:查询无限循环/结果异常求解

问题解答

正确的策略写法

要实现Administrator角色只能查看同数据中心的员工,需避免策略触发递归查询,正确写法如下:

CREATE POLICY admin_employee
ON employee
TO administrator
USING (data_center_id = (SELECT data_center_id FROM employee WHERE login = current_user));

如果当前用户可能关联多个数据中心(通常login字段唯一,此场景少见),可改用IN并给子查询表起别名,避免递归歧义:

CREATE POLICY admin_employee
ON employee
TO administrator
USING (data_center_id IN (SELECT e.data_center_id FROM employee e WHERE e.login = current_user));

第一个策略导致无限循环的原因

你写的第一个策略中,using子句的子查询直接访问employee表,而PostgreSQL行级安全(RLS)会对所有访问该表的查询应用策略,包括策略内部的子查询,由此触发递归:

  1. 执行select * from employee时,触发admin_employee策略
  2. 策略需要查询employee获取当前用户的data_center_id,这个子查询又会触发admin_employee策略
  3. 子查询的策略检查再次需要查询employee,形成无限循环最终报错

第二个策略只返回当前用户行的原因

第二个策略的子查询select data_center_id where login = current_user未指定FROM子句,PostgreSQL会将其视为相关子查询,直接引用外部查询的employee表行数据,等价于逻辑:

仅返回当前行login等于current_user的记录

这自然只会筛选出当前用户自己的那一行数据。

内容的提问来源于stack exchange,提问作者Mitchell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:07:04