在 Postgresql 中,在 pg_dump 之后,对数据库本身的访问权限不会恢复

eri*_*icj 8 postgresql backup permissions pg-dump

假设用户 foo 拥有数据库 gee,并且用户 foo 已授予用户 bar 对数据库 gee 的所有访问权限

gee=> \l
                              List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 gee       | foo      | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/foo              +
           |          |          |             |             | foo=CTc/foo          +
           |          |          |             |             | bar=CTc/foo
Run Code Online (Sandbox Code Playgroud)

我们转储这个数据库,

$ pg_dump -U foo -v -f gee.dump gee
Run Code Online (Sandbox Code Playgroud)

在数据库中,gee 用户栏创建了一个架构。因此,因为所有这些用户我们将数据库 gee 恢复为用户 postgres(在用户 foo 创建了数据库 goo 之后),

$ sudo -u postgres psql -d goo -f gee.dump
Run Code Online (Sandbox Code Playgroud)

用户栏没有对数据库 goo 的访问权限。但是在数据库 goo 中,对于所有用户,模式和表的每个权限都可以。

goo=> \l
                              List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 goo       | foo      | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
Run Code Online (Sandbox Code Playgroud)

为什么数据库本身的访问权限没有恢复?

Cra*_*ger 6

为什么数据库本身的访问权限没有恢复?

这是一个错误,或设计疏忽。尽管该报告的回应者并不这么认为。

pg_dumpall --globals-only不会转储数据库上的权限。也不pg_dump作为数据库转储的一部分。

因此,对数据库的授权仅包含在完整的pg_dumpall.

我会通过戳这个线程来制造一些噪音。