2014-09-05 3 views
4

Пожалуйста, объясните вывод команды \z в PostgreSQL. Я понимаю разрешение, я прочитал документацию, но почему-то я пропустил интерпретацию вывода \z.Разрешения PostgreSQL объяснены

datastore_default=> \z 

            Access privileges 
Schema |  Name  | Type |   Access privileges   | Column access privileges 
--------+-----------------+-------+-----------------------------------+-------------------------- 
public | _table_metadata | view | ckan_default=arwdDxt/ckan_default+| 
     |     |  | datastore_default=r/ckan_default +| 
     |     |  | readonlyuser=r/ckan_default  +| 
public | foo    | table | ckan_default=arwdDxt/ckan_default+| 
     |     |  | datastore_default=r/ckan_default +| 
     |     |  | readonlyuser=r/ckan_default  +| 

Как-то readonlyuser кажется, чтобы иметь возможность читать таблицы foo и _foo, но на практике она не может. Обе команды возвращают ошибку:

sudo -u postgres psql -d datastore_default -U readonlyuser -c 'SELECT * FROM foo' 
sudo -u postgres psql -d datastore_default -U readonlyuser -c 'SELECT * FROM public.foo' 
ERROR: permission denied for schema public 
LINE 1: SELECT * FROM public.foo 

Редактировать: по-видимому, у меня плохое представление о том, как работают права доступа к базе данных и схемы. Прежде всего, только администратор db (пользователь postgres) или владелец базы данных (в моем случае пользователь ckan_default) могут предоставлять другие права пользователей в конкретной базе данных. Схема находится только на уровне базы данных, поэтому вполне нормально, что я добавил readonlyuser разрешение на просмотр общедоступной схемы, в любом случае он не может выбирать из других баз данных.

+0

Я добавил некоторые данные о чтении ACL к моему ответу. – Eelke

ответ

14

ошибка говорит нет прав для схемы общественного (курсив мой)

Вы должны дать права readonlyuser на схеме общественности:

GRANT USAGE ON SCHEMA public TO readonlyuser; 

Содержимое ACL объясняется на this page. Наиболее значимая часть цитируемая здесь:

rolename=xxxx -- privileges granted to a role =xxxx -- privileges granted to PUBLIC

 r -- SELECT ("read") 
     w -- UPDATE ("write") 
     a -- INSERT ("append") 
     d -- DELETE 
     D -- TRUNCATE 
     x -- REFERENCES 
     t -- TRIGGER 
     X -- EXECUTE 
     U -- USAGE 
     C -- CREATE 
     c -- CONNECT 
     T -- TEMPORARY 
    arwdDxt -- ALL PRIVILEGES (for tables, varies for other objects) 
     * -- grant option for preceding privilege 

    /yyyy -- role that granted this privilege 

+ является часть пути PSQL форматирует результат, они не являются частью значения.

+2

Спасибо, но он все еще не работает. 'sudo -u postgres psql -d datastore_default -U ckan_default -c 'ПРИМЕНЕНИЕ GRANT НА SCHEMA public TO readonlyuser;' ПРЕДУПРЕЖДЕНИЕ: для «публичных» не было предоставлено никаких привилегий GRANT'. \ z печатает то же самое. У меня PostgreSQL 9.1.14 (Ubuntu 12.04 LTS) – ddreian

+1

Я думаю, что он дает это сообщение, когда пользователь, с которым вы вошли в систему, не имеет достаточных прав для предоставления этих прав. Вы должны иметь привилегии GRANT или быть владельцем публики или быть суперпользователем. – Eelke

+0

спасибо. понятно теперь. У меня сложилось впечатление, что + имеет какое-то особое значение. – ddreian

Смежные вопросы