错误: 对表空间 pg_default 权限不够

问题遇到的现象和发生背景

背景:想要搞清楚在pg_default表空间上创建database,是否需要先给role赋予pg_default的CREATE权限?也就是:

GRANT CREATE ON TABLESPACE pg_default to role_name;

发现问题如下:

  1. 不给role赋予pg_default的CREATE的权限, 执行CREATE DATABASE ...

如果不指定TABLESPACE pg_default, 居然可以成功的 -- 怀疑这是bug!
如果指定TABLESPACE pg_default, 就会错误: 对表空间 pg_default 权限不够.

  1. 给role赋予pg_default的CREATE的权限,执行CREATE DATABASE ...
    则指定TABLESPACE pg_default也会成功。
问题相关代码,请勿粘贴截图

场景1. role_createdb 未被赋予pg_default的CREATE权限

测试1,不指定tablespace pg_default

  => CREATE DATABASE testdb7;

结果:成功!对这个结果怀疑是bug

测试2, 指定tablespace pg_default

  => CREATE DATABASE testdb8 tablespace pg_default;

结果:错误: 对表空间 pg_default 权限不够

场景2. role_createdb被赋予pg_default的CREATE权限

  => GRANT CREATE ON TABLESPACE pg_default to role_createdb;

测试1,不指定tablespace pg_default

   => CREATE DATABASE testdb7;

结果:成功!

测试2, 指定tablespace pg_default

=> CREATE DATABASE testdb8 tablespace pg_default;

结果:成功!

=> select version();
version


PostgreSQL 13.4, compiled by Visual C++ build 1914, 64-bit
(1 row)

我的解答思路和尝试过的方法
=>  select datname,dattablespace from pg_database where datname='testdb7';

datname | dattablespace

testdb7 | 1663
(1 row)

=> select * from pg_tablespace;

oid | spcname | spcowner | spcacl | spcoptions

1664 | pg_global | 10 | |
1663 | pg_default | 10 | {postgres=C/postgres} |
(2 rows)

结果说明,即使不指定pg_tablespace, testdb7的表空间也是pg_tablespace.

我想要达到的结果

要想在pg_tablespace上创建database,需要先给role赋予pg_default 的CREATE 权限.如下:

GRANT CREATE ON TABLESPACE pg_default to role_name;

如果不给role赋予pg_default的CREATE权限, 应该不能在pg_default上创建database.

img


CREATE DATABASE testdb8 tablespace pg_default; 这个没有问题,我怀疑是你现在用的角色没有权限访问pg_defaul这个表空间。