postgresql - 向用户授予架构

noo*_*ber 1 postgresql

我有 (2) 个 postgresql 数据库。我基本上使用相同的 pg_dump 导出文件在不同的机器上创建 (2) db。DDL 是相同的,但是,我收到了no relations其中之一的消息。search_path 设置正确。我相信我错过了让我的(2)个用户看到这个模式的授权。Host2 上的设置是正确的。我只是不知道使用哪个赠款。

信息:

mra_prd_99999=> \dt
No relations found.
Run Code Online (Sandbox Code Playgroud)

主机 1:

mra_prd_99999=> \z
                                                   Access privileges
      Schema       |           Name            | Type  |          Access privileges          | Column access privileges
-------------------+---------------------------+-------+-------------------------------------+--------------------------
 mra_dev_schm_99999 | abc_bounce_category       | table | mra_prd_99999=arwdDxt/mra_prd_99999 |
Run Code Online (Sandbox Code Playgroud)

主机 2:

mra_prd_99999=> \z
                                                        Access privileges
      Schema       |           Name            | Type  |              Access privileges               | Column access privileges
-------------------+---------------------------+-------+----------------------------------------------+--------------------------
 mra_dev_schm_99999 | abc_bounce_category       | table | mra_prd_99999=arwdDxt/mra_prd_99999         +|
                   |                           |       | mra_prd_99999_user1=arwdDxt/mra_prd_99999+|
                   |                           |       | mra_prd_99999_user2=r/mra_prd_99999        |
Run Code Online (Sandbox Code Playgroud)

我的角色名和设置在两个 (1,2) 上都是相同的:

 mra_prd_99999          | Create DB                                      | {}
 mra_prd_99999_user1    |                                                | {}
 mra_prd_99999_user2    |                                                | {}
Run Code Online (Sandbox Code Playgroud)

所有用户都将 search_path 设置为相同的架构:

mra_prd_99999=> show search_path;
    search_path
-------------------
 mra_dev_schm_99999
(1 row)

mra_prd_99999=> \dn
          List of schemas
       Name        |     Owner
-------------------+---------------
 public            | mra
 mra_dev_schm_99999 | mra_prd_99999
(2 rows)
Run Code Online (Sandbox Code Playgroud)

我需要运行哪些授权才能使 HOST1 的用户拥有与 HOST2 相同的访问权限?

dez*_*zso 7

你收到消息

未发现任何关系。

因为用户没有USAGE架构的特权(既不是直接授予的,也不是通过public伪角色授予的)。您可以通过比较\dn+ mra_dev_schm_99999两个数据库来检查这一点。

这是文档对此的说明:

对于模式,允许访问包含在指定模式中的对象(假设还满足对象自己的权限要求)。本质上,这允许受让人在模式中“查找”对象。没有此权限,仍然可以查看对象名称,例如通过查询系统表。此外,在撤销此权限后,现有后端可能具有之前执行过此查找的语句,因此这不是防止对象访问的完全安全的方法。

此外,这两个mra_prd_99999_users似乎没有表级权限abc_bounce_category- 你必须这样做

GRANT ALL ON TABLE mra_dev_schm_99999.abc_bounce_category 
      TO mra_prd_99999_user1;
GRANT SELECT ON TABLE mra_dev_schm_99999.abc_bounce_category 
      TO mra_prd_99999_user2;
Run Code Online (Sandbox Code Playgroud)

如果您有更多的表有同样的问题,请执行

GRANT ALL ON ALL TABLES IN SCHEMA mra_dev_schm_99999 
      TO mra_prd_99999_user1;

-- then for future tables:
ALTER DEFAULT PRIVILEGES FOR ROLE mra_prd_99999 
    IN SCHEMA mra_dev_schm_99999 GRANT ALL ON TABLES 
    TO mra_prd_99999_user1;

-- and similarly to the other user
Run Code Online (Sandbox Code Playgroud)