PostgreSQL:创建视图并使用默认表空间?

3
在尝试创建PostgreSQL 13中的一个视图时,我遇到了一个错误,错误消息为:"permission denied for tablespace tbs_dft"。正如您所看到的,我已更改了系统默认表空间。这个问题很容易通过在'tbs_dft'上授予create权限来解决。但我的问题是:为什么在创建包含简单选择语句的视图时需要访问“默认表空间”?虽然这不是一个实际的问题,但我正在尝试学习PostgreSQL,来自Oracle,因此我不确定我不理解View创建方式的哪些方面。
非常感谢任何信息。

1
你可能正在创建一个物化视图吗? - user330315
谢谢您的回复。不,只是一个标准的选择语句。但这些都是我认为可能存在的“底层”问题。此外,我想知道是否将缓存到磁盘对于大型数据集可能会有影响。Oracle将本地堆缓存到用户临时表空间中。我想知道这是否可能是Postgres需要所有者在默认表空间上拥有权限的原因之一;也就是说,当数据集超过给定的堆大小或参数设置时,它充当默认临时表空间。但显然不是这样。 - user108168
1个回答

4
这是因为在创建关系(在src/backend/commands/tablecmds.cDefineRelation中)时,会执行此检查。关系是存储在pg_class中的任何内容:表、索引、序列、组合类型、视图或材化视图。

现在视图或组合类型没有数据文件,因此可以在这种情况下跳过检查。如果这对您很重要,请通过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));
    }

谢谢您的回复。这完美地回答了我的问题。对我来说这不是什么大问题,我只是想确保没有我不知道的潜在设计特性。 - user108168

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接