【问题标题】:how to create duplicate role of a user in postgres如何在postgres中创建用户的重复角色
【发布时间】:2013-05-11 14:09:09
【问题描述】:

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

例如

  • 用户 A 对 Table1 具有 SELECT 权限
  • 用户 A 对 Table2 具有 EXECUTE 权限
  • ...

如果创建了新的用户 B,我需要与,相同的权限,

  • 用户 B 对 Table1 具有 SELECT 权限
  • 用户 B 对 Table2 具有 EXECUTE 权限
  • ...

不要问为什么:/

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

【问题讨论】:

    标签: postgresql user-roles


    【解决方案1】:

    尝试类似:

    GRANT A TO B;
    

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

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

    【讨论】:

    • 不足。如果 A 是超级用户,还需要:ALTER USER B WITH SUPERUSER;
    • 注意:这将使角色 B “继承”角色 A 的所有权限。角色将以某种继承关系耦合。这实际上不会复制权限。
    【解决方案2】:

    首先要明白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 是默认值,因此无需显式编写。
    • 好点,我只是直言不讳,但这可能只是烦人...... 更新
    • 如果我不想继承角色权限而是将所有权限从 A 授予 B 并且还能够更改 A 的权限而不影响 B 怎么办
    • 在这种情况下,您应该拥有第三个角色。一个好的模型通常是在概念上将角色(具有特权的事物)与用户(可以登录的事物)分开。所以你可能有alicebob 角色,然后还有managerreader 角色。 alice 可能只是 readerbob 可能既是 reader 又是 manager。如果需要,您当然也可以为每个用户角色授予特定权限。
    【解决方案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();
    

    **你必须根据你的表模式和表名来调整它。希望对大家有帮助

    【讨论】:

    • 列、函数、视图权限呢?
    【解决方案4】:

    这是为newuser 创建授权语句的快速方法,方法是将db 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,一切就绪。

    【讨论】:

      【解决方案5】:

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

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

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

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

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

      这对我来说很好。希望这会对某人有所帮助。

      【讨论】:

        猜你喜欢
        • 2013-03-13
        • 2015-08-16
        • 2015-12-01
        • 1970-01-01
        • 2021-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        相关资源
        最近更新 更多