当我尝试在 PostgreSQL 13 中创建 View 时,我收到一条错误消息:“表空间 tbs_dft 的权限被拒绝”。如您所见,我已经更改了系统默认表空间。通过在表空间“tbs_dft”上授予创建权限,这个问题很容易解决。但我的问题是:为什么在创建包含简单 select 语句的 View 时需要访问“默认表空间”?虽然这不是一个实际问题,但我正在尝试学习来自 Oracle 的 Postgresql,因此我不确定它是什么,我不了解 View 创建在 Postgresql 中的工作方式。
感谢收到的任何信息。
最佳答案
原因是每当创建一个relation(在 src/backend/commands/tablecmds.c
的 DefineRelation
).关系是存储在 pg_class
中的任何内容:表、索引、序列、复合类型、 View 或物化 View 。
现在 View 或复合类型没有数据文件,所以在这种情况下可以跳过检查。如果这对你很重要,请联系 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:创建 View 并使用默认表空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71231494/