Tonardo Wang 2022-03-13 22:45 采纳率: 0%
浏览 355

错误: 对表空间 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.

  • 写回答

1条回答 默认 最新

  • yang_z_1 2022-03-19 22:08
    关注

    img


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

    评论

报告相同问题?

问题事件

  • 修改了问题 3月13日
  • 专家修改了标签 3月13日
  • 创建了问题 3月13日