В Postgres я создал следующую таблицу внутри базы данных с именем testing
:
CREATE TABLE category_google_taxonomy (
category_id integer references category ON UPDATE CASCADE ON DELETE CASCADE,
google_taxonomy_id integer references google_taxonomy ON UPDATE CASCADE ON DELETE CASCADE
);
Когда я пытаюсь заполнить таблицу:
INSERT INTO category_google_taxonomy (category_id, google_taxonomy_id) VALUES
(1,7),
(2,12);
Я получаю следующую ошибку:
ERROR: permission denied for schema public
LINE 1: SELECT 1 FROM ONLY "public"."category" x WHERE "category_id"...
^
QUERY: SELECT 1 FROM ONLY "public"."category" x WHERE "category_id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x
Я немного прочитал и в конце концов согласился ALL PRIVILEGES
от раздражения, но все равно не работает:
testing=# GRANT ALL PRIVILEGES ON public.category TO testing;
GRANT
testing=# \dp category_google_taxonomy
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+--------------------------+-------+-------------------------+--------------------------
public | category_google_taxonomy | table | testing=arwdDxt/testing |
: super=arwdDxt/testing
testing=# \dp category
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+----------+-------+------------------------+--------------------------
public | category | table | testing=arwdDxt/super | category_id:
: testing=arwx/super
(1 row)
По предложению @ Daniel я попробовал GRANT USAGE ON schema public TO super;
, теперь, когда я запускаю INSERT
команду я получаю:
ERROR: permission denied for relation category
CONTEXT: SQL statement "SELECT 1 FROM ONLY "public"."category" x WHERE "category_id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x"
Вот соответствующая часть \d
:
public | category | table | super
public | category_google_taxonomy | table | testing
Предполагая, что имя пользователя testing
, вы, вероятно, захотите:
GRANT ALL ON schema public TO testing;
Примечание о предоставлении ALL PRIVILEGES
: вы не говорите о чем это GRANT
команда была применена. Предполагая, что это было ON DATABASE...
, это просто означает CONNECT
, CREATE
и TEMP
привилегии, ничего о публичной схеме или любом другом содержащемся объекте, поэтому он «не работает».
РЕДАКТИРОВАТЬ: когда этого недостаточно
Если таблицы, на которые ссылаются внешние ключи, не принадлежат testing
, их владельцу также необходимо иметь USAGE
привилегия в схеме для поиска таблиц, на которые есть ссылки.
Это не очевидно из результата \dp
(результат \d
сказал бы точно) но если category
принадлежит super
и этот пользователь также не имеет прав на схему, вам нужно будет назначить его с помощью:
GRANT USAGE ON schema public TO super;
Мне удалось решить это, выполнив:
ALTER TABLE category OWNER TO testing;
После чего INSERT
прошло гладко. Меня беспокоит, что я мог сломать другие вещи, сменив владельца с супер, но это еще предстоит выяснить.
Теоретически, пользователь имеет право выбора в родительской таблице, что достаточно для вставки в дочернюю таблицу. Необязательно быть владельцем родительской таблицы. Я считаю, что это ошибка postgresql.