2015-07-04 3 views
1

Я использую PostgreSQL 9.4 для Windows 7 SP1 64bit, и у меня есть проблема при отзыве ролей. Предположим, у меня три пользователя: Тейлор, Мишель и суперпользователи. Как Postgres, я признаю роль «utente» Тейлор с опцией администратораPostgreSQL не рекурсивно отменяет роли

[email protected]:5432 
GRANT utente TO taylor WITH ADMIN OPTION; 

Тогда, как Тейлор, Выдаая ролью utente к Michelle

[email protected]:5432 
GRANT utente TO michelle; 

Наконец, как Postgres, Я отменяю роль utente от тейлоровского

[email protected]:5432 
REVOKE utente FROM taylor 

роль должны быть рекурсивно отозван Michelle тоже, потому что она получила роль только из Тейлор. Но это не так, Тейлор теряет роль, но мишель держит его. Я попытался запустить команду с опцией RESTRICT, которая должна помешать ее исполнению, но она не работает, команда выполняется точно так же, тэйлор теряет роль, а michelle сохраняет ее. Может ли кто-нибудь объяснить мне это, пожалуйста?

Спасибо.

+0

* «Роль должна была быть рекурсивно отозвана из мишель, потому что она получила роль от Тейлора» *. Это большое предположение. Во многих случаях это было бы очень нехорошо. Представьте, что taylor устанавливает учетную запись пользователя michelle, а затем покидает компанию. Вы не хотите, чтобы доступ Тейлора был отменен. –

+0

Действительно, по умолчанию он должен применять опцию RESTRICT и не выполнять команду, сообщая мне, что есть зависимые привилегии/роли, которые будут отменены. Если я использую вариант CASCADE, он должен удалить все роли, предоставленные пользователем, из которого я отменяю, но это не так. Я не понимаю, почему. – DevOlly

+0

Вы пытались сделать «REVOKE ADMIN OPTION» для taylor CASCADE; '* before * doing' REVOKE utente FROM taylor CASCADE; '? – Renzo

ответ

0

Опция RESTRICT неявно применяется PostgreSQL, поэтому вам не нужно явно указывать ее.

Согласно documentation:

Пользователь может отменить только привилегии, которые были предоставлены непосредственно пользователем. Если, например, пользователь A предоставил привилегию с возможностью предоставления пользователю B, а пользователь B в свою очередь предоставил его пользователю C, тогда пользователь A не может отменить привилегию непосредственно из C. Вместо этого пользователь A может отменить вариант предоставления от пользователя B и использовать опцию CASCADE, так что эта привилегия в свою очередь отозвана пользователя C.

Итак:

REVOKE utente FROM taylor CASCADE; 

Но, как вы отмечаете, это не работает. Похоже, это ошибка или ошибка в документации.

В чистой перспективе:

[email protected]:~$ psql -d pfams 
psql (9.4.4) 
Type "help" for help. 

pfams=# SET SESSION AUTHORIZATION postgres; 
SET 
pfams=# CREATE ROLE utente NOLOGIN; 
CREATE ROLE 
pfams=# CREATE ROLE taylor LOGIN; 
CREATE ROLE 
pfams=# CREATE ROLE michelle LOGIN; 
CREATE ROLE 
pfams=# GRANT utente TO taylor WITH ADMIN OPTION; 
GRANT ROLE 
pfams=# SET SESSION AUTHORIZATION taylor; 
SET 
pfams=> GRANT utente TO michelle; 
GRANT ROLE 
pfams=# SET SESSION AUTHORIZATION postgres; 
SET 
pfams=# REVOKE utente FROM taylor CASCADE; 
REVOKE ROLE 
pfams=# \du taylor 
      List of roles 
Role name | Attributes | Member of 
-----------+------------+----------- 
taylor |   | {} 

pfams=# \du michelle 
      List of roles 
Role name | Attributes | Member of 
-----------+------------+----------- 
michelle |   | {utente} 

Возможно, что-то сообщить о PostgreSQL ошибок в список рассылки.

+0

Я уже пробовал это, но он не работает, он делает то же самое, отменяет от Тейлора, но не от michelle – DevOlly

+0

@DevOlly Вы правы, похоже на ошибку. См. Расширенный ответ выше. – Patrick

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