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

mil*_*ose 110 postgresql

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

Tim*_*ane 129

怎么样

DROP USER <username>
Run Code Online (Sandbox Code Playgroud)

这实际上是别名DROP ROLE.

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

这是最好的实现

REASSIGN OWNED BY <olduser> TO <newuser>
Run Code Online (Sandbox Code Playgroud)

DROP OWNED BY <olduser>
Run Code Online (Sandbox Code Playgroud)

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

请参阅有关DROP ROLE的postgres文档以及更详细的说明.


加成:

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

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

  • 做:`CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER to postgres; CREATE USER testuser; 全部授予foo to testuser; DROP USER testuser`给出了错误消息:`ERROR:role"testuser"无法删除,因为某些对象依赖于它DETAIL:访问表foo`.然而,``TROP OWNED by testuser`做了伎俩,显然Postgres认为赠款是可放置的对象. (10认同)
  • 安德鲁,最好阅读文档以进行澄清。DROP OWNED BY *将*删除该用户拥有的表。REASSIGN OWNED BY 会将这些表重新分配给不同的用户。选一个。 (3认同)
  • 如果你担心在有特权仍然存在的情况下进行REASSIGN OWNED之后取出过多的DROP OWNED,你可以在SCHEMA [模式名称] FROM [role]中全部撤消所有[TABLES | SEQUENCES | ...] (3认同)
  • 请澄清,@Tim Kane 和millimoose:如果我将 SELECT ON FOO TO TESTUSER GRANT SELECT ON FOO TO TESTUSER 然后DROP OWNED BY TESTUSER,我真的不希望删除原始表。我认为您是说 DROP OWNED BY 只会删除授权,但不会删除获得授权的对象。正确的? (2认同)

Sas*_*ser 44

在尝试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;
Run Code Online (Sandbox Code Playgroud)

用户可能拥有其他模式的权限,在这种情况下,您必须运行相应的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%';
Run Code Online (Sandbox Code Playgroud)

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

  • 我还必须添加这个:`在DATABASE上修改所有特权db_name FROM username;` (9认同)
  • 还有模式特权。 (3认同)
  • 对于模式权限:“从用户名中撤销对 SCHEMA some_schema 的使用;” (3认同)

小智 16

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

CONNECT ON DATABASE xxx TO GROUP ,

你将需要与DROP OWNED BY分开撤销,使用:

REVOKE CONNECT ON DATABASE xxx FROM GROUP


Har*_*vey 16

这对我有用:

DROP OWNED BY dbuser
Run Code Online (Sandbox Code Playgroud)

进而:

DROP USER dbuser
Run Code Online (Sandbox Code Playgroud)


Pre*_*eti 15

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

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 ;
Run Code Online (Sandbox Code Playgroud)


yuc*_*cer 9

这应该有效:

REVOKE ALL ON SCHEMA public FROM myuser;
REVOKE ALL ON DATABASE mydb FROM myuser;
DROP USER myuser;
Run Code Online (Sandbox Code Playgroud)


Ale*_*ore 6

Postgres文档对此有明确的答案 - 这是唯一认可的答案:

REASSIGN OWNED BY doomed_role TO successor_role;
DROP OWNED BY doomed_role;
-- repeat the above commands in each database of the cluster
DROP ROLE doomed_role;
Run Code Online (Sandbox Code Playgroud)

关键点:

  1. -- repeat the above commands in each database of the cluster
  2. "it's typically necessary to run both REASSIGN OWNED and DROP OWNED (in that order!) to fully remove the dependencies of a role to be dropped."


小智 5

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

运行后:

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;
Run Code Online (Sandbox Code Playgroud)

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

我错过了这个:

REVOKE USAGE ON SCHEMA public FROM username;
Run Code Online (Sandbox Code Playgroud)

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

DROP USER username;
Run Code Online (Sandbox Code Playgroud)


gav*_*koa 5

没有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 $$;
Run Code Online (Sandbox Code Playgroud)

和平常一样:

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";
Run Code Online (Sandbox Code Playgroud)

为了实现以下目标:

drop role "XUSER";
Run Code Online (Sandbox Code Playgroud)