我的PostgreSQL 9.5数据库中有一个名为products
的表。该表字段如下所示:
数据是这样的:
id name sales_area
1 prod1 A1
2 prod2 A1
3 prod3 A2
4 prod4 A3
我想创建一个名为user1的数据库用户,该用户应仅选择,更新和删除A1 sales_area
数据。其他数据库用户将选择,更新和删除所有数据。
使用政策可以使用此规则吗?又如何?
答案 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;