PostgreSQL 中每个数据库都有自己的内置对象或系统对象(函数、过程、视图等)吗?

问题描述 投票:0回答:1

例如有内置功能如下所示:

pi()
round()
random()
...

并且,还有系统功能如下所示:

current_catalog()
current_database()
current_query()
...

并且,还有系统视图,如下所示:

pg_available_extensions
pg_available_extension_versions
pg_backend_memory_contexts
...

那么,PostgreSQL 中的每个数据库是否都有自己的内置对象或系统对象,例如函数、过程、视图等?或者,每个数据库都有共享的内置对象或系统对象,这意味着所有数据库中都使用(共享)一个内置对象或系统对象?

我知道每个数据库都有自己的用户定义对象,如函数、过程、视图、触发器、事件触发器等,这意味着所有数据库中都不会使用(共享)一个用户定义对象。

database postgresql object system built-in
1个回答
0
投票

那么,每个数据库是否都有自己的内置对象或系统对象,例如函数、过程、视图等

是和不是。

内置函数(包括您提到的所有函数)在核心 Postgres 中用 C 代码实现一次。不是每个数据库集群一次,而是每个 Postgres 安装一次。每个都在系统目录

pg_proc
中分别在每个数据库中注册一次。 (每个条目仅占用几个字节。)

Postgres 附带了一组给定的函数,这些函数收集在默认的 模板数据库

template0
template1
中。每个新数据库都是作为操作系统级别的模板副本创建的(这使得操作非常快)。您可以自定义该食物链的大部分 - 具有操作系统或数据库级别的必要权限。

因此每个数据库都有自己的功能,但所有(属于同一个 Postgres 安装)都引用相同的代码库。

您可以在系统目录中识别内置函数:这些函数是使用

LANGUAGE internal
创建的。
LANGUAGE c
功能具有类似的食物链,其中许多是由附加模块添加的。

PL/pgSQL 和 SQL(以及其他 PL)函数的不同之处在于它们实际上存储每个数据库的函数体。数据库集群或 Postgres 安装之间没有共享任何内容。

只有少数系统目录作为单个实例在数据库集群(“全局”对象)中共享,特别是角色和表空间。 说明书:

大多数系统目录都是从模板数据库复制的 数据库创建,然后是特定于数据库的。一些目录 在集群中的所有数据库之间物理共享;这些都是 在各个目录的描述中注明。

pg_dumpall 有专用开关

--globals-only
仅备份全局对象。

© www.soinside.com 2019 - 2024. All rights reserved.