postgresql - 用户和行数据的 Postgresql 行策略
问题描述
我有一个products
在我的 postgresql 9.5 数据库中命名的表。而这个表字段是这样的:
- ID
- 姓名
- 销售区域
数据是这样的:
id name sales_area
1 prod1 A1
2 prod2 A1
3 prod3 A2
4 prod4 A3
我想创建一个名为 user1 的数据库用户,这个用户应该只选择、更新和删除A1 sales_area
数据。其他数据库用户将选择、更新和删除所有数据。
这条规则是否可以使用策略?如何?
解决方案
我认为这可以使用行级安全性来完成,如下所示:
ALTER TABLE products ENABLE ROW LEVEL SECURITY;
CREATE POLICY for_user1 ON products AS PERMISSIVE
FOR ALL TO PUBLIC
USING (current_user <> 'user1' OR sales_area = 'A1');
然后user1
只能访问sales_area
A1,其他人都可以访问所有内容。
一些解释:
FOR ALL
表示“所有操作”,请参阅文档:使用
ALL
策略意味着它将适用于所有命令,而不管命令的类型如何。缺少
WITH CHECK
子句并不意味着不会检查数据修改。再次引用文档:ALL
策略将应用于查询的选择端和修改端,如果只USING
定义了一个表达式,则对这两种情况都使用 USING 表达式。