Postgres INSERT ERROR: permissão negada para o esquema público

5

No Postgres, criei a tabela a seguir dentro de um banco de dados chamado 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
);

Quando tento preencher a tabela:

INSERT INTO category_google_taxonomy (category_id, google_taxonomy_id) VALUES
(1,7),
(2,12);

Eu recebo o seguinte erro:

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

Eu li um pouco e, finalmente, concedeu ALL PRIVILEGES de exasperação, mas ainda não funciona:

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)

Em @ sugestão de Daniel eu tentei GRANT USAGE ON schema public TO super; , agora quando eu executo o comando INSERT eu recebo:

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"

Aqui está a parte relevante de \d :

public | category                               | table    | super
public | category_google_taxonomy               | table    | testing
    
por Rudolf Vavruch 17.03.2013 / 21:07

2 respostas

9

Supondo que o nome de usuário seja testing , provavelmente você desejará fazer isso:

GRANT ALL ON schema public TO testing;

Nota sobre a concessão de ALL PRIVILEGES : você não diz em que esse comando GRANT foi aplicado. Assumindo que era ON DATABASE... , significa apenas CONNECT , CREATE e TEMP privileges, nada sobre o esquema público ou qualquer outro objeto contido, e é por isso que "não funciona".

EDIT: quando isso não for suficiente

Se as tabelas referenciadas pelas chaves estrangeiras não forem de propriedade de testing , o proprietário também precisará ter o privilégio USAGE no esquema para consultar as tabelas referenciadas.

Não é óbvio pelo resultado de \dp (o resultado de \d diria com certeza), mas se category pertencer a super e esse usuário também não tiver privilégio no esquema, você precisa atribuí-lo com:

GRANT USAGE ON schema public TO super;
    
por 17.03.2013 / 22:00
1

Consegui resolver isso fazendo:

ALTER TABLE category OWNER TO testing;

Após o qual o INSERT foi suavemente. Eu estou preocupado que eu possa ter quebrado outras coisas, mudando o dono de super, mas isso continua a ser visto.

    
por 18.03.2013 / 20:07