2016-08-26 8 views
1

Я использую pgAdmin III на Mac Yosemite. Я создал роль «скидка» и создал «скидку» базы данных. В инструменте pgadmin, как я могу предоставить пользователям «скидку» для подключения привилегий (и привилегий чтения/записи таблиц) к «скидке» базы данных? В настоящее время, когда я пытаюсь Войти в командной строке я получаю эту ошибкуpgadmin: get "DETAIL: у пользователя нет привилегии CONNECT." error

davea$ psql -h localhost -d discount -U discount 
Password for user discount: 
psql: FATAL: permission denied for database "discount" 
DETAIL: User does not have CONNECT privilege. 
+2

Вы можете использовать команду GRANT для предоставления разрешений [здесь] (https://www.postgresql.org/docs/9.0/static/sql-grant.html) является официальным документом –

+0

Эта ссылка не имеет ничего общего с инструментом pgadmin – Dave

+0

Вопрос не имеет ничего общего с pgAdmin III, я думаю. Вы можете выпустить пропущенную инструкцию «GRANT» с помощью pgAdmin III, если хотите. –

ответ

4

Разрешение на текущие объекты

иметь доступ для чтения/записи таблиц читать, вам нужно использовать GRANT command в 3-х уровнях:

  1. БАЗА ДАННЫХ
  2. СХЕМА
  3. TABLES, функции, последовательности и т.д.

Во-первых, вам нужно CONNECT привилегию на базе:

GRANT CONNECT ON DATABASE <dbname> TO <username>; 

Во-вторых, вам нужно USAGE привилегию на схеме внутри базы данных (вы должны подключиться к базе данных перед запуском):

GRANT USAGE ON SCHEMA <schemaname> TO <username>; 

Наконец, вы можете предоставить привилегию по таблицам, предположим, что вы хотите использовать общие DML и SELECT для всех таблиц в схеме и другие разрешения:

GRANT SELECT,INSERT,UPDATE,DELETE ON ALL TABLES IN SCHEMA <schemaname> TO <username>; 
-- and the sequences, for INSERT to work 
GRANT USAGE ON ALL SEQUENCES IN SCHEMA <schemaname> TO <username>; 
-- and the functions 
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA <schemaname> TO <username>; 

По умолчанию разрешение для объектов, созданных в будущем

Теперь вы должны заметить что-то. У каждой базы данных и каждой схемы и каждого объекта (таблицы, функции и т. Д.) Есть владелец. Владелец - это пользователь, который будет управлять и запускать DDL-команды на нем. Как правило, вы должны запускать все вышеперечисленные команды при подключении как пользователя, которому принадлежит все, потому что у этого пользователя уже есть все разрешения (вы также можете использовать SUPERUSER, но я рекомендую хранить его только для задач DBA).

Вышеуказанные команды GRANT ... ON ALL ... IN SCHEMA предоставят разрешения для объектов, уже присутствующих в базе данных, но не будут применяться к новым созданным объектам. Для этого вы можете использовать ALTER DEFAULT PRIVILEGES (I'll call it ADP) command. Как и прежде, вы должны работать, что при подключении в качестве владельца, потому что вы должны иметь в виду, что АДФ применяется только тогда, когда владелец нового объекта совпадает с той, которая используется здесь (или установить в FOR ROLE clause):

ALTER DEFAULT PRIVILEGES IN SCHEMA <schemaname> 
    GRANT SELECT,INSERT,UPDATE,DELETE ON TABLES TO <username>; 
-- and the sequences, for INSERT to work 
ALTER DEFAULT PRIVILEGES IN SCHEMA <schemaname> 
    GRANT USAGE ON SEQUENCES TO <username>; 
-- and the functions 
ALTER DEFAULT PRIVILEGES IN SCHEMA <schemaname> 
    GRANT EXECUTE ON FUNCTIONS TO <username>; 

Вы также можете пропустить IN SCHEMA <schemaname> сверху и применить его для любой схемы, которую вы создали или создаете в будущем. Но опять же, будьте осторожны, даже если вы не указали FOR ROLE <rolename>, что означает, что он будет применяться к , текущий подключенный к пользователю, поэтому только объекты, созданные этим <rolename>, рассмотрят команду ADP.

Для хорошего управления разрешениями я настоятельно рекомендую вам следить за тем, какой пользователь владеет объектами. В большинстве случаев я также рекомендую вам хранить только одного владельца для всего, что находится внутри базы данных (если вы не являетесь продвинутым пользователем и не знаете, что делаете), таким образом упростить управление разрешениями.