Postgres行级安全策略条件中的聚合/窗口函数限制

时间:2019-01-13 08:42:12

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

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

但是,documentation声明

  

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

(重点是我的)。

有人可以解释此限制并举例说明它的适用范围吗?

谢谢。

1 个答案:

答案 0 :(得分: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一起使用)。