如何在postgres中创建用户的重复角色

时间:2013-05-16 15:26:28

标签: postgresql user-roles

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

e.g。

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

如果创建了新用户B,我需要与

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

不要问为什么:/

实际上,用户A对不同的表,模式和功能具有自定义权限;所以手动授予新用户权限是一个非常繁琐冗长的过程。任何帮助都会很好。

5 个答案:

答案 0 :(得分:6)

尝试类似:

GRANT A TO B;

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

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

答案 1 :(得分:4)

首先要了解rolesusers是一回事。事实上,确实没有一个名为user的东西,它只是一个ROLE选项LOGIN

第二个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;

答案 2 :(得分:1)

我必须编写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();

**您必须根据表模式和表名对其进行调整。希望它可以帮助任何人

答案 3 :(得分:0)

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

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

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

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

  4. 删除不需要的查询(如果有)。
  5. 现在您有了新的SQL查询来创建新用户。
  6. 这对我很有用。希望这会对某人有所帮助。

答案 4 :(得分:0)

通过将数据库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,就一切就绪。