Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按用户和行数据列出的Postgresql行策略_Postgresql_Postgresql 9.5 - Fatal编程技术网

按用户和行数据列出的Postgresql行策略

按用户和行数据列出的Postgresql行策略,postgresql,postgresql-9.5,Postgresql,Postgresql 9.5,我的postgresql 9.5数据库中有一个名为products的表。该表字段如下所示: id name sales_area 1 prod1 A1 2 prod2 A1 3 prod3 A2 4 prod4 A3 身份证 名字 销售区 数据如下: id name sales_area 1

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

    id       name       sales_area
    1        prod1      A1
    2        prod2      A1
    3        prod3      A2
    4        prod4      A3
  • 身份证
  • 名字
  • 销售区
数据如下:

    id       name       sales_area
    1        prod1      A1
    2        prod2      A1
    3        prod3      A2
    4        prod4      A3
我想创建一个名为user1的数据库用户,这个用户应该只选择、更新和删除
A1销售区域
datas。其他数据库用户将选择、更新和删除所有数据


使用策略是否可以使用此规则?如何创建?

关于权限我不确定,但您也可以创建一个视图,如下所示,并向他们授予“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;

我认为这可以通过使用行级安全性来实现,如下所示:

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');
altertable产品支持行级安全;
为产品上的_user1创建许可策略
面向公众
使用(当前用户“user1”或销售区域=“A1”);
然后,
user1
只能访问
sales\u区域
A1,其他所有人都可以访问所有内容

一些解释:

  • 对于所有
    表示“对于所有操作”,请参见:

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

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

    所有
    策略都将应用于查询的选择端和修改端,如果只定义了一个
    使用
    表达式,则在这两种情况下都使用using表达式


我认为这是不可能的,但您可以创建一个示例视图(应用sales_area='A1'的条件)并授予“user1”对新视图的权限。用户可以使用此视图插入或删除吗?是的,应该这样做。有一些关键字和规则需要注意,然后它将允许执行所有dmlDoes“For all to public”包含select insert update?我扩展了答案,希望涵盖此问题和其他问题。