2013-03-20 1 views
174

Я попытался запустить простую команду SQL:Разрешение отказано в связи

select * from site_adzone; 

и я получил эту ошибку

ERROR: permission denied for relation site_adzone 

Что может быть проблема?

Я также попытался сделать выбор для других таблиц и получил такую ​​же проблему. Я также попытался это сделать:

GRANT ALL PRIVILEGES ON DATABASE jerry to tom; 

, но я получил этот ответ от консоли

WARNING: no privileges were granted for "jerry" 

У вас есть некоторое представление о том, что может быть не так?

+0

Я не уверен, как обновить разрешения, так что я могу читать/писать в БД – bla0009

+1

Вы должны предоставить необходимые привилегии: HTTP: // WWW. http://www.postgresql.org/docs/current/static/sql-grant.html –

+2

Добро пожаловать в SO! По этому вопросу вы можете получить дополнительную помощь на dba.stackexchange.com, хотя вы можете найти столько комментариев snide :) –

ответ

219

GRANT в базе данных не то, что вам нужно. Грант на таблицах напрямую.

Предоставление привилегий в базе данных в основном используется для предоставления или отзыва привилегий подключения. Это позволяет указать, кто может делать вещи в базе данных, если они имеют достаточные другие разрешения.

Вы хотите вместо этого:

GRANT ALL PRIVILEGES ON TABLE side_adzone TO jerry; 

Это будет заботиться об этой проблеме.

+0

Я пробовал это предоставить все привилегии на столе site_adzone для jerry; и получил этот ответ ОШИБКА: разрешение отклонено за отношение site_adzone – bla0009

+5

запустите его как суперпользователь, как postgres. –

+11

Может ли это быть ярлык каким-то образом? ПРЕДОСТАВЛЯТЬ ВСЕ ПРИВИЛЕГИИ НА ВСЕХ ТАБЛИЦЕ? – Shadur

132

Проводка Ron E отвечает за предоставление привилегий на всех таблицах, поскольку это может быть полезно другим.

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry; 
+2

этот правильный ответ! другой - только для разрешения для одной таблицы. – stackdave

+7

Возможно, вам также понадобится выполнить аналогичную команду для «ВСЕ ПОСЛЕДОВАТЕЛЬНОСТИ» и «ВСЕ ФУНКЦИИ». – Pistos

29

Подключение к правой базе первого, а затем запустить:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry; 
+0

благодаря подключению к правой базе данных было НЕ Я делал раньше! – asgs

+2

подключение к правой базе данных делает HUGE dufference :) '\ connect databasename;' –

+0

ЭТО. Я все время был связан с «постгресами». Спасибо! –

5

Предоставление разрешений для существующих таблиц используйте:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema> TO <role> 

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

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> 
    GRANT <privileges> ON TABLES TO <role>; 

, например.

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO admin; 

Если вы используете SERIAL или BIGSERIAL столбцы, то вы, вероятно, хотите сделать то же самое для SEQUENCES, иначе ваш INSERT потерпит неудачу (Postgres 10's IDENTITY не страдает от этой проблемы, и рекомендуется в течение SERIAL типов) , т.е.

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> GRANT ALL ON SEQUENCES TO <role>; 

Смотрите также мой ответ PostgreSQL Permissions for Web App для получения более подробной информации и многократного использования сценария.

Ref:

GRANT

ALTER DEFAULT PRIVILEGES