一尘不染

如何检查PostgreSQL公共模式是否存在?

sql

运行以下查询:

SELECT exists (
    SELECT
        schema_name 
    FROM
        information_schema.schemata 
    WHERE
        schema_name = 'public'
) AS schema_exists;

FALSE即使公共模式存在,我也总是会得到提示。

我应如何检查此架构是否存在?

编辑

我正在使用PostgreSQL 8.4版


阅读 176

收藏
2021-05-30

共1个答案

一尘不染

来自的信息information_schema.schemata取决于您所连接的角色,因此,一般而言,它不是查询以发现架构的正确视图。

9.3中文档information_schema.schemata说:

视图架构包含当前数据库中由当前启用的角色拥有的所有架构。

但是,仅从那句话还不清楚(至少对我而言),为什么看不到public

在邮件列表中,汤姆·莱恩(Tom Lane)进行了进一步的解释:
请参阅http://www.postgresql.org/message-
id/11650.1357782995@sss.pgh.pa.us

他的结论是:

从目前的情况来看,在这种观点下,非超级用户不会看到“ public”,“ pg_catalog”甚至“
information_schema”本身,这似乎有点愚蠢。

看起来完全像这个问题中的问题。

底线:用pg_namespace代替information_schema.schemata


9.4版对此进行了修订,以符合用户的期望。在当前文档说:

视图模式包含当前数据库中当前用户有权访问的所有模式(通过成为所有者或具有某些特权)。

USAGE 模式的特权现在足以从该视图中获取它。

2021-05-30