PostgreSQL-如何快速删除具有现有特权的用户


122

我正在尝试使正在使用的应用程序具有受限的数据库用户,并且我想删除用于实验的Postgres数据库用户。有什么方法可以丢弃用户而不必先手动撤消其所有权限或撤消用户所拥有的所有授权?

Answers:


144

怎么样

DROP USER <username>

这实际上是的别名DROP ROLE

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

这最好通过以下方式实现

REASSIGN OWNED BY <olduser> TO <newuser>

DROP OWNED BY <olduser>

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

有关DROP ROLE的信息,请参见postgres文档以及对此的更详细描述


加成:

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

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


11
正在执行: CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER TO postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser 给出了错误消息:ERROR: role "testuser" cannot be dropped because some objects depend on it DETAIL: access to table foo。但是,DROP OWNED BY testuser确实做到了这一点,Postgres显然认为赠款是可丢弃的对象。
millimoose 2010年

1
请澄清一下,@ Tim Kane和millimoose:我真的不希望删除原始表,如果我在FOO上选择TESTUSER到TESTUSER,然后由TESTUSER删除自己的表。我想您是在说DROP OWNED BY仅删除授予,而不会删除授予授权的对象。正确?
Andrew Wolfe 2014年

1
安德鲁,最好阅读文档进行澄清。DROP OWNED BY 删除该用户拥有的表。REASSIGN OWNED BY将这些表重新分配给其他用户。选一个。
蒂姆·凯恩2015年

3
如果您担心在仍然保留特权的情况下进行REASSIGN OWNED后会因过多删除DROP OWNED,可以在SCHEMA [schema name]中从[role]撤消所有[TABLES | SEQUENCES | ...]上的所有内容
jla 2015年

确实,DROP OWNED BY命令的含义和作用有点模棱两可。我必须仔细阅读该文档才能正确使用。谢谢你们的帖子。
塞巴斯蒂安克莱门特

49

尝试使用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;

用户可能在其他模式中具有特权,在这种情况下,您将必须运行适当的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 '%username%';

我不确定哪种特权类型对应于对TABLES,SEQUENCES或FUNCTIONS的撤消,但是我认为所有特权类型都属于这三种特权之一。


12
我还必须添加一个:REVOKE ALL PRIVILEGES ON DATABASE db_name FROM username;
Wojciech Jakubas,

3
还有模式特权。
greatvovan

2
对于架构特权:revoke USAGE on SCHEMA some_schema from username;
Alphaaa

我试过了,但问题仍然存在。我张贴它作为单独的问题stackoverflow.com/questions/61168608/...
安德鲁斯

17

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

CONNECT ON DATABASE xxx TO GROUP

您需要使用以下命令从DROP OWNED BY处分别撤销此操作:

REVOKE CONNECT ON DATABASE xxx FROM GROUP


我已经尝试了上面的所有方法,但对我来说仍然没有用,直到我向下滚动一点,然后才剩下一些头发。一些。:D谢谢!!
米奇·肯特

6

我必须再添加一行以撤消...

运行后:

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;

我仍然收到错误: 无法删除用户名,因为某些对象依赖该用户名。DETAIL:模式公共的特权

我错过了这个:

REVOKE USAGE ON SCHEMA public FROM username;

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

DROP USER username;

例如,如果您已经为pg_rewind创建了一个对pg_read_binary_file之类的功能具有特权的用户,则可能还需要撤销“ SCHEMA pg_catalog”的特权。
GreenReaper

5

这是最终为我工作的东西:

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 ;

2

没有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";

0

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

$ dropuser someuser

-19

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

我创建了一个名为“ msf”的用户,并努力删除该用户并重新创建它。我按照以下步骤操作,成功了。

1)删除数据库

dropdb msf

2)删除用户

dropuser msf

现在,我成功将用户删除。


2
这是一种令人难以置信的刀耕火种方法,因为它需要我为我的工作的每次迭代重新创建数据库模式。(其中涉及其在现有的数据库模式细粒度的权限;也就是说,它是最好的,如果数据库架构保持不变)
millimoose
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.