用户和行数据的PostgreSQL行策略

时间:2018-07-17 08:48:24

标签: postgresql postgresql-9.5

我的PostgreSQL 9.5数据库中有一个名为products的表。该表字段如下所示:

  • id
  • 名称
  • sales_area

数据是这样的:

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

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

使用政策可以使用此规则吗?又如何?

2 个答案:

答案 0 :(得分:1)

我认为可以使用以下行级安全性来做到这一点:

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的意思是“用于所有操作”,请参见the documentation

      

    对策略使用ALL意味着该策略将适用于所有命令,而与命令的类型无关。

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

      如果仅定义了ALL表达式,则使用USING表达式将

    USING策略应用于查询的选择端和修改端。

答案 1 :(得分:0)

关于权限的不确定,但是,您也可以按如下所示创建视图,并将其对“ user1”的权限授予新视图。

create table tx1(id int,name varchar(20),sales_area varchar(20));
insert into tx1 values(1,'prod1','A1');
insert into tx1 values(2,'prod2','A1');
insert into tx1 values(3,'prod3','A2');
insert into tx1 values(4,'prod4','A3');

create view tx1_view
as select * from tx1 where sales_area='A1';

insert into tx1_view values(5,'prod5','A1');

select * from tx1_view;

Demo