CREATE SCHEMA
CREATE SCHEMA — создать схему
Синтаксис
CREATE SCHEMAимя_схемы
[ AUTHORIZATIONуказание_роли
] [элемент_схемы
[ ... ] ] CREATE SCHEMA AUTHORIZATIONуказание_роли
[элемент_схемы
[ ... ] ] CREATE SCHEMA IF NOT EXISTSимя_схемы
[ AUTHORIZATIONуказание_роли
] CREATE SCHEMA IF NOT EXISTS AUTHORIZATIONуказание_роли
Здесьуказание_роли
:имя_пользователя
| CURRENT_ROLE | CURRENT_USER | SESSION_USER
Описание
CREATE SCHEMA
создаёт новую схему в текущей базе данных. Имя схемы должно отличаться от имён других существующих схем в текущей базе данных.
Схема по сути представляет собой пространство имён: она содержит именованные объекты (таблицы, типы данных, функции и операторы), имена которых могут совпадать с именами других объектов, существующих в других схемах. Для обращения к объекту нужно либо «дополнить» его имя именем схемы в виде префикса, либо установить путь поиска, включающий требуемую схему. Команда CREATE
, в которой указывается неполное имя объекта, создаёт объект в текущей схеме (схеме, стоящей первой в пути поиска; узнать её позволяет функция current_schema
).
Команда CREATE SCHEMA
может дополнительно включать подкоманды, создающие объекты в новой схеме. Эти подкоманды по сути воспринимаются как отдельные команды, выполняемые после создания схемы, за исключением того, что с предложением AUTHORIZATION
все создаваемые объекты будут принадлежать указанному в нём пользователю.
Параметры
имя_схемы
Имя создаваемой схемы. Если оно опущено, именем схемы будет
имя_пользователя
. Это имя не может начинаться сpg_
, так как такие имена зарезервированы для системных схем.имя_пользователя
Имя пользователя (роли), назначаемого владельцем новой схемы. Если опущено, по умолчанию владельцем будет пользователь, выполняющий команды. Чтобы назначить владельцем создаваемой схемы другую роль, необходимо быть непосредственным или опосредованным членом этой роли, либо суперпользователем.
элемент_схемы
Оператор SQL, определяющий объект, создаваемый в новой схеме. В настоящее время
CREATE SCHEMA
может содержать только подкомандыCREATE TABLE
,CREATE VIEW
,CREATE INDEX
,CREATE SEQUENCE
,CREATE TRIGGER
иGRANT
. Создать объекты других типов можно отдельными командами после создания схемы.IF NOT EXISTS
Не делать ничего (только выдать замечание), если схема с таким именем уже существует. Когда используется это указание, эта команда не может содержать подкоманды
элемент_схемы
.
Примечания
Чтобы создать схему, пользователь должен иметь право CREATE
в текущей базе данных. (Разумеется, на суперпользователей это условие не распространяется.)
Примеры
Создание схемы:
CREATE SCHEMA myschema;
Создание схемы для пользователя joe
; схема так же получит имя joe
:
CREATE SCHEMA AUTHORIZATION joe;
Создание схемы с именем test
, владельцем которой будет пользователь joe
, если только схема test
ещё не существует. (Является ли владельцем существующей схемы пользователь joe
, значения не имеет.)
CREATE SCHEMA IF NOT EXISTS test AUTHORIZATION joe;
Создание схемы, в которой сразу создаются таблица и представление:
CREATE SCHEMA hollywood CREATE TABLE films (title text, release date, awards text[]) CREATE VIEW winners AS SELECT title, release FROM films WHERE awards IS NOT NULL;
Заметьте, что отдельные подкоманды не завершаются точкой с запятой.
Следующие команды приводят к тому же результату другим способом:
CREATE SCHEMA hollywood; CREATE TABLE hollywood.films (title text, release date, awards text[]); CREATE VIEW hollywood.winners AS SELECT title, release FROM hollywood.films WHERE awards IS NOT NULL;
Совместимость
Стандарт SQL также допускает в команде CREATE SCHEMA
предложение DEFAULT CHARACTER SET
и дополнительные типы подкоманд, которые Postgres Pro в настоящее время не принимает.
В стандарте SQL говорится, что подкоманды в CREATE SCHEMA
могут следовать в любом порядке. Однако текущая реализация в Postgres Pro не воспринимает все возможные варианты ссылок вперёд в подкомандах, поэтому иногда возникает необходимость переупорядочить подкоманды, чтобы исключить такие ссылки.
Согласно стандарту SQL, владелец схемы всегда владеет всеми объектами в ней, но Postgres Pro допускает размещение в схемах объектов, принадлежащих не владельцу схемы. Такая ситуация возможна, только если владелец схемы даст право CREATE
в этой схеме кому-либо другому, либо объекты в ней будет создавать суперпользователь.
Указание IF NOT EXISTS
является расширением Postgres Pro.