У меня есть таблицы с включенной безопасностью на уровне строк и соответствующими политиками - они работают очень хорошо.
Моя проблема в том, что иногда, основываясь на некоторых условиях, я хочу обойти политику для определенного c оператор во время выполнения функции.
что-то вроде:
...
statement 1
statement 2
if (some cond) then
disable rls temporarily
statement 3 -- mostly delete rows the user can't normally see
enable rls
else
statement 3
end if
Я реализовал это путем создания функции check_cond
, которая возвращает логическую оценку some cond
и создал дополнительную политику выбора, которая вызывает это check_cond
.
. Это работает - но на самом деле проблема в том, что запрос select * from tab
теперь выглядит так: select * from tab where <original policy condition> or check_cond()
This or check_cond()
заставляет postges всегда выполнять полное сканирование таблицы, так как он не может оценить предварительное планирование результата.
Если бы я мог написать код «dynamici c» в политике, я бы смог добавить / удалить условия, основанные на значении check_cond()
, но насколько я знаю, это невозможно.
Любой умный способ, который позволил бы мне временно отключить rls или динамически добавлять условия без сакра производительность зачистки?
Спасибо.