如何快速删除具有现有权限的用户
Posted
技术标签:
【中文标题】如何快速删除具有现有权限的用户【英文标题】:How to quickly drop a user with existing privileges 【发布时间】:2011-03-02 16:51:21 【问题描述】:我正在尝试为我正在开发的应用程序设置受限数据库用户,并且我想删除我用于试验的 Postgres 数据库用户。有什么方法可以删除用户而不必先手动撤销他的所有权限,或者撤销用户拥有的所有授权?
【问题讨论】:
【参考方案1】:怎么样
DROP USER <username>
这实际上是DROP ROLE
的别名。
您必须明确删除与该用户关联的所有权限,同时将其所有权转移到其他角色(或删除对象)。
这是最好的实现
REASSIGN OWNED BY <olduser> TO <newuser>
和
DROP OWNED BY <olduser>
后者将删除授予用户的所有权限。
请参阅 DROP ROLE 和 the more detailed description 的 postgres 文档。
补充:
显然,仅当您在连接到创建原始 GRANTS 的同一数据库时执行这些命令时,尝试使用此处提到的命令删除用户才有效,如下所述:
https://www.postgresql.org/message-id/83894A1821034948BA27FE4DAA47427928F7C29922%40apde03.APD.Satcom.Local
【讨论】:
Doing: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 认为授权是可丢弃的对象。
请澄清,@Tim Kane 和 millimoose:如果我将 FOO 上的 SELECT 授予 TESTUSER 然后 DROP OWNED BY TESTUSER,我真的不希望删除原始表。我认为您是说 DROP OWNED BY 只是放弃授予,但不会放弃授予授予的对象。对吗?
安德鲁,最好阅读文档以进行澄清。 DROP OWNED BY 将删除该用户拥有的表。 REASSIGN OWNED BY 会将这些表重新分配给不同的用户。选择一个。
如果您担心在执行 REASSIGN OWNED 后取出过多的 DROP OWNED 而仍有权限保留,您可以 REVOKE ALL ON ALL [TABLES|SEQUENCES|...] IN SCHEMA [架构名称] FROM [角色]
确实,DROP OWNED BY 命令的含义和效果有点模棱两可。我必须仔细阅读文档才能做到正确。感谢您的帖子。【参考方案2】:
在尝试重新分配拥有者或删除拥有者时,接受的答案导致我出错。以下对我有用:
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,但我认为它们都属于三者之一。
【讨论】:
我也必须添加这个:REVOKE ALL PRIVILEGES ON DATABASE db_name FROM username;
还有架构权限。
对于架构权限:revoke USAGE on SCHEMA some_schema from username;
我试过了,但我的问题仍然存在。我将其作为单独的问题发布在 ***.com/questions/61168608/…【参考方案3】:
另请注意,如果您已明确授予:
CONNECT ON DATABASE xxx TO GROUP
,
您需要从 DROP OWNED BY 中单独撤消它,使用:
REVOKE CONNECT ON DATABASE xxx FROM GROUP
【讨论】:
我已经尝试了上面的所有方法,但它仍然不适合我,直到我向下滚动一点点,所以现在我还剩下一些头发。一些。 :D 谢谢!!【参考方案4】:这就是最终对我有用的方法:
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 ;
【讨论】:
这很好用。我正在做类似的事情。但是您的查询涵盖了所有内容。【参考方案5】:我不得不在 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;
我仍然收到错误: 无法删除用户名,因为某些对象依赖于它详细信息:schema public 的权限
我错过了这个:
REVOKE USAGE ON SCHEMA public FROM username;
然后我就可以放弃这个角色了。
DROP USER username;
【讨论】:
您可能还需要撤销“SCHEMA pg_catalog”的权限,例如,如果您为 pg_rewind 创建了一个用户,该用户对 pg_read_binary_file 等函数具有权限。【参考方案6】:没有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】:在命令行中,有一个命令 dropuser
可用于从 postgres 中删除用户。
$ dropuser someuser
【讨论】:
【参考方案8】:这对我有用:
DROP OWNED BY dbuser
然后:
DROP USER dbuser
【讨论】:
【参考方案9】:这应该可行:
REVOKE ALL ON SCHEMA public FROM myuser;
REVOKE ALL ON DATABASE mydb FROM myuser;
DROP USER myuser;
【讨论】:
【参考方案10】:https://dbtut.com/index.php/2018/07/09/role-x-cannot-be-dropped-because-some-objects-depend-on-it/
检查后发现 db 中没有任何对象的所有权,后来意识到这可能是由于为用户创建了外部数据包装映射并授予权限。
所以需要两个操作
-
删除用户映射
撤销对外部数据包装器的使用。
示例查询
DROP USER MAPPING FOR username SERVER foreignservername
REVOKE ALL ON FOREIGN SERVER foreignservername FROM username
【讨论】:
【参考方案11】:我遇到了同样的问题,现在找到了解决方法。 首先,您必须删除要删除的用户的数据库。这样用户就可以轻松删除了。
我创建了一个名为“msf”的用户,并努力删除该用户并重新创建它。我按照以下步骤操作并成功。
1) 删除数据库
dropdb msf
2) 删除用户
dropuser msf
现在我成功删除了用户。
【讨论】:
这是一种令人难以置信的刀耕火种方法,因为它需要我为我的工作的每次迭代重新创建数据库模式。 (这涉及对现有数据库架构拥有细粒度的权限;即,最好保持数据库架构不变。)以上是关于如何快速删除具有现有权限的用户的主要内容,如果未能解决你的问题,请参考以下文章
如何从 MongoDB 中的用户删除 dropCollection 访问权限?