PostgreSQL, не удается обновить строку (с безопасностью на уровне строки)

#postgresql

#postgresql

Вопрос:

 set role qstoolbox;
update contract set contract_reference = 'ok ok ok' where id = 2
  

Вышеуказанные работы
Запрос успешно возвращен: затронута одна строка, время выполнения 41 мс.

 set role user_role;
update contract set contract_reference = ':( :( :(' where id = 2
  

Этот
запрос не возвращается успешно: 0 затронутых строк, время выполнения 31 мс.

введите описание изображения здесь

Разрешения кажутся нормальными, по крайней мере, неясно, что я здесь делаю не так.

В эту таблицу добавлена защита на уровне строки с

alter table contract enable row level security;

Наряду с этими политиками

 create policy view_contract on contract for select using(true);
create policy add_contract on contract for insert to user_role with check(true);
create policy delete_contract on contract for delete to user_role using(true);
create policy change_contract on contract for update to user_role with check(true);
  

Ответ №1:

Определите политику безопасности строк или отключите защиту строк в таблице. Согласно документации:

Когда в таблице включена защита строк (с помощью ALTER TABLE … ВКЛЮЧИТЬ БЕЗОПАСНОСТЬ НА УРОВНЕ СТРОКИ), весь обычный доступ к таблице для выбора строк или изменения строк должен быть разрешен политикой безопасности строк. (Однако на владельца таблицы обычно не распространяются политики безопасности строк.) Если для таблицы не существует политики, используется политика запрета по умолчанию, что означает, что строки не видны или не могут быть изменены.

Комментарии:

1. Я думаю, что я уже это делаю, обновил вопрос, также я думаю, что это то, что отображается на снимке экрана pgadmin?

2. Да, вы ошиблись using() . На картинке не показаны политики безопасности.

Ответ №2:

Хорошо, я что-то пропустил в этой строке

create policy change_contract on contract for update to user_role with check(true);

Необходимо

create policy change_contract on contract for update to user_role using(true) with check(true);

Обратите внимание, что я пропустил использование (true)

Спасибо @klin за то, что заставил меня более подробно изучить документы