2014-12-05 4 views
0

У меня есть PostgreSQL (9.3.5) кластер со следующими ролями: (. Первые две записи были созданы динамически, когда новые пользователи были добавлены в приложение)PostgreSQL 9.3.5 цифровое название роли

dochazka-test=> \du 
           List of roles 
Role name |     Attributes     | Member of 
-----------+------------------------------------------------+------------ 
1   |            | {admin} 
2   |            | {passerby} 
active | Cannot login         | {everyone} 
admin  | Cannot login         | {everyone} 
dochazka |            | {admin} 
everyone | Cannot login         | {} 
inactive | Cannot login         | {everyone} 
passerby | Cannot login         | {everyone} 
postgres | Superuser, Create role, Create DB, Replication | {} 

Как вы можете видеть, обе роли «дочазка» и «1» находятся в роли «admin», которая находится в роли «каждого». Для всех ролей установлено значение INHERIT.

Роль «всех» имеет все привилегии для всех таблиц, функций и последовательностей в схеме «public».

Как и ожидалось, я могу запускать SELECT на таблицах в базе данных, когда я подключаюсь как пользователь «дочазка». Тем не менее, я не могу запустить те же ВЫБИРАЕТ при подключении к той же базе данных, как пользователь «1»:

$ psql -U 1 dochazka-test 
Password for user 1: 
psql (9.3.5) 
Type "help" for help. 

dochazka-test=> select * from employees; 
ERROR: permission denied for relation employees 

Может быть, что PostgreSQL имеет фундаментальную проблему с числовыми именами ролей?

ответ

1

Идентификаторы и каталоги используют тип name, который похож на варчар, но не совсем. Некоторая магия продолжается, чтобы сделать имена чувствительными к регистру, если они не указаны как идентификаторы, и есть некоторые ограничения, чтобы упростить синтаксический анализ строк SQL, таких как ограничения на первый символ (например, не число), если они не указаны.

Это не означает, что вы не можете использовать идентификаторы в верхнем регистре или начинать с номера. Скорее, вы должны указать оскорбительные идентификаторы, когда вы делаете: select * from "0_Foo".

Мое предположение заключается в том, что вам либо не хватает двойных кавычек, либо клиент, которого вы используете, не правильно цитирует идентификаторы. (Я только что протестировал, и он отлично работает с psql.)

Какая бы проблема ни была, я бы посоветовал не использовать такие идентификаторы, даже если он поддерживается на бумаге, и предложил бы использовать более разговорчивые имена ролей, такие как как server_1.

Редактировать: альтернативно, возможно, вы неправильно настроили свои права.

+0

держать пресса - я вижу, что роль «дочазки» получает то же разрешение, что и ошибка! извините, может быть, это красная селедка. – smithfarm

+0

Также включайте результат 'select current_user;' - вы можете войти в систему как гость. –

0

Извините, все. Этот вопрос был недостаточно подготовлен.

Проблема заключалась в том, что я (тупо) работает оператор

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO everyone 

перед тем создания таблиц!

Что касается имен числовых ролей, ни psql, ни Perl DBI, похоже, не имеют с ними никаких проблем.

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