使用行级安全性

时间:2018-05-30 15:56:52

标签: sql postgresql row-level-security

create table user_table(
    idx text,
    _section text[]
);

create table section_table(
    _section text,
    sub_section text[]
);

alter table user_table enable row level security;

create policy user_p on user_table for select
using (section @> 
         (select _section from user_table 
            intersect
            (select _section::text[]
               from section_table 
               where current_setting('my.sub_section',true)::text[]
                     <@ (select sub_section 
                         from section_table)
            )
         )
      );

insert into user_table values
   (1,'{"section1"}'),(2,'{"section2"}'), 
   (2,'{"section2","section1"}');

insert into section_table values
   ('section1','{"s","b"}'), 
   ('section2','{"c","d"}');

期望输出:

set my.sub_section ='{"c"}';
select * from user_table;

应该只显示(2,'{"section2"}'),但它会显示所有内容。

输入sub_section后,应该转到section_table并找到 相应的部分与user_table相交,一旦值为。{ intersect不为null,则应返回相应的值 user_table

我很困惑为什么它没有显示正确的期望结果。

0 个答案:

没有答案