如何在postgresql表中的某些指定行上授予更新或选择?

问题描述 投票:0回答:3

我想在 Postgresql 数据库中创建一些角色并授予一些访问权限。

我有学生角色,我想授予此用户类型:只能编辑在学生表中记录他/她的信息,不能编辑其他行

我该怎么做?

谢谢

postgresql sql-grant
3个回答
5
投票

使用适当的 where 子句在表上创建视图,然后授予对该视图的访问权限:

create view students_view as
select col1, col2, col3 -- limit column access here
from mytable
where <whatever>; -- limit row access here

-- limit what he can do here
grant update, select to student_role;

顺便说一句,一个常见的误解是您无法更新视图,但只有当视图是联接或类似复杂的查询时,这才是正确的。


4
投票

请参阅 postgres 文档以了解第 12 页以上的行级安全性


PostgreSQL 11 及更早版本没有声明性行级安全性,因此如果您不能只创建视图 - 例如,如果您有许多不同的人需要此访问权限 - 您可能需要一个

SECURITY DEFINER
辅助函数 或触发。

您有几个选择:

  • 编写一个
    SECURITY DEFINER
    函数,让他们只进行允许的更改,并将其对表的访问权限限制为
    SELECT
    ,撤销
    UPDATE
    DELETE
    TRUNCATE
    INSERT
    权限;或
  • 编写一个触发器,尝试限制他们进行您不希望他们进行的更改,并且
    GRANT
    他们对表进行写访问。

在这两种方法中,函数和受限权限方法是迄今为止最安全的选择,只要您遵循上面设置的

SECURITY DEFINER
安全编码指南 - 为函数设置
search_path
,避免动态 SQL (
EXECUTE
)字符串替换等

如果是按

current_user
过滤的视图,上面给出的视图方法可以很好地工作。您可能还想查看新的
SECURITY BARRIER
视图;请参阅这篇文章对它们进行有用的讨论。


-1
投票

将 tabela 上的更新(列)授予 user_name;

© www.soinside.com 2019 - 2024. All rights reserved.