问题遇到的现象和发生背景
背景:想要搞清楚在pg_default表空间上创建database,是否需要先给role赋予pg_default的CREATE权限?也就是:
GRANT CREATE ON TABLESPACE pg_default to role_name;
发现问题如下:
- 不给role赋予pg_default的CREATE的权限, 执行CREATE DATABASE ...
如果不指定TABLESPACE pg_default, 居然可以成功的 -- 怀疑这是bug!
;
如果指定TABLESPACE pg_default, 就会错误: 对表空间 pg_default 权限不够.
- 给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.