CREATE DATABASE 在底层物理机制上是通过克隆复制既有数据库来实现的。默认情况下它复制的是标准系统模板库 template1。
但需要注意的是,CREATE DATABASE 不会继承源模板库上通过 GRANT 显式赋予的库级访问控制权限,新创建的数据库总是继承标准默认权限。
第二个标准模板库是 template0。它完整保留了对应 PostgreSQL 版本的纯净原始出厂系统表结构。template0 在集群初始化完成后严禁被任何操作修改。通过显式要求从 template0 克隆,可以创建一个绝对纯净的新库:
CREATE DATABASE dbname TEMPLATE template0;
这在恢复 pg_dump 逻辑全备脚本时尤为重要,能够彻底杜绝模板污染引发的对象冲突。另一个常见场景是为新库指定与集群默认编码不同的字符集或排序规则,从 template0 克隆可以安全指定全新的编码与语言环境配置。
在集群内部,任何既有数据库都可以充当模板库。但核心约束在于:在执行复制克隆期间,被充当模板的源数据库严禁存在任何其他活跃并发连接,克隆开始前系统会主动阻断向该库发起的新连接请求。
系统视图 pg_database 中有两个核心布尔标志位:datistemplate(标识该库是否可作为模板克隆)与 datallowconn(标识是否允许客户端向该库建立连接)。通常将纯净模板库 template0 设置为 datallowconn = false,以物理禁止任何直接登录修改。