带会话变量的postgresql行级安全性

带会话变量的postgresql行级安全性,sql,postgresql,Sql,Postgresql,我正在学习带会话变量的postgres行级安全性 create table user_table ( username text, idx integer ); alter table user_table enable row level security; create policy user_p on user_table for select using (idx <= (current_setting('my.idx',true)::int)); insert

我正在学习带会话变量的postgres行级安全性

create table user_table (
    username text,
    idx integer
);
alter table user_table enable row level security;
create policy user_p on user_table for select
using (idx <= (current_setting('my.idx',true)::int));

insert into user_table values('1',1),('2',2),('3',3);
它应该显示用户名为“1”和“2”的用户_表,但它显示了所有内容。我遗漏了什么导致了问题

在表上启用行安全性时(使用ALTER table…ENABLE 行级安全性),所有用于选择行的表的正常访问权限 行安全策略必须允许或修改行(但是, 表的所有者通常不受行安全策略的约束。)

(强调矿山)

检查:

db=# grant select on user_table to ro;
GRANT
Time: 24.374 ms
db=# set role ro;
SET
Time: 0.305 ms
db=> select * from user_table;
 username | idx
----------+-----
 1        |   1
 2        |   2
(2 rows)

Time: 10.557 ms
db=> set my.idx = 1;
SET
Time: 8.595 ms
db=> select * from user_table;
 username | idx
----------+-----
 1        |   1
(1 row)

这看起来更像是数据库管理员而不是编程-也许更合适?您需要切换到不是表所有者或具有超级管理员权限的用户。另外,最好存储指向db user
current_user
的值,因为您可以在策略中反映这一点。thx,它可以工作!另外,您是否知道是否可以传递多个会话变量,例如设置my.idx=2,my.username='2'。我尝试创建一个策略:在user_表上创建策略user_p以供选择使用(idx看起来像不同的帖子:)问另一个问题-我会同时查看
db=# grant select on user_table to ro;
GRANT
Time: 24.374 ms
db=# set role ro;
SET
Time: 0.305 ms
db=> select * from user_table;
 username | idx
----------+-----
 1        |   1
 2        |   2
(2 rows)

Time: 10.557 ms
db=> set my.idx = 1;
SET
Time: 8.595 ms
db=> select * from user_table;
 username | idx
----------+-----
 1        |   1
(1 row)