показывает пустую таблицу.
Цитата из руководства
Если уровень строкидля таблицы включена защита, но не существует применимых политик, предполагается политика «запрета по умолчанию», поэтому строки не будут видны или обновляются.
Поэтому необходимо создать политику, которая позволяетвыбор:
create policy tb_select on tb
for select
using (true);
позволяет обновлять с idx = 1 cls = 'great2'.
Цитата изруководство
Существующие строки таблицы проверяются по выражению, указанному в USING, а новые строки, которые будут созданы с помощью INSERT или UPDATE, проверяются по выражению, указанному в WITH CHECK
Когда вы создали политику с using (true)
, это означает, что все строки могут быть обновлены.
Итак, вам нужно:
create policy up_p on tb
for update
using (idx > 2 and cls='great2');
Предположим, что равно строка с (1, 'great2')
следующее обновление не будет ничего обновлять:
update stuff.tb
set cls = 'great2'
where idx = 1;
Обратите внимание, что для политики вна самом деле, чтобы быть активным, вам также необходимо:
alter table tb enable row level security;
Однако, если вы просто хотите убедиться, что значения для idx
всегда больше 2 для строк с cls = 'great2'
, проверочное ограничение может бытьлучший вариант:
create table tb
(
idx integer,
cls text,
constraint check_idx check ( (idx > 2 and cls = 'great2') or (cls <> 'great2'))
);
insert into tb
values
(10, 'great2'),
(1, 'foo');
Сейчас выполняется:
update tb
set idx = 1
where idx = 10
, в результате:
ERROR: new row for relation "tb" violates check constraint "check_idx"
Detail: Failing row contains (1, great2).
то же самое происходит, если вы измените значение cls
длястрока с idx <= 2
update tb
set cls = 'great2'
where idx = 1;