PostgreSQL,无法更新行(具有行级安全性)
Posted
技术标签:
【中文标题】PostgreSQL,无法更新行(具有行级安全性)【英文标题】:PostgreSQL, unable to update row ( with row level security ) 【发布时间】:2016-10-05 01:42:19 【问题描述】: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 毫秒执行时间。
权限似乎还可以,至少不清楚我在这里做错了什么。
行级安全性已添加到此表中
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);
【问题讨论】:
【参考方案1】:定义行安全策略或禁用表的行安全。每the documentation:
当对表启用行安全性时(使用 ALTER TABLE ... ENABLE ROW LEVEL SECURITY),行安全策略必须允许对表的所有正常访问以选择行或修改行。 (但是,表的所有者通常不受行安全策略的约束。)如果表不存在策略,则使用默认拒绝策略,这意味着没有行可见或可以修改。
【讨论】:
我想我已经这样做了,有更新的问题,我认为这就是 pgadmin 屏幕截图中显示的内容? 是的,你错过了using()
。图片未显示安全策略。【参考方案2】:
好的,我在这一行中遗漏了一些东西
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);
注意我错过了 using(true)
感谢 @klin 让我更详细地研究文档
【讨论】:
以上是关于PostgreSQL,无法更新行(具有行级安全性)的主要内容,如果未能解决你的问题,请参考以下文章