Как удалить пользователя из базы данных Postgres

У меня есть следующие пользователи postgres, которые я могу просмотреть, вызывая команду \du в терминале следующим образом:

postgres=# \du 

                            List of roles
 Role name |                   Attributes                   | Member of
-----------+------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication | {}
 tutorial1 |                                                | {}

В соответствии с документацией postgres, я должен удалить пользователя под названием "tutorial1", введя следующую команду:

postgres=# DROP USER tutorial1

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

Как говорится, какова команда, чтобы удалить этого пользователя?

Ответ 1

Ваша команда в порядке, но вы забудете положить ; в конце команды.

Попробуйте это

postgres=# DROP USER tutorial1; (Note I put semicolon at the end)

Ответ 2

Если вы окажетесь здесь (например, я), потому что вы не можете удалить пользователя, может оказаться полезным следующий шаблон:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM tutorial1;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM tutorial1;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM tutorial1;
DROP USER tutorial1;

Пользователь может иметь привилегии в других схемах, и в этом случае вам нужно будет запустить соответствующую строку REVOKE с "public", замененную правильной схемой. Чтобы показать все схемы и типы привилегий для пользователя, я отредактировал команду \dp, чтобы сделать этот запрос:

SELECT 
  n.nspname as "Schema",
  CASE c.relkind 
    WHEN 'r' THEN 'table' 
    WHEN 'v' THEN 'view' 
    WHEN 'm' THEN 'materialized view' 
    WHEN 'S' THEN 'sequence' 
    WHEN 'f' THEN 'foreign table' 
  END as "Type"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE pg_catalog.array_to_string(c.relacl, E'\n') LIKE '%postgres%';

Я не уверен, какие типы привилегий соответствуют отзыву TABLES, SEQUENCES или FUNCTIONS, но я думаю, что все они попадают под одну из трех.

Ответ 3

Я потратил слишком много времени, пытаясь найти все, чтобы расслабиться. В дополнение к вышесказанному (или, возможно, в качестве полной замены), обратитесь к этому ответу на аналогичный вопрос: fooobar.com/questions/437101/...

DROP OWNED BY your_user;
DROP USER your_user;

помогло

Ответ 4

Первые действия в терминале Ubuntu:

$ sudo -su postgres
$ psql postgres

затем в терминале postgres:

# \du
# drop user 'user_name';
# \du

[ ПРИМЕЧАНИЕ ]:

Не забывайте точку с запятой ";"

Ответ 5

Ответ от Тимофея почти сработал для меня, но мне также нужно было отозвать разрешения на уровне схемы. Итак, мой сценарий удаления выглядит так:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM tutorial1;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM tutorial1;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM tutorial1;
REVOKE ALL PRIVILEGES ON SCHEMA public FROM tutorial1;
DROP USER tutorial1;

Так что отзыв может произойти на любом из уровней, которые здесь происходят:

https://www.postgresql.org/docs/9.1/static/sql-revoke.html

Ответ 6

Если у вас есть точка в имени пользователя test.user

drop user test.user;

ERROR:  42601: syntax error at or near "."

drop user "test.user";

Должен решить это.