Проблемы с созданием политики обновления - PullRequest
0 голосов
/ 06 июня 2018

Я хочу использовать безопасность на уровне строк для создания политики для обновления, tb.idx никогда не сможет обновиться до уровня ниже 2, если cls = 'great2':

 create table tb (
 idx integer,
 cls text);
create role user1;
grant all on tb to user1;
......
create policy up_p on tb for update
using(true)
with check (idx >2 and cls='great2');

output:
set role user1;
select * from tb; 
update tb set idx=1 cls='great2'

Есть две проблемы:

  1. при использовании select * from tb отображается пустая таблица.
  2. разрешено обновление с idx = 1 cls = 'great2'.

1 Ответ

0 голосов
/ 06 июня 2018

показывает пустую таблицу.

Цитата из руководства

Если уровень строкидля таблицы включена защита, но не существует применимых политик, предполагается политика «запрета по умолчанию», поэтому строки не будут видны или обновляются.

Поэтому необходимо создать политику, которая позволяетвыбор:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...