在PostgreSQL中,创建数据库时实际上通过拷贝一个已有数据库进行工作的。在默认情况下,将拷贝名为template1的标准系统数据库。所以该数据库是创建新数据库的“模板”。如果为template1数据库增加对象,这些对象将被拷贝到后续创建的用户数据库中。这种行为允许对数据库中标准对象集合的进行修改。例如,如果把过程语言PL/Perl安装到template1中,那么在创建用户数据库后不需要额外的操作就可以使用该语言。
视频讲解如下 |
---|
【赵渝强老师】PostgreSQL的模板数据库 |
系统里还有名为template0的第二个标准系统数据库。这个数据库包含和template1初始内容一样的数据,但只包含PostgreSQL版本预定义的标准对象。在数据库集群被初始化之后,不应该对template0做任何修改。在创建数据库时通过指示使用template0取代template1进行拷贝,可以创建一个“纯净的”用户数据库,它不会包含任何template1中的站点本地附加物。
执行下面的语句可以查看当前已存在的数据库信息。
postgres=# select oid,datname,datistemplate,datallowconn
from pg_database;
# 输出的信息如下:
oid | datname | datistemplate | datallowconn
-------+-----------+---------------+--------------
13580 | postgres | f | t
1 | template1 | t | t
13579 | template0 | t | f
(4 rows)
其中有两个有用的标识:
-
datistemplate可以被设置来指示该数据库是不是要作为创建数据库的模板。如果设置了这个标志,那么该数据库可以被任何有createdb权限的用户克隆;如果没有被设置,那么只有超级用户和该数据库的拥有者可以克隆它。
-
如果datallowconn为false,那么将不允许与该数据库建立任何新的连接。但已有的会话不会因为把该标志设置为false而被中止。
template0通常被标记为datallowconn = false来阻止对它的修改。template0和template1通常总是被标记为datistemplate = true。