我是Postgres RLS功能的新手。我相信我在适当地遵循文档,但却出现了意想不到的行为。考虑以下情况:
- 我有一个名为
report_files
的表 - 该表有一个简单的策略
policy <name> for all using (true)
- 用户对表具有
grant all
权限(grant all on all tables in schema testing to testuser;
,以及模式的grant execute on all functions ...
和grant usage
( - 用户现在可以读取表中的所有字段,但不能按预期读取
insert
记录
下面是psql的一个非常短的片段,演示了上述内容:https://gist.github.com/cdaringe/85dd9a7b1278afe4770869dc494216f3
我已经设置了一个允许策略,它清楚地评估OK,成功的select
命令就是明证。
我可以排除哪些故障以使insert
正常工作?
谢谢!
错误:拒绝序列report_files_id_seq 的权限
您需要授予使用report_files_id_seq
序列的权限。授予表的权限并不授予序列的权限。它们是完全分开的。序列经常被表用作DEFAULT
值的部分,但它不是表的部分。
您可以通过以下方式授予序列权限:
GRANT USAGE, SELECT ON SEQUENCE report_files_id_seq TO testuser;
或者授予特定模式中所有序列**的权限:
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA <insert schema name here>
ALL
相当于USAGE, SELECT, UPDATE
**这不会为运行命令后创建的序列授予权限。
您需要使用序列吗
如果您使用的是Postgres版本>10,并且只使用序列来生成主键值,我的偏好是完全避免序列。您可以使用IDENTITY
列来完成此操作。例如:
CREATE TABLE t (
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
description TEXT NOT NULL
);
参见文档
由于我还不能发表评论,如果今天有人像我一样来到这个线程,我将添加一些输入作为答案。
是的,除了已经在表上授予的权限外,您还必须分别授予对序列的权限。事实上,这是你必须做的。
即使您的表依赖于序列对象,从RDBMS的角度来看,它们都是不同的对象,因此它们需要不同的权限。
例如,对于索引,在表的子对象中进行索引,并且不需要额外的特权就可以使用索引,因此除了创建索引之外,不需要其他操作。
此外,如果序列名存储在一个不是默认模式(public
(且不在您的search_path
中的模式中,请小心为其添加前缀。如果不是这样,即使您对要使用的序列拥有所有必要的权限,您也可能会遇到拒绝权限的错误。