【问题标题】:Aggregate/Window functions restriction in Postgres Row Level Security Policy conditionsPostgres 行级安全策略条件中的聚合/窗口函数限制
【发布时间】:2019-01-13 22:10:13
【问题描述】:

我已经成功使用dense_rank() over (order by...) AFAIK 是一个 窗口函数 - 在 postgres 的行级安全策略条件下。

但是,documentation 状态

任何 SQL 条件表达式(返回布尔值)。 条件表达式不能包含任何聚合或窗口函数

(重点是我的)。

有人可以解释这个限制并举例说明它适用的地方吗?

谢谢。

【问题讨论】:

    标签: postgresql window-functions row-level-security


    【解决方案1】:

    基本上,它告诉您每一行在行级安全性方面都是独立的。

    考虑下表:

    +---------------------+----------------+
    | field1              | field2         |
    +---------------------+----------------+
    | value1              | 1              |
    | value1              | 2              |
    | value1              | 3              |
    | value2              | 4              |
    +---------------------+----------------+
    

    有几种(许可)政策:

    1. field1 = 'value1'
    2. field1 = 'value2'
    3. SUM(field2)> 10(禁止,但让我们现在想象一下,您可以定义它)

    您已获得策略 #2 和 3,因此您只能查看和更新​​最后一条记录。
    ...直到你执行UPDATE table SET value2 = 11

    这真的很糟糕:

    • 安全。您可以作为用户(而不是管理员)“授予自己”对记录的访问权限。
    • 维护。记录会在此类数据库中随机出现/消失。
    • 性能。此类政策的评估成本非常高。

    有趣的是,您可以将策略定义为 MyField IN (SELECT MyOtherField FROM MyOtherTable),在这种情况下,这一切都依赖于您在 MyOtherTable 上定义的内容(它旨在与 FK/PK 一起使用)。

    【讨论】:

    • 这很有意义。我对 dense_rank 的使用在 EXISTS 之内 - 所以我认为它是有效的使用。谢谢!
    • 您的意思是在常规查询中的EXISTS
    • CREATE POLICY ON MyTable ... USING ( EXISTS (SELECT 1 FROM (SELECT ... dense_rank() OVER (...) computed_rk FROM MyOtherTable) k WHERE computed_rk=1 ...
    • 有趣...这很复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多