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

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

Однако в документации указано

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

(ударение мое).

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

Спасибо.

1 Ответ

0 голосов
/ 13 января 2019

По сути, это говорит о том, что каждая строка независима в отношении безопасности на уровне строк.

Рассмотрим таблицу ниже:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...