如何在Postgres中创建用户角色的副本

28

我需要一个新用户,但它应该被授予其他现有用户/角色所拥有的所有权限。

例如:

  • User A在Table1上拥有SELECT权限
  • User A在Table2上拥有EXECUTE权限
  • ...

如果创建一个新的User B,我需要与User A相同的权限:

  • User B在Table1上拥有SELECT权限
  • User B在Table2上拥有EXECUTE权限
  • ...

不要问为什么 :/

实际上,User A对不同的表、模式和函数具有自定义权限;因此手动授予权限是非常繁琐和冗长的过程。任何帮助都会很好。

5个回答

19

试试这样做:

GRANT A TO B;

它将授予角色A的所有权限给B。

有关详细信息,请阅读手册中的this章节。


1
不足。如果A是超级用户,您还需要:ALTER USER B WITH SUPERUSER; - Henley
13
注意:这将使角色B“继承”角色A的所有权限。角色将以某种继承关系进行耦合。这实际上不会复制权限。 - Paun Narcis Iulian

14

首先,要了解rolesusers是同一回事。实际上并没有真正的user,它只是一个具有LOGIN选项的ROLE

其次,roles可以被授予给其他roles

第三,角色的权限可以被继承。

因此,假设您已经创建了用户a

CREATE ROLE A LOGIN;
GRANT SELECT ON table1 TO a;
GRANT EXECUTE ON FUNCTION xxx TO a;

你应该能够创建一个镜像第一个角色的第二个角色,例如:

CREATE ROLE b LOGIN;
GRANT a TO b;

对于角色 A,您无需指定 INHERIT。只有角色 B(将继承权限)需要。 INHERIT 是默认设置,因此无需显式编写它。 - Ihor Romanchenko
好的,我只是在表达明确,但这可能只是令人讨厌的... 更新 - Chris Farmiloe
如果我不想继承角色权限,而是希望从A授予所有权限给B,并且能够更改A的权限而不影响B,该怎么办? - UserBSS1
1
在这种情况下,您应该有第三个角色。一个好的模型通常是将角色(具有特权的事物)从用户(可以登录的事物)概念上分离出来。因此,您可能会拥有alicebob角色,然后还有managerreader角色。 alice可能只是一个reader,而bob可能既是reader又是manager。当然,如果需要,您也可以授予每个用户角色特定的权限。 - Chris Farmiloe

3

我需要编写pgpsql代码来循环遍历用户A的权限并授权给用户B,这个任务完成得非常顺利。

create or replace function update_user_privileges() returns text as
$$
declare

       info record;
       str text;

begin
       /*Grant privileges to user B the same as with user A for a given table schema*/
      str:=''; 
      FOR info IN 
          select * from information_schema.table_privileges where table_schema='public' and grantee = 'A'   
      LOOP 
          /*append the tables' name, for which we are assigning privileges from user A to B*/
          str:= str  ||info.table_name || ',';

         /*this is the main statement to grant any privilege*/
         execute 'GRANT '|| info.privilege_type ||' on table public.'|| info.table_name || ' to B';

      END LOOP;

  return str;
end

$$ language 'plpgsql';

使用方法:复制/粘贴此代码以创建此函数,然后进行操作。

select update_user_privileges();

你需要根据你的表结构和表名进行调整。希望这对任何人都有所帮助。


列、函数、视图权限怎么样? - Aruna

3
这是一个快速创建grant语句给"newuser"的方法,它会将数据库"mydb"上所有授权复制给被授权者"myuser"。
pg_dump mydb -s | egrep '^(GRANT|REVOKE).+TO "myuser"' | sed -E "s/\"myuser\"/\"newuser\"/g"

注意:使用-s标志可以使pg_dump执行迅速,因为它仅转储模式信息。

示例输出

GRANT SELECT,INSERT,UPDATE ON TABLE tabl1e TO "newuser";
GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE table2 TO "newuser";
GRANT ALL ON PROCEDURE myprocedure(ids bigint[]) TO "newuser";

只需运行输出的SQL授权或将其导出到psql中,您就可以完成所有设置。


0

我使用以下方法在Ubuntu上创建一个与现有用户相同的新用户。

  1. 获取现有数据库的完整转储。
  2. 使用以下命令提取包含要克隆的用户的每一行。

    cat /path/to/db_dump_file | grep "existing_user_name" >> /path/to/extract.sql

  3. 使用文本编辑器打开extract.sql并将现有用户名替换为新用户名。

  4. 删除不需要的查询(如果有)。
  5. 现在您有了新的SQL查询来创建新用户。

这对我很有效。希望这能帮助到某些人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接