Postgresql 之 模式管理与psql使用的小技巧
发布日期:2021-05-08 12:26:57 浏览次数:23 分类:精选文章

本文共 1815 字,大约阅读时间需要 6 分钟。

今天同事问了个问题:postgresql模式创建了会存到哪个系统表中?

这个问题一开始让我有点摸不着头脑。通常情况下,可以通过元命令查看模式等信息。具体来说,有一个常用的元命令可以用来列出数据库中的所有模式:

\dn[S+] [PATTERN]

通过使用这个元命令,我可以列出数据库中所有的模式信息。接下来,我参考了PostgreSQL的官方文档,发现模式的相关信息主要存储在pg_namespace这个系统表中。这个系统表的作用是存储数据库中的所有命名空间信息,也就是模式名称。

为了更直观地理解pg_namespace的作用,我决定执行一个查询,查看当前数据库中各个模式的详细信息。通过以下命令,我可以获取到模式名称、模式的拥有者以及模式的访问权限等信息:

SELECT n.nspname AS "Name", pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner", pg_catalog.array_to_string(n.nspacl, E'\n') AS "Access privileges", pg_catalog.obj_description(n.oid, 'pg_namespace') AS "Description" FROM pg_catalog.pg_namespace n ORDER BY 1;

执行该查询后,我看到了以下结果:

名称 拥有者 存取权限 描述
hgdb_catalog highgo highgo=UC/highgo/+ HighGo Database catalog schema
information_schema highgo highgo=UC/highgo/+
oracle_catalog highgo highgo=UC/highgo/+ HighGo Database catalog schema (Oracle compatibility)
pg_catalog highgo highgo=UC/highgo/+ system catalog schema
pg_temp_1 highgo reserved schema for TOAST tables
pg_toast highgo
pg_toast_temp_1 highgo
public highgo highgo=UC/highgo/+ standard public schema

从上述结果可以看出,模式的信息确实存储在pg_namespace系统表中。这表明PostgreSQL使用了命名空间的概念来管理数据库中的模式,这与其他关系型数据库有一些不同。

在实际操作中,我还记得一种通过psql命令查看元命令执行后门的方法。具体来说,可以通过设置参数来打印出psql中以\开头的命令执行的实际SQL语句。以下是详细的操作方法:

psql -E  --参数,可以把psql中各种以\开头的命令执行的实际SQL打印出来。\set ECHO_HIDDEN on|off    --打开|关闭 命令实际执行的SQL,和-E类似。

在使用了上述命令后,再次执行\dnS+查看模式信息时,我发现psql会打印出实际执行的SQL语句。例如:

highgo=#  \set ECHO_HIDDEN onhighgo=#  \dnS+highgo=#  SELECT n.nspname AS "Name", pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner", pg_catalog.array_to_string(n.nspacl, E'\n') AS "Access privileges", pg_catalog.obj_description(n.oid, 'pg_namespace') AS "Description" FROM pg_catalog.pg_namespace n ORDER BY 1;

通过这种方式,我可以清晰地看到元命令实际执行的SQL语句,从而更好地理解数据库的内部工作原理。

总结来说,PostgreSQL模式创建后会存储在pg_namespace系统表中。了解这一点对于数据库管理和优化非常有帮助。通过上述方法,我不仅解决了同事的问题,还学会了一些实用的数据库管理技巧。

上一篇:Postgresql 之 系统表概述
下一篇:查询某表格上次进行vacuum的时间

发表评论

最新留言

不错!
[***.144.177.141]2025年03月21日 02时55分46秒