PostgreSQL - 如何使用现有权限快速删除用户

时间:2010-06-11 14:26:07

标签: postgresql

我正在尝试为我正在处理的应用程序创建受限制的数据库用户,我想删除我正在用于实验的Postgres数据库用户。有没有办法放弃用户而不必先手动撤销所有权利,或撤销用户拥有的所有权限?

10 个答案:

答案 0 :(得分:114)

怎么样

DROP USER <username>

这实际上是DROP ROLE的别名。

您必须明确删除与该用户关联的任何权限,同时将其所有权移至其他角色(或删除该对象)。

最好通过

实现
REASSIGN OWNED BY <olduser> TO <newuser>

DROP OWNED BY <olduser>

后者将删除授予用户的任何权限。

查看DROP ROLEthe more detailed description的postgres文档。


增加:

显然,尝试使用此处提到的命令删除用户只有在连接到原始GRANTS所在的同一数据库时执行它们才会起作用,如下所述:

https://www.postgresql.org/message-id/83894A1821034948BA27FE4DAA47427928F7C29922%40apde03.APD.Satcom.Local

答案 1 :(得分:31)

在尝试REASSIGN OWNED BY或DROP OWNED BY时,接受的答案导致我的错误。以下对我有用:

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

用户可能拥有其他模式的权限,在这种情况下,您必须使用&#34; public&#34;运行相应的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 '%username%';

我不确定哪些权限类型对应于在TABLES,SEQUENCES或FUNCTIONS上撤销,但我认为它们都属于三者之一。

答案 2 :(得分:14)

另请注意,如果您已明确授予:

CONNECT ON DATABASE xxx TO GROUP

您需要使用以下方式单独撤销DROP OWNED BY:

REVOKE CONNECT ON DATABASE xxx FROM GROUP

答案 3 :(得分:2)

这是最终对我有用的东西:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON SEQUENCES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON TABLES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON FUNCTIONS FROM user_mike;
REVOKE USAGE ON SCHEMA myschem FROM user_mike;
REASSIGN OWNED BY user_mike TO masteruser;
DROP USER user_mike ;

答案 4 :(得分:2)

这对我有用:

DROP OWNED BY dbuser

然后:

DROP USER dbuser

答案 5 :(得分:0)

我必须在REVOKE上再添加一行...

运行后:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;

我仍然收到错误: 不能删除用户名,因为某些对象依赖该用户名详细信息:模式public的特权

我错过了这个:

REVOKE USAGE ON SCHEMA public FROM username;

然后我可以放弃这个角色。

DROP USER username;

答案 6 :(得分:0)

没有REVOKE ALL PRIVILEGES ON ALL VIEWS,所以我结束了:

do $$
DECLARE r record;
begin
  for r in select * from pg_views where schemaname = 'myschem'
  loop
    execute 'revoke all on ' || quote_ident(r.schemaname) ||'.'|| quote_ident(r.viewname) || ' from "XUSER"';
  end loop;
end $$;

和通常一样:

REVOKE ALL PRIVILEGES ON DATABASE mydb FROM "XUSER";
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM "XUSER";

以下成功:

drop role "XUSER";

答案 7 :(得分:0)

在命令行中,有一个dropuser命令可用于从postgres中删除用户。

$ dropuser someuser

答案 8 :(得分:0)

这应该有效:

REVOKE ALL ON SCHEMA public FROM myuser;
REVOKE ALL ON DATABASE mydb FROM myuser;
DROP USER myuser;

答案 9 :(得分:-14)

我遇到了同样的问题,现在找到了解决问题的方法。 首先,您必须删除要删除的用户的数据库。然后可以轻松删除用户。

我创建了一个名为&#34; msf&#34;并努力删除用户并重新创建它。我按照以下步骤成功完成了。

1)删除数据库

dropdb msf

2)放弃用户

dropuser msf

现在我成功删除了用户。