撤销postgresql中的特定列

6

我尝试使用这里的文档,但似乎没有帮助。如果您可以,请给我一个例子。

revoke select (column1, column2) on table from specific_user

没有起作用。

Access privileges
 Schema | Name  | Type  |     Access privileges     | Column privileges | Policies 
--------+-------+-------+---------------------------+-------------------+----------
 public | users | table | himanshu=arwdDxt/himanshu+|                   | 
        |       |       | reports_user=r/himanshu   |                   | 
(1 row)

请编辑问题,将在psql中运行的\z 表格的输出包括在内。 - Laurenz Albe
我首先授予用户对reports_user的选择权限,然后使用上面的撤销语法撤销了column1和column2。尽管如此,我仍然可以从reports_user访问column1和column2。 - tambakoo
2个回答

16

问题在于SQL中的权限是可累加的,列权限和表权限是不同的。

撤销你之前没有授予的权限是无效的,而在表上授予SELECT与在所有列上授予SELECT是不同的。

您应该撤销对表的SELECT权限,并授予除了您想要拒绝访问的列之外的所有列的SELECT权限:

REVOKE SELECT ON "table" FROM specific_user;
GRANT SELECT (<all columns except "column1" and "column2">)
   ON "table" TO specific_user;

使用\z "table"来检查结果。


4
我需要在(<除了"column1"和"column2"之外的所有列>)中输入所有列名吗?这会在"<"处产生语法错误。我有超过60个列。 - tambakoo
3
然后输入58列。 - Laurenz Albe

1

@Laurenz的答案是正确的。但是我对语法有点困惑。只是为了澄清:

我有一个表public.values

+---------+---------+---------+
|    A    |    B    |    C    |
+---------+---------+---------+
| Value 1 | Value 2 | Value 3 |
+---------+---------+---------+

如果用户 peter 只能看到列 AB,则需要使用以下命令:
REVOKE SELECT ON public.values FROM peter;
GRANT SELECT ("A", "B") ON public.values TO peter;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接