PostgreSQL撤销特定列权限失败,请求可行示例及解决方案
解决PostgreSQL撤销列权限失败的问题
让我来帮你梳理这个撤销列权限失败的问题,先从你提供的权限信息入手分析:
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+-------+-------+---------------------------+-------------------+----------
public | users | table | himanshu=arwdDxt/himanshu+| |
| | | reports_user=r/himanshu | |
(1 row)
从这个输出能看到两个关键点:
reports_user拥有users表的表级SELECT权限(r代表SELECT),权限由himanshu授予;Column privileges列是空的,说明当前没有针对users表的列级别权限授予记录。
这就是你执行revoke select (column1, column2) on table from specific_user没效果的核心原因:没有可撤销的列级权限存在,而且表级的SELECT权限会覆盖任何列级的权限设置——哪怕你之前给过列权限,只要用户还有表级SELECT权限,列级的限制就不会生效。
正确的操作步骤
如果你想限制reports_user只能查询users表的特定列,应该这么做:
先撤销表级的SELECT权限
REVOKE SELECT ON public.users FROM reports_user;再授予允许查询的列权限
GRANT SELECT (允许查询的列名1, 允许查询的列名2) ON public.users TO reports_user;
额外排查建议
如果你确定之前给过列级权限但现在看不到,可以执行下面的SQL来确认列权限的具体情况:
SELECT * FROM information_schema.column_privileges WHERE table_name = 'users' AND grantee = 'reports_user';
如果结果为空,说明确实没有列级权限;如果有结果,再针对对应的权限进行撤销操作。
内容的提问来源于stack exchange,提问作者tambakoo
相关产品推荐
相关产品推荐

