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 |
+---------------------+----------------+
有几种(宽松的)政策:
field1 = 'value1'
field1 = 'value2'
- SUM(field2)> 10(禁止但让我们想象一下您现在可以定义它)
您已获得策略 #2 和 3,因此您只能查看和更新最后一条记录。
...直到你执行 UPDATE table SET value2 = 11
.
这在以下方面真的很糟糕:
- 安全。您可以 "grant yourself" 作为用户(而不是管理员)访问记录。
- 维护。记录将 appearing/disappearing 随机保存在这样的数据库中。
- 性能。这样的政策评估成本会非常高
有趣的是,您可以将策略定义为 MyField IN (SELECT MyOtherField FROM MyOtherTable)
,在这种情况下,它完全依赖于您在 MyOtherTable
上定义的内容(它旨在与 FK/PK 一起使用)。
我已经成功使用 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 |
+---------------------+----------------+
有几种(宽松的)政策:
field1 = 'value1'
field1 = 'value2'
- SUM(field2)> 10(禁止但让我们想象一下您现在可以定义它)
您已获得策略 #2 和 3,因此您只能查看和更新最后一条记录。
...直到你执行 UPDATE table SET value2 = 11
.
这在以下方面真的很糟糕:
- 安全。您可以 "grant yourself" 作为用户(而不是管理员)访问记录。
- 维护。记录将 appearing/disappearing 随机保存在这样的数据库中。
- 性能。这样的政策评估成本会非常高
有趣的是,您可以将策略定义为 MyField IN (SELECT MyOtherField FROM MyOtherTable)
,在这种情况下,它完全依赖于您在 MyOtherTable
上定义的内容(它旨在与 FK/PK 一起使用)。