cda*_*nge 1 sql postgresql row-level-security
我是 Postgres 的 RLS 功能的新手。我相信我正确地遵循了文档,但出现了意外的行为。考虑以下情况:
report_filespolicy <name> for all using (true)grant all对表具有权限(grant all on all tables in schema testing to testuser;以及架构的grant execute on all functions ...权限)grant usageinsert读取记录,这与预期相反这是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;
Run Code Online (Sandbox Code Playgroud)
或者向特定模式中的所有序列**授予权限:
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA <insert schema name here>
Run Code Online (Sandbox Code Playgroud)
ALL相当于USAGE, SELECT, UPDATE
** 这不会授予运行命令后创建的序列的权限。
如果您使用的 Postgres 版本 >=10,并且仅使用序列来生成主键值,我的偏好是完全避免序列。您可以通过使用IDENTITY列来做到这一点。例如:
CREATE TABLE t (
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
description TEXT NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
请参阅文档