我是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
正常工作?
谢谢!
2条答案
按热度按时间wvmv3b1j1#
错误:序列report_files_id_seq的权限被拒绝
您需要授予使用
report_files_id_seq
序列的权限。授予表的权限并不授予序列的权限。它们是完全独立的。序列通常被表用作DEFAULT
值的一部分,但它不是表的一部分。您可以使用以下命令授予序列权限:
或者向特定模式中的所有序列**授予权限:
ALL
等价于USAGE, SELECT, UPDATE
**此命令不给予在运行命令后创建序列。
是否需要使用序列?
如果你使用的是Postgres version〉=10,并且只使用序列来生成主键值,我的首选是完全避免使用序列。你可以使用
IDENTITY
列来做到这一点。例如:参见the docs
nzk0hqpo2#
由于我还不能发表评论,我会添加一些输入作为答案,如果有人像我一样今天到达这个线程。
是的,除了已经在表上授予的权限之外,您还必须单独授予序列的权限。事实上,这就是您必须做的。
即使您的表依赖于序列对象,从RDBMS的Angular 来看,它们都是不同的对象,因此它们需要不同的权限。
至于你的索引示例,在表的子对象中建立索引,并且不需要额外的特权就可以使用索引,因此除了创建索引之外,不需要进一步的操作。
此外,如果序列名存储在一个不是默认模式(
public
)的模式中,并且不在您的search_path
中,请注意给序列名加上前缀。如果不是这种情况,即使您对要使用的序列拥有所有必要的权限,也可能会遇到权限拒绝错误。