PostgreSQL中表所有者是否可能不拥有SELECT等表操作权限?
问题解答
是否存在该场景?
存在。
触发条件与具体成因
- 显式回收了所有者的表权限
PostgreSQL的表所有者默认拥有全部表权限,但权限系统支持对所有者执行显式回收操作,优先级高于默认规则。如果该库曾经执行过类似REVOKE ALL ON public.table_name FROM role_name;的语句,就算该角色后续被设为表所有者,也不会自动恢复被回收的权限,这是最常见的触发原因。 - 表所在schema未给所有者开放USAGE权限
要访问表除了表本身的权限,还需要拥有对应schema的USAGE权限。如果当前库的publicschema默认权限被修改,比如执行过REVOKE USAGE ON SCHEMA public FROM PUBLIC;,且没有单独给role_name开放publicschema的USAGE权限,就算是表所有者也无法访问表,表现为没有SELECT/INSERT等操作权限。 - 行级安全(RLS)限制未豁免所有者
若该表开启了行级安全,且当前库修改了默认豁免规则,执行过ALTER ROLE role_name SET BYPASSRLS OFF;或者全局开启了强制RLS校验,那么所有者访问表时会被RLS规则拦截,也会表现为没有对应操作权限。 - 角色配置了NOINHERIT属性
如果role_name创建时指定了NOINHERIT参数,而该角色的表权限实际是继承自它所属的父角色,那么它无法自动继承父角色的权限,就算被设为所有者也会出现权限缺失的情况。
内容的提问来源于stack exchange,提问作者Surya
相关产品推荐
相关产品推荐

