2010-06-11 147 views

回答

84

如何

DROP USER <username> 

这实际上是DROP ROLE的别名。

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

这最好通过

REASSIGN OWNED BY <olduser> TO <newuser> 

DROP OWNED BY <olduser> 

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

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


增加:

显然,试图通过这里提到的命令,如果您正在执行他们,而被连接到原来的赠款,由相同的数据库才起作用删除用户,这里讨论:

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

+9

正在操作: CREATE TABLE foo(bar SERIAL); ALTER TABLE foo所有者postgres; CREATE USER testuser; GRANT ALL foo TO testuser; DROP USER testuser' 给出了错误消息:'错误:角色“testuser”不能被删除,因为一些对象依赖于它。细节:访问表foo'。 但是,'testopenned by testuser'完成了这个伎俩,显然Postgres认为授予是可丢弃的对象。 – millimoose 2010-06-14 10:39:09

+1

请澄清一下@Tim Kane和millimoose:如果我选择FOO给TESTUSER,然后DROP OWNED BY TESTUSER,我真的不希望原始表被删除。我想你说的是DROP OWNED BY只是放弃了赠款,但不会放弃授予的目标。正确? – 2014-12-01 13:53:36

+1

Andrew,最好阅读说明文档。 DROP OWNED BY *将*删除该用户拥有的表。 REASSIGN OWNED BY会将这些表格重新分配给不同的用户。选一个。 – 2015-02-09 09:16:53

8

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

CONNECT ON DATABASE xxx TO GROUP

,你将需要从DROP归单独撤销这一点,使用:

REVOKE CONNECT ON DATABASE xxx FROM GROUP

-9

我面临同样的问题,现在找到了一种方法来解决它。 首先你必须删除你想删除的用户的数据库。然后用户可以很容易地删除。

我创建了一个名为“msf”的用户,并挣扎了一段时间来删除用户并重新创建它。我遵循以下步骤,并成功。

1)删除数据库

dropdb msf 

2)删除用户

dropuser msf 

现在,我得到了用户成功删除。

+1

这是一种令人难以置信的斜线和刻录方法,因为它会要求我为每次迭代工作重新创建数据库模式。 (其中涉及对现有数据库模式具有精细权限;即最好如果数据库模式保持不变)。 – millimoose 2015-12-09 22:54:08

1

接受的答案在尝试重新分配所有权或所有权时会导致错误。以下为我工作:

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线。要显示所有的模式和特权类型的用户,我编辑\ 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%'; 

我不知道哪些权限类型对应撤销对表,序列,或功能,但我认为它们都属于三者之一。

相关问题