首页 > 解决方案 > 用户和行数据的 Postgresql 行策略

问题描述

我有一个products在我的 postgresql 9.5 数据库中命名的表。而这个表字段是这样的:

数据是这样的:

    id       name       sales_area
    1        prod1      A1
    2        prod2      A1
    3        prod3      A2
    4        prod4      A3

我想创建一个名为 user1 的数据库用户,这个用户应该只选择、更新和删除A1 sales_area数据。其他数据库用户将选择、更新和删除所有数据。

这条规则是否可以使用策略?如何?

标签: postgresqlpostgresql-9.5

解决方案


我认为这可以使用行级安全性来完成,如下所示:

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_areaA1,其他人都可以访问所有内容。

一些解释:

  • FOR ALL表示“所有操作”,请参阅文档

    使用ALL策略意味着它将适用于所有命令,而不管命令的类型如何。

  • 缺少WITH CHECK子句并不意味着不会检查数据修改。再次引用文档:

    ALL策略将应用于查询的选择端和修改端,如果只USING定义了一个表达式,则对这两种情况都使用 USING 表达式。


推荐阅读