Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何快速删除具有现有权限的用户_Postgresql - Fatal编程技术网

Postgresql 如何快速删除具有现有权限的用户

Postgresql 如何快速删除具有现有权限的用户,postgresql,Postgresql,我正在尝试为我正在开发的应用程序创建受限制的DB用户,我想删除我用于实验的Postgres数据库用户。是否有任何方法可以删除用户而不必首先手动撤销其所有权限,或者撤销用户拥有的所有授权?如何 DROP USER <username> 及 DROP拥有者 后者将删除授予用户的任何特权 请参阅博士后文档以了解和了解这一点 添加: 显然,只有在连接到原始授权所使用的同一数据库时执行这些命令,才能尝试使用此处提到的命令删除用户,如下所述: 另请注意,如果您明确授予: 将数据库xxx连接

我正在尝试为我正在开发的应用程序创建受限制的DB用户,我想删除我用于实验的Postgres数据库用户。是否有任何方法可以删除用户而不必首先手动撤销其所有权限,或者撤销用户拥有的所有授权?

如何

DROP USER <username>

DROP拥有者
后者将删除授予用户的任何特权

请参阅博士后文档以了解和了解这一点


添加:

显然,只有在连接到原始授权所使用的同一数据库时执行这些命令,才能尝试使用此处提到的命令删除用户,如下所述:


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

将数据库xxx连接到组

您需要使用以下方式从拥有的DROP中单独撤销此权限:


从组中撤销数据库xxx上的连接

我遇到了同样的问题,现在找到了解决方法。 首先,必须删除要删除的用户的数据库。这样用户就可以很容易地删除

我创建了一个名为“msf”的用户,并努力删除该用户并重新创建它。我遵循下面的步骤,并获得了成功

1) 删除数据库

dropdb msf
2) 删除用户

dropuser msf

现在我成功删除了该用户。

在尝试重新分配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;
DROP OWNED BY dbuser
用户可能在其他模式中拥有权限,在这种情况下,您必须运行相应的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%';

我不确定哪些特权类型对应于表、序列或函数上的撤销,但我认为它们都属于这三种特权类型之一。

我必须再添加一行来撤销

运行后:

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;
我仍然收到错误: 无法删除用户名,因为某些对象依赖于它。详细信息:架构公共权限

我错过了这个:

REVOKE USAGE ON SCHEMA public FROM username;
然后我就可以放弃这个角色了

DROP USER username;

没有
撤销所有视图上的所有权限
,因此我以以下内容结束:

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

以下是最终对我有效的方法:

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 ;

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

$ dropuser someuser
这对我很有用:

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;
DROP OWNED BY dbuser
然后:

DROP USER dbuser

正在执行:
创建表foo(条形序列);将表foo-OWNER更改为postgres;创建用户testuser;将所有关于foo的内容授予testuser;DROP USER testuser
给出了错误消息:
错误:无法删除角色“testuser”,因为某些对象依赖于它详细信息:访问表foo
。然而,
DROP由testuser拥有
起了作用,显然Postgres认为grants是可删除的对象。请澄清,@Tim Kane和millimoose:如果我将SELECT ON FOO授予testuser,然后DROP由testuser拥有,我真的不希望原始表被删除。我想你是说DROP OWNED BY只是放弃了授予,但不会放弃授予的对象。正确吗?Andrew,最好阅读文档进行澄清。DROP OWNED BY将删除该用户拥有的表。“重新分配所有者”将把这些表重新分配给其他用户。选择一个。如果您担心在特权仍然保留的情况下重新分配OWNED后,由于取出太多而导致DROP OWNED,您可以从[role]中撤销模式[SCHEMA name]中所有[TABLES | SEQUENCES |…]上的ALL。实际上,DROP OWNED BY命令的含义和效果有点模糊。我必须仔细阅读文件才能把它弄对。谢谢大家的帖子。这是一种难以置信的刀耕火种的方法,因为它需要我为我的工作的每一次迭代重新创建数据库模式。(这涉及对现有数据库模式拥有细粒度权限;即,最好保持数据库模式不变。)我还必须添加此选项:
REVOKE-ALL-PRIVILEGES on database db_-name FROM-username还有模式权限。对于模式权限:
从用户名中撤销对模式的使用我尝试了此操作,但问题仍然存在。我把它作为一个单独的问题贴在了我已经尝试了上面的一切,但它仍然对我不起作用,直到我向下滚动到这个位置,所以现在我还有一些头发。一些D谢谢你!!例如,如果您为pg_倒带创建了一个用户,该用户对pg_读取_二进制文件等函数具有权限,则可能还需要撤销“SCHEMA pg_catalog”的权限。这非常有效。我也在做类似的事情。但是你的问题涵盖了每一件事。