如何从Postgres数据库中删除用户

54

我有以下的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

然而,当我使用该命令时,没有任何反应。文档也没有提供任何提示,说明为什么这不起作用,也没有提供清晰的示例。
话虽如此——删除此用户的命令是什么?

7
删除 tutorial1 角色。参考链接:http://www.postgresql.org/docs/9.4/static/sql-droprole.html - Dmitry S
7
我认为你在语句结尾忘记了分号 ; - Dmitry S
6
所有语句都必须以 ; 结尾。 - user330315
1
删除用户 "user_name"; - Sreekant Shenoy
6个回答

69

我已经浪费了太多时间尝试找到缓解压力的方法。除了上面提到的方法(或者可能作为完全替代),请参考这个类似问题的答案:https://dev59.com/TGkw5IYBdhLWcg3whK08#11750309

DROP OWNED BY your_user;
DROP USER your_user;

对我起了作用


这会删除你的用户拥有的所有对象,对吗?我们可能应该编辑这个答案并包含一个大警告? - KayakinKoder

36

如果你像我一样发现自己无法删除用户,以下模板可能会有所帮助:

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;

如果用户在其他模式中拥有权限,则您将需要使用正确的模式替换“public”运行相应的REVOKE命令。要显示用户的所有模式和权限类型,我编辑了 \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%';

我不确定哪些特权类型适用于撤销表、序列或函数,但我想它们中的所有类型都属于这三种之一。


2
如果我已经授予了一个用户对模式(schema)的“使用”权限,那么我不得不从user_y撤销所有在schema_x上的权限。 - ryantuck
1
这对我来说是缺失的一块拼图:REASSIGN OWNED BY <olduser> TO <newuser>。 - influent

25

您的命令是正确的,但是您忘记在命令结尾处放置 ;

请尝试像这样操作

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

1
因为出现了错误 ERROR: role "tutorial1" cannot be dropped because some objects depend on it,我对你的答案进行了投反对票。 - kabrice
9
@kabrice:那个踩的操作是错误的。对象依赖于角色的事实与如何运行删除角色语句的问题无关。 - user330315

22

在 Ubuntu 终端中的首要操作:

$ sudo -su postgres
$ psql postgres

接着在 Postgres 的终端中执行:

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

[注意]:

不要忘记分号";"


[更新]:

如果你的Postgres位于docker容器中...


5

Timofey的回答对我几乎起作用,但我还需要在模式级别撤销权限。因此,我的删除脚本如下:

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 编辑:
在再次尝试时,我遇到了错误 ERROR: role cannot be dropped because some objects depend on it
所以我不得不将来自这个答案的代码添加到我的脚本中 https://dev59.com/RlUK5IYBdhLWcg3wyill#51257346

4

如果您的用户名中包含点符号test.user

drop user test.user;

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

drop user "test.user";

应该解决它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接