Ограничение агрегатных / оконных функций в условиях политики безопасности Postgres Row Level

Я успешно смог использовать dense_rank() over (order by...) какая AFAIK является оконной функцией - в условиях политики безопасности на уровне строк postgres.

Тем не менее, в документации говорится

Любое условное выражение SQL (возвращающее логическое значение). Условное выражение не может содержать никаких агрегатных или оконных функций

(акцент мой).

Может кто-нибудь объяснить это ограничение и привести пример, где оно применяется?

Благодарю.

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

Другие вопросы по тегам