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

时间:2013-05-01 07:37:28

标签: postgresql grant

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

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

我该怎么做?

感谢

2 个答案:

答案 0 :(得分:4)

使用适当的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;

BTW一个常见的误解是你无法更新视图,但只有当视图是连接或类似的复杂查询时才会出现这种错误。

答案 1 :(得分:4)

PostgreSQL没有行级声明式安全性(但是,它正在进行中),所以如果你不能创建一个视图 - 比方说,如果你有许多不同的人需要这种访问 - 你可能需要SECURITY DEFINER helper function或触发器。

你有几个选择:

  • 编写一个SECURITY DEFINER函数,该代码只允许他们进行允许的更改,并将他们对表的访问权限限制为SELECT,撤消UPDATEDELETE,{{1} }和TRUNCATE权利;或
  • 编写一个触发器,尝试限制他们进行您不希望他们进行的更改,并INSERT他们写入对该表的访问权。

在这两者中,功能和限制权利方法到目前为止是最安全的选项,只要您遵循上面设置的GRANT安全编码指南 - 设置SECURITY DEFINER为该函数,避免使用字符串替换等动态SQL(search_path

如果是按EXECUTE过滤的视图,上面给出的视图方法可以很好地工作。您可能还想查看新的current_user观看次数;有关它们的有用讨论,请参阅this post