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

标签 postgresql window-functions row-level-security

我已经成功地使用 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              |
+---------------------+----------------+

有几个(宽松的)策略:

  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 一起使用)。

关于postgresql - Postgres 行级别安全策略条件中的聚合/窗口函数限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54167292/

相关文章:

sql - 两个表上的基于时间戳的连接

sql - 根据日期滚动总和(当日期缺失时)

spring - 如何使用 hibernate 过滤器或其他方式在 spring 数据 jpa 中实现行级安全?

sql - 启用 RLS(行级安全性)时 PostgreSQL 查询不使用 INDEX

postgresql - Postgresql 连续归档对于维护完整的数据库历史记录是否实用?

c# - 在 PostgreSQL 查询中将日期时间转换为指定格式

postgresql - 删除 Slick 生成的查询中的别名

python sqlite字符串比较

sql - 查找当前行是否是要从数据库中选择的最后一行

postgresql - 行级安全性不适用于表所有者