CREATE DATABASE в действительности работает путем копирования существующей базы данных. По умолчанию копируется стандартная системная база данных с именем
template1. Таким образом, эта
база данных служит «шаблоном» , на основе которого создаются новые базы данных. Если добавить объекты в template1, эти объекты
будут копироваться во все создаваемые впоследствии пользовательские базы данных. Такой
механизм позволяет вносить локальные изменения в стандартный набор
объектов в базах данных. Например, если установить процедурный
язык PL/Perl в template1, он будет автоматически доступен в пользовательских базах данных без каких-либо дополнительных действий при их создании.
Однако, CREATE DATABASE не копирует разрешения уровня базы данных,
GRANT назначенные исходной базе данных.
Новая база данных имеет разрешения уровня базы данных по умолчанию.
Существует вторая стандартная системная база данных под названием
template0. Эта
база данных содержит те же данные, что и исходное содержимое
template1, то есть только стандартные объекты,
предопределенные вашей версией
Digital Q.DataBase. template0
не должны изменяться после того, как кластер баз данных был инициализирован. Давая указание
CREATE DATABASE скопировать template0 вместо template1, вы можете создать «чистую» пользовательскую базу данных (в которой отсутствуют пользовательские объекты и системные объекты не были изменены), не содержащую локальных дополнений из
template1. Это особенно удобно при восстановлении
pg_dump дампа: сценарий дампа должен быть восстановлен в
чистой базе данных, чтобы обеспечить корректное воссоздание содержимого
базы данных из дампа без конфликтов с объектами, которые
могли быть добавлены в template1 позднее.
Другой распространенной причиной копирования template0 вместо template1 является то, что при копировании можно указать
новые параметры кодировки и локали template0, тогда как копия template1 должна использовать те же настройки, что и исходная база данных.
Это связано с тем, что template1 может содержать данные, специфичные для определенной кодировки
или локали, в то время как template0 заведомо их не содержит.
Чтобы создать базу данных путем копирования template0, используйте команду:
CREATE DATABASE dbname TEMPLATE template0;
из SQL-среды или:
createdb -T template0 dbname
из командной оболочки.
Можно создавать дополнительные шаблонные базы данных; более того,
допускается копирование любой базы данных в кластере путем указания её имени
в качестве шаблона для функции CREATE DATABASE. Однако важно понимать, что данный механизм (пока) не предназначен для использования в качестве универсального средства «COPY DATABASE» .
Основное ограничение заключается в том, что к исходной базе данных не должно быть
других подключенных сеансов во время её копирования. CREATE
DATABASE завершится ошибкой, если на момент начала выполнения команды существуют другие подключения;
во время операции копирования создание новых подключений к исходной базе данных
блокируется.
Для каждой базы данных существуют два полезных флага в pg_database для каждой базы данных: столбцы datistemplate и
datallowconn. datistemplate
могут быть установлены для указания того, что база данных предназначена в качестве шаблона для
CREATE DATABASE. Если этот флаг установлен, база данных может быть клонирована любым пользователем с CREATEDB привилегиями; если же он не установлен,
клонировать её могут только суперпользователи и владелец базы данных.
Если datallowconn имеет значение false, то новые подключения к этой базе данных будут запрещены (однако существующие сессии не завершаются принудительно при установке флага в значение false). template0
база данных обычно помечается datallowconn = false для предотвращения её модификации.
Обе template0 и template1
всегда должны быть помечены datistemplate = true.
template1 и template0 не имеют специального
статуса, за исключением того факта, что имя template1 является именем исходной базы данных по умолчанию для CREATE DATABASE.
Например, можно удалить template1 и воссоздать её из
template0 без каких-либо негативных последствий. Такой порядок действий
может быть целесообразен, если в базу данных было добавлено большое количество лишних объектов в
template1. (Чтобы удалить template1,
её параметр pg_database.datistemplate = false.)
Согласно postgres база данных также создается при инициализации кластера баз данных. Данная база данных предназначена для использования в качестве базы данных по умолчанию при подключении пользователей и приложений. Она представляет собой копию
template1 и может быть удалена и воссоздана при необходимости.