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,无法更新行(具有行级安全性)的主要内容,如果未能解决你的问题,请参考以下文章

[译] PostgreSQL 行安全性策略

PostgreSQL 行级安全性涉及视图或带有连接的选择

PostgreSQL 行级安全性涉及与其他表的外键

POSTGRESQL中的行级锁及ODOO中的应用

PostgreSQL 9.5 - 行级安全/ROLE 最佳实践

为啥没有为 Postgres 视图启用行级安全性?