Я предполагаю, что проблема заключается в «FOR SHARE OF» в этом операторе select - чтобы иметь возможность создать эту блокировку строки, вам необходим как минимум какой-то доступ на запись в таблицу.
например, если я создаю таблицу и предоставляю себе только SELECT доступ к ней:
postgres@testdb=# create table t(t1_id serial primary key, value text);
NOTICE: CREATE TABLE will create implicit sequence "t_t1_id_seq" for serial column "t.t1_id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "t_pkey" for table "t"
CREATE TABLE
postgres@testdb=# insert into t(value) values('foo');
INSERT 0 1
postgres@testdb=# grant select on t to steve;
GRANT
сейчас, хотя я могу читать строки из таблицы, я не могу их заблокировать:
steve@testdb@[local] => select * from t;
t1_id | value
-------+-------
1 | foo
(1 row)
steve@testdb@[local] => select * from t for share;
ERROR: permission denied for relation t
Делая предположение сейчас ... предположительно, реализация внешних ключей работает, проверяя наличие целевых строк во внешних таблицах и устанавливая контекст авторизации для этого на основе владельца исходной таблицы или целевой таблицы ... TBH IЯ никогда не отменял привилегии владельца таблицы, поэтому я не сталкивался с этим раньше.
Я предполагаю, что это происходит потому, что вам не нужна учетная запись, которая имеет доступ ко всем таблицам просто потому, что они их создали?Я хотел бы предложить:
- Выполнить изменения схемы как «postgres» или какой-либо другой суперпользователь, который имеет ограниченный доступ в pg_hba.conf
- В качестве альтернативы, выполнить изменения схемы как некоторый пользователь (например, база данных)владелец), который не имеет доступа к логину, используя
set session authorization
из 'postgres' или другого суперпользователя