如何从 Postgres 数据库中删除用户 [重复]

Posted

技术标签:

【中文标题】如何从 Postgres 数据库中删除用户 [重复]【英文标题】:How to Drop User from Postgres Database [duplicate] 【发布时间】:2016-03-08 08:58:22 【问题描述】:

我有以下 postgres 用户,可以通过在终端中调用 \du 命令来查看,如下所示:

postgres=# \du 

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

根据postgres documentation,我应该可以通过输入以下命令删除名为“tutorial1”的用户:

postgres=# DROP USER tutorial1

但是,当我使用该命令时,没有任何反应。该文档没有提供任何关于为什么这不起作用的提示,也没有提供明确的示例。

话虽如此——删除该用户的命令是什么?

【问题讨论】:

DROP ROLE tutorial1; postgresql.org/docs/9.4/static/sql-droprole.html 我假设你忘记了语句末尾的分号; 所有语句都必须以;结尾 drop user "user_name"; 不要忘记双引号 【参考方案1】:

您的命令没问题,但您忘记在命令末尾加上;

这样试试

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

【讨论】:

因为这个错误ERROR: role "tutorial1" cannot be dropped because some objects depend on it而否决了你的答案 @kabrice:反对票是错误的。对象依赖于角色这一事实与如何运行语句以删除角色的问题无关【参考方案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,但我认为它们都属于三者之一。

【讨论】:

如果我已经将该架构上的usage 授予用户,我必须revoke all privileges on schema schema_x from user_y 这对我来说是缺失的部分:REASSIGN OWNED BY TO 【参考方案3】:

首先在 Ubuntu 终端操作:

$ sudo -su postgres
$ psql postgres

然后在 postgres 的终端:

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

[注意]:

别忘了分号";"


[更新]:

If your Postgres is located in a docker container ...

【讨论】:

【参考方案4】:

蒂莫菲的回答几乎对我有用,但我还需要在架构级别撤销权限。所以我的放置脚本看起来像这样:

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

编辑:

再次尝试时,我得到了错误

错误:无法删除角色,因为某些对象依赖于它

所以我不得不将此答案中的代码添加到我的脚本中 https://***.com/a/51257346/9540123

【讨论】:

【参考方案5】:

我已经浪费了太多时间来寻找所有可以放松的东西。除了上述(或可能作为一个完整的替代),请参阅此回答类似的问题:https://***.com/a/11750309/647581

DROP OWNED BY your_user;
DROP USER your_user;

帮我搞定了

【讨论】:

是的,这对我有用。谢谢【参考方案6】:

如果您的用户名 test.user 中有点

drop user test.user;

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

drop user "test.user";

应该解决它。

【讨论】:

以上是关于如何从 Postgres 数据库中删除用户 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

从 Mac 中删除旧的 Postgres 版本 [重复]

如何删除使用 array_agg postgres 函数生成的重复项

如果用户有依赖对象,如何在 postgres 中删除用户

如何从 Postgres Heroku 上的先前备份中恢复特定数据? (例如,意外删除的行)

在 postgres 中删除所有共享相同前缀的表

如何从MySql中删除重复用户但保存原始用户[重复]