例如有内置功能如下所示:
pi()
round()
random()
...
并且,还有系统功能如下所示:
current_catalog()
current_database()
current_query()
...
并且,还有系统视图,如下所示:
pg_available_extensions
pg_available_extension_versions
pg_backend_memory_contexts
...
那么,PostgreSQL 中的每个数据库是否都有自己的内置对象或系统对象,例如函数、过程、视图等?或者,每个数据库都有共享的内置对象或系统对象,这意味着所有数据库中都使用(共享)一个内置对象或系统对象?
我知道每个数据库都有自己的用户定义对象,如函数、过程、视图、触发器、事件触发器等,这意味着所有数据库中都不会使用(共享)一个用户定义对象。
那么,每个数据库是否都有自己的内置对象或系统对象,例如函数、过程、视图等
是和不是。
内置函数(包括您提到的所有函数)在核心 Postgres 中用 C 代码实现一次。不是每个数据库集群一次,而是每个 Postgres 安装一次。每个都在系统目录
pg_proc
中分别在每个数据库中注册一次。 (每个条目仅占用几个字节。)
Postgres 附带了一组给定的函数,这些函数收集在默认的 模板数据库
template0
和 template1
中。每个新数据库都是作为操作系统级别的模板副本创建的(这使得操作非常快)。您可以自定义该食物链的大部分 - 具有操作系统或数据库级别的必要权限。
因此每个数据库都有自己的功能,但所有(属于同一个 Postgres 安装)都引用相同的代码库。
您可以在系统目录中识别内置函数:这些函数是使用
LANGUAGE internal
创建的。
LANGUAGE c
功能具有类似的食物链,其中许多是由附加模块添加的。
PL/pgSQL 和 SQL(以及其他 PL)函数的不同之处在于它们实际上存储每个数据库的函数体。数据库集群或 Postgres 安装之间没有共享任何内容。
只有少数系统目录作为单个实例在数据库集群(“全局”对象)中共享,特别是角色和表空间。 说明书:
大多数系统目录都是从模板数据库复制的 数据库创建,然后是特定于数据库的。一些目录 在集群中的所有数据库之间物理共享;这些都是 在各个目录的描述中注明。
pg_dumpall 有专用开关
--globals-only
仅备份全局对象。