20

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

例如

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

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

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

不要问为什么:/

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

4

5 回答 5

13

尝试类似:

GRANT A TO B;

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

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

于 2013-05-16T20:04:40.553 回答
12

首先要明白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;
于 2013-05-16T20:03:49.173 回答
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();

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

于 2013-06-26T07:50:27.967 回答
2

这是创建授权语句的快速方法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,就可以了。

于 2020-11-02T01:06:08.780 回答
0

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

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

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

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

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

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

于 2015-11-12T03:27:18.947 回答