Назад | Перейти на главную страницу

Postgres INSERT ERROR: доступ запрещен для публичной схемы

В 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.