Ограничение агрегатных / оконных функций в условиях политики безопасности Postgres Row Level
Я успешно смог использовать dense_rank() over (order by...)
какая AFAIK является оконной функцией - в условиях политики безопасности на уровне строк postgres.
Тем не менее, в документации говорится
Любое условное выражение SQL (возвращающее логическое значение). Условное выражение не может содержать никаких агрегатных или оконных функций
(акцент мой).
Может кто-нибудь объяснить это ограничение и привести пример, где оно применяется?
Благодарю.
1 ответ
По сути, это говорит о том, что каждая строка независима в отношении безопасности на уровне строк.
Рассмотрим таблицу ниже:
+---------------------+----------------+
| 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).