尽管在列上缺少 select,但仍删除行

Delete row despite missing select right on a column

在此示例中,第二列对于组 'user_group' 的成员(角色)不应该可见,因为仅在内部需要此列来调节行级安全性。但是,只有在该列也可见时才能删除记录。你如何解决这个问题?

想到的选项是:

还有其他选择吗? (特别是对于删除,我想对其他表中的外键使用 'ON DELETE SET NULL' 这样的好东西,而不必为它们编写不必要的程序触发器)

create table test (
    internal_id serial primary key,
    user_id int not null default session_user_id(),
    info text default null
);


grant
    select(internal_id, info),
    insert(info),
    update(info),
    delete
on test to user_group;

create policy test_policy on policy for all to public using (
            user_id = session_user_id());

RLS 只是隐式地向所有查询添加不可避免的 WHERE 子句,它不会混淆评估代码的角色。来自 the docs:

"由于策略表达式直接添加到用户的查询中,因此它们将 运行 具有用户 运行 整个查询的权限。因此,用户使用给定策略的用户必须能够访问表达式中引用的任何 table 或函数,否则他们在尝试查询启用了行级安全性的 table 时只会收到权限被拒绝的错误。

此功能与授予的列权限正交。所以 public 角色必须能够查看 user_id 列,否则评估 user_id = session_user_id() 会导致错误。确实没有办法使该列可见。

completely superfluous and I want to hide internally as much as possible

解决方案是 VIEW 不包含该列。甚至会是 updatable!