Postgresql:创建视图并使用默认表空间?
Postgresql: create view and use of default tablespace?
当我尝试在 PostgreSQL 13 中创建视图时,我收到一条错误消息:“表空间 tbs_dft 的权限被拒绝”。如您所见,我已经更改了系统默认表空间。通过在表空间 'tbs_dft' 上授予创建权限,这个问题很容易解决。但我的问题是:为什么在创建包含简单 select 语句的视图时需要访问 'default tablespace'?虽然这不是一个实际问题,但我正在尝试学习来自 Oracle 的 Postgresql,因此我不确定它是什么我不了解视图创建在 Postgresql 中的工作方式。
感谢收到任何信息。
原因是每当创建 关系 时(在 DefineRelation
中 src/backend/commands/tablecmds.c
中)都会进行此检查。关系是存储在 pg_class
中的任何内容:table、索引、序列、复合类型、视图或物化视图。
现在视图或复合类型没有数据文件,所以在这种情况下可以跳过检查。如果这对您很重要,请联系 pgsql-hackers 邮件列表中的开发人员。我认为这可以改进。
这里是有问题的代码:
/* Check permissions except when using database's default */
if (OidIsValid(tablespaceId) && tablespaceId != MyDatabaseTableSpace)
{
AclResult aclresult;
aclresult = pg_tablespace_aclcheck(tablespaceId, GetUserId(),
ACL_CREATE);
if (aclresult != ACLCHECK_OK)
aclcheck_error(aclresult, OBJECT_TABLESPACE,
get_tablespace_name(tablespaceId));
}
当我尝试在 PostgreSQL 13 中创建视图时,我收到一条错误消息:“表空间 tbs_dft 的权限被拒绝”。如您所见,我已经更改了系统默认表空间。通过在表空间 'tbs_dft' 上授予创建权限,这个问题很容易解决。但我的问题是:为什么在创建包含简单 select 语句的视图时需要访问 'default tablespace'?虽然这不是一个实际问题,但我正在尝试学习来自 Oracle 的 Postgresql,因此我不确定它是什么我不了解视图创建在 Postgresql 中的工作方式。
感谢收到任何信息。
原因是每当创建 关系 时(在 DefineRelation
中 src/backend/commands/tablecmds.c
中)都会进行此检查。关系是存储在 pg_class
中的任何内容:table、索引、序列、复合类型、视图或物化视图。
现在视图或复合类型没有数据文件,所以在这种情况下可以跳过检查。如果这对您很重要,请联系 pgsql-hackers 邮件列表中的开发人员。我认为这可以改进。
这里是有问题的代码:
/* Check permissions except when using database's default */
if (OidIsValid(tablespaceId) && tablespaceId != MyDatabaseTableSpace)
{
AclResult aclresult;
aclresult = pg_tablespace_aclcheck(tablespaceId, GetUserId(),
ACL_CREATE);
if (aclresult != ACLCHECK_OK)
aclcheck_error(aclresult, OBJECT_TABLESPACE,
get_tablespace_name(tablespaceId));
}