delete для таблицы (чтобы строки не удалялись, а вместо этого в строке менялся флажек `deleted = true`).
При этом хочу, чтобы юзер (не superuser) не мог видеть строки, у которых deleted = true (через row level security policies).
Но почему-то, при заданных policy, пытаясь обновить поле deleted, я получаю ошибку new row violates row-level security policy for table "my_table".
Вот, как я задавал RLS:
alter table my_table enable row level security;
alter table my_table force row level security;
create policy select_policy on my_table for select to public using (deleted is false);
create policy insert_policy on my_table for insert to public with check (true);
create policy delete_policy on my_table for delete to public using (true);
create policy update_policy on my_table for update to public using (true) with check (true);
И вот так пытаюсь обновлять строку:
update my_table set deleted = true where id = 1;
________________
Может кто сможет подсказать, что я делаю не так? Возможно ли вообще такое реализовать?
Вряд ли возможно. Уж лучшэ через view, кмк -- хотя там с оптимизатором некоторые вопросы добавляются.
Та в моем случае вью не вариант 😭
With check в update уберите
Ошибку дословно приведите вместе с update
У вас для разграничения прав доступа к данным используются пользователь СУБД?
Да нет, хотелось сделать для всех пользователей одинаковые ограничения (поэтому использовал роль public в create policy). Хотел, чтобы при update set deleted = true был эффект удаления записи.
Так это логика на уровне приложения уже
Почему вы так думаете?
Увы, это просто особенности проекта и команды
У тимлида фобия вьюшэк?
Типа того)
Тимлид в прошлом с oracle работал? Там в старых версиях иногда были проблемы при использовании вьюшек в сложных запросах.
Она и в pg есть )))))
Обсуждают сегодня