PostgreSQL,无法更新行(具有行级安全性)

时间:2016-10-05 01:42:19

标签: postgresql

set role qstoolbox;
update contract set contract_reference = 'ok ok ok' where id = 2

以上作品 查询成功返回:一行受影响,执行时间为41毫秒。

set role user_role;
update contract set contract_reference = ':( :( :(' where id = 2

这个没有 查询成功返回:0行受影响,31毫秒执行时间。

enter image description here

权限似乎没问题,至少我不清楚我在这里做错了什么。

使用

将行级安全性添加到此表中

alter table contract enable row level security;

与这些政策一起

create policy view_contract on contract for select using(true);
create policy add_contract on contract for insert to user_role with check(true);
create policy delete_contract on contract for delete to user_role using(true);
create policy change_contract on contract for update to user_role with check(true);

2 个答案:

答案 0 :(得分:1)

定义行安全策略或禁用表上的行安全性。每the documentation

  

在表上启用行安全性(使用ALTER TABLE ... ENABLE ROW LEVEL SECURITY)时,行安全策略必须允许对表进行选择行或修改行的所有正常访问。 (但是,表的所有者通常不受行安全策略的约束。)如果表没有策略,则使用default-deny策略,这意味着没有行可见或可以修改。

答案 1 :(得分:0)

好的,我在这行中遗漏了一些东西

create policy change_contract on contract for update to user_role with check(true);

需要

create policy change_contract on contract for update to user_role using(true) with check(true);

注意我缺少使用(true)

感谢@klin让我更详细地研究文档