powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Permission Denied и двойное обновление одного и тоже поля
14 сообщений из 14, страница 1 из 1
Permission Denied и двойное обновление одного и тоже поля
    #39761105
n@vigator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добры день!
Подскажите пожалуйста в чем может быть проблема.
Нахожусь под пользователем А, делаю два обновления таблицы в схеме B:

Код: plsql
1.
update b.table1 set field='1' where id=1


проходит великолепно, не делая commit, выполняю второе обновление
Код: plsql
1.
update b.table1 set field='2' where id=1


получаю ошибку
SQL Error [42501]: ERROR: permission denied for schema b

делал grant b to a
через консоль на самом сервере из-под пользователя postgres все проходит без ошибок.
делал пользователья а superuser, но все бес толку...

Подскажите пожалуйста в какую сторону копать!!!
...
Рейтинг: 0 / 0
Permission Denied и двойное обновление одного и тоже поля
    #39761226
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
n@vigator,

покажите сообщение об ошибке из логов базы вместе с запросом (возможно фактически там другой запрос выполнялся, например из триггерной функции, в логах должно быть видно).
и вывод
Код: sql
1.
\dn+ b
...
Рейтинг: 0 / 0
Permission Denied и двойное обновление одного и тоже поля
    #39761271
n@vigator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выдержка и журнала

2019-01-18 09:55:20.439 MSK [7291] ERROR: permission denied for schema markup at character 20
2019-01-18 09:55:20.439 MSK [7291] QUERY: SELECT 1 FROM ONLY "markup"."dic_attrs" x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR KEY SHARE OF x
2019-01-18 09:55:20.439 MSK [7291] STATEMENT: update markup.ent_attrs set vld_error_code='-10002', vld_error_mess='Test2' where id=150050


Код: plsql
1.
2.
update markup.ent_attrs set vld_error_code='-10001', vld_error_mess='Test' where id=150050;
update markup.ent_attrs set vld_error_code='-10002', vld_error_mess='Test2' where id=150050;
...
Рейтинг: 0 / 0
Permission Denied и двойное обновление одного и тоже поля
    #39761509
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
n@vigator,

вывод

Код: sql
1.
\dn+ markup



все-таки покажите (из psql). и имя пользователя, из под которого запрос выполнялся.
...
Рейтинг: 0 / 0
Permission Denied и двойное обновление одного и тоже поля
    #39761661
n@vigator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexius,

List of schemas
Name | Owner | Access privileges | Description
--------+-----------+------------------------+-------------
markup | validator | validator=UC/validator |
(1 row)

запрос из-под validator
...
Рейтинг: 0 / 0
Permission Denied и двойное обновление одного и тоже поля
    #39761796
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
n@vigatorAlexius,

List of schemas
Name | Owner | Access privileges | Description
--------+-----------+------------------------+-------------
markup | validator | validator=UC/validator |
(1 row)

запрос из-под validator

есть ли доступ у validator к таблице "markup"."dic_attrs" на select?
Скорее всего нет.

А вот почему одно обновление работает а два той же строки в одной транзакции нет - тут уже интереснее:
В postgresql есть оптимизация что если значения ключевых (участвующих в foreign keys) полей в таблице у которой есть fk не меняются то foreign keys проверка не производится.
Но эта оптимизация по ряду причин срабатывает ТОЛЬКО на первое обновление строки в транзакции, второе и последующие будут проверять валидность fk и для этого пользователю делающему update нужны права на select всех таблиц на которые ссылается markup.ent_attrs.

Вот этот вот запрос "SELECT 1 FROM ONLY "markup"."dic_attrs" x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR KEY SHARE OF x" - как раз кусок внутреннего механизма проверки fk.
...
Рейтинг: 0 / 0
Permission Denied и двойное обновление одного и тоже поля
    #39762226
n@vigator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,
права есть на все таблицы, выполнена команда

Код: plsql
1.
grant b to a



попробовал выполнить запрос из-под validator

Код: plsql
1.
select 1 from markup.dic_attrs



выполнился без проблем
...
Рейтинг: 0 / 0
Permission Denied и двойное обновление одного и тоже поля
    #39762241
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
n@vigator,

можете на основе:
- pg_dumpall -g вытащить всё относящееся к пользователю
- pg_dump -s своей базы
Собрать воспроизводимый пример?

У меня не вышло воспроизвести
...
Рейтинг: 0 / 0
Permission Denied и двойное обновление одного и тоже поля
    #39762244
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
n@vigatorMaxim Boguk,
права есть на все таблицы, выполнена команда

Код: plsql
1.
grant b to a



попробовал выполнить запрос из-под validator

Код: plsql
1.
select 1 from markup.dic_attrs



выполнился без проблем

очень странно...
у вас 100% стандартный ванильный postgresql (а не какой то левый форк)?
никаких странных вещей типа RLS не используете?
в каталоге руками не ковырялись?

если клонировать схему базы с правами в чистую базу на этом же кластере - проблема остается?
если да было бы интересно увидеть dump схемы полный.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Permission Denied и двойное обновление одного и тоже поля
    #39762315
n@vigator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Postgresql скачан с www.postgresql.org 11 версия.
К сожалению передать dump не смогу, а то будут всякие кары ((
Причем такое получается только под пользователе validator, а если выполнить теже запросы в консоле из-под postgresвсе работает.
...
Рейтинг: 0 / 0
Permission Denied и двойное обновление одного и тоже поля
    #39762328
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
n@vigatorPostgresql скачан с www.postgresql.org 11 версия.
К сожалению передать dump не смогу, а то будут всякие кары ((
Причем такое получается только под пользователе validator, а если выполнить теже запросы в консоле из-под postgresвсе работает.

Таак bypassRLS меня у postgresql смущает.
Я уже спрашивал про не используется ли у вас RLS.
Если используется - без схемы базы тут ничего мы не поймем.
В нормальной ситуации такого НЕ БЫВАЕТ как у вас.

Я бы предположил как гипотезу странное влияние RLS на проверку FK.

PS: еще раз предлагаю попробовать на чистой базе воспроизвести проблему.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Permission Denied и двойное обновление одного и тоже поля
    #39762334
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukТаак bypassRLS меня у postgresql смущает.
postgres разве не дефолтно BYPASSRLS?
...
Рейтинг: 0 / 0
Permission Denied и двойное обновление одного и тоже поля
    #39762451
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Воспроизвести можно так. Из под суперпользователя postgres:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
=# create role a login;
CREATE ROLE
=# create role b login;
CREATE ROLE
d=# create schema a;
CREATE SCHEMA
=# create table a.t1(id int primary key);
CREATE TABLE
=# create table a.t2(id int references a.t1(id));
CREATE TABLE
=# alter table a.t1 owner to a;
ALTER TABLE
=# alter table a.t2 owner to a;
ALTER TABLE
=# alter schema a owner to b;
ALTER SCHEMA
=# grant all on a.t1 to b;
GRANT
=# grant all on a.t2 to b;
GRANT
=# insert into a.t1 values(1);
INSERT 0 1


Подключаемся под b, который владелец схемы и имеет все права на таблицы, и получаем ошибку:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
d=# \c - b
You are now connected to database "d" as user "b".
d=> \dt a.*
       List of relations
 Schema | Name | Type  | Owner 
--------+------+-------+-------
 a      | t1   | table | a
 a      | t2   | table | a
(2 rows)

d=> \dn+ a
                List of schemas
 Name | Owner | Access privileges | Description 
------+-------+-------------------+-------------
 a    | b     |                   | 
(1 row)

d=> insert into a.t2 values(1);
ERROR:  permission denied for schema a
LINE 1: SELECT 1 FROM ONLY "a"."t1" x WHERE "id" OPERATOR(pg_catalog...
                           ^
QUERY:  SELECT 1 FROM ONLY "a"."t1" x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR KEY SHARE OF x


Не поможет даже суперпользователь:
Код: sql
1.
2.
3.
4.
5.
6.
7.
d=> \c - postgres 
You are now connected to database "d" as user "postgres".
d=# insert into a.t2 values(1);
ERROR:  permission denied for schema a
LINE 1: SELECT 1 FROM ONLY "a"."t1" x WHERE "id" OPERATOR(pg_catalog...
                           ^
QUERY:  SELECT 1 FROM ONLY "a"."t1" x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR KEY SHARE OF x


Дело в том, что проверка внешнего ключа выполняется с правами владельца таблицы(в нашем случае a), а не пользователя выполняющего запрос.

Думаю, что у вас владельцем таблиц в схеме markup является пользователь markup и у него нет прав на схему markup.
Попробуйте выполнить из под postgres:
Код: sql
1.
GRANT USAGE ON SCHEMA markup TO markup;


По идее ошибка должна уйти.
...
Рейтинг: 0 / 0
Permission Denied и двойное обновление одного и тоже поля
    #39762700
n@vigator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузанов,

Спасибо!
Все заработало!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Permission Denied и двойное обновление одного и тоже поля
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]