Aggregate/Window Postgres 行级别安全策略条件中的函数限制

Aggregate/Window functions restriction in Postgres Row Level Security Policy conditions

我已经成功使用 dense_rank() over (order by...) 其中 AFAIK 是 window 函数 - 在 postgres 的行级安全策略条件中。

但是,documentation 声明

Any SQL conditional expression (returning boolean). The conditional expression cannot contain any aggregate or window functions

(重点是我的)。

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

谢谢。

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

考虑下面的 table:

+---------------------+----------------+
| 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.

这在以下方面真的很糟糕:

  • 安全。您可以 "grant yourself" 作为用户(而不是管理员)访问记录。
  • 维护。记录将 appearing/disappearing 随机保存在这样的数据库中。
  • 性能。这样的政策评估成本会非常高

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