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

Postgresql: create view and use of default tablespace?

当我尝试在 PostgreSQL 13 中创建视图时,我收到一条错误消息:“表空间 tbs_dft 的权限被拒绝”。如您所见,我已经更改了系统默认表空间。通过在表空间 'tbs_dft' 上授予创建权限,这个问题很容易解决。但我的问题是:为什么在创建包含简单 select 语句的视图时需要访问 'default tablespace'?虽然这不是一个实际问题,但我正在尝试学习来自 Oracle 的 Postgresql,因此我不确定它是什么我不了解视图创建在 Postgresql 中的工作方式。

感谢收到任何信息。

原因是每当创建 关系 时(在 DefineRelationsrc/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));
    }