我已经成功地使用 dense_rank() over (order by...)
其中 AFAIK 是一个窗口函数 - 在 postgres 的行级安全策略条件中。
然而,documentation州
Any SQL conditional expression (returning boolean). The conditional expression cannot contain any aggregate or window functions
(重点是我的)。
有人可以解释这个限制并举例说明它适用的地方吗?
谢谢。
最佳答案
基本上,它告诉您每一行在行级安全性方面都是独立的。
考虑下表:
+---------------------+----------------+
| field1 | field2 |
+---------------------+----------------+
| value1 | 1 |
| value1 | 2 |
| value1 | 3 |
| value2 | 4 |
+---------------------+----------------+
有几个(宽松的)策略:
field1 = 'value1'
field1 = 'value2'
- SUM(field2)> 10(禁止,但现在让我们想象一下您可以定义它)
您已获得策略 #2 和 3,因此您只能查看和更新最后一条记录。
... 直到您执行 UPDATE table SET value2 = 11
。
这在以下方面真的很糟糕:
- 安全。您可以作为用户(而非管理员)“授予自己”对记录的访问权限。
- 维护。记录会在这样的数据库中随机出现/消失。
- 表现。此类政策的评估成本非常高。
有趣的是,您可以将策略定义为 MyField IN (SELECT MyOtherField FROM MyOtherTable)
,在这种情况下,它完全依赖于您在 MyOtherTable
上定义的内容(旨在与 FK/PK 一起使用)。
关于postgresql - Postgres 行级别安全策略条件中的聚合/窗口函数限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54167292/