【发布时间】:2019-10-23 11:17:01
【问题描述】:
我有一个 Postgresql 数据库,我想在其中一个表上启用行级别安全性。
一切正常,除了一件事,我希望在用户尝试对他没有权限的记录执行更新时抛出错误。
根据docs:
check_expression: 任何 SQL 条件表达式(返回布尔值)。 条件表达式不能包含任何聚合或窗口 职能。此表达式将用于 INSERT 和 UPDATE 查询 如果启用了行级安全性,则针对表。只有行 将允许表达式计算为 true 的值。一个错误会 如果表达式计算结果为 false 或 null 对于任何 插入的记录或更新产生的任何记录。 请注意,check_expression 是根据提议的新的 该行的内容,而不是原始内容。
所以我尝试了以下方法:
CREATE POLICY update_policy ON my_table FOR UPDATE TO editors
USING (has_edit_privilege(user_name))
WITH CHECK (has_edit_privilege(user_name));
我还有另一个 SELECT 策略
CREATE POLICY select_policy ON my_table FOR SELECT TO editors
USING (has_select_privilege(user_name));
根据文档,这应该创建一个策略,防止编辑角色中的任何人对 my_table 的任何记录执行更新,并在执行更新时抛出错误。这可以正常工作,但不会引发错误。
我的问题是什么? 请帮忙。
【问题讨论】:
-
上述策略不允许从 my_table 中“选择”。因此,当您尝试
UPDATE时 - 您尝试更新的行已被过滤掉。如果您允许从 my_table 中选择 - 那么您将收到更新错误。这只是一个快速测试。了解有关内部结构的更多信息会很有趣。 -
@madflow 感谢您的回复,这看起来不是原因。因为我创建了一个允许选择所有记录的策略,但仍然会出现同样的问题。 CREATE POLICY select_policy ON my_table FOR SELECT TO editors USING (true);
-
好的 - 这是我的测试用例:db-fiddle.com/f/9eHkDZ8JEursvPaLYnRCir/0 .
标签: postgresql