Перейти к основному содержимому

CREATE SCHEMA

примечание

Эта страница переведена при помощи нейросети GigaChat.

CREATE SCHEMA — создание новой схемы.

Синтаксис

CREATE SCHEMA schema_name [ AUTHORIZATION role_specification ] [ schema_element [ ... ] ]
CREATE SCHEMA AUTHORIZATION role_specification [ schema_element [ ... ] ]
CREATE SCHEMA IF NOT EXISTS schema_name [ AUTHORIZATION role_specification ]
CREATE SCHEMA IF NOT EXISTS AUTHORIZATION role_specification

where role_specification can be:

user_name
| CURRENT_ROLE
| CURRENT_USER
| SESSION_USER

Описание

CREATE SCHEMA добавляет новую схему в текущую базу данных. Имя схемы должно быть уникальным — оно не должно совпадать с именами уже существующих схем в этой базе данных.

Схема по сути является пространством имен: она содержит именованные объекты (например, таблицы, типы данных, функции и операторы), имена которых могут повторяться с объектами в других схемах. Доступ к этим объектам осуществляется либо путем указания имени схемы как префикса (то есть через полное имя), либо путем настройки пути поиска схем, включающего нужную схему или схемы. Если команда CREATE используется с именем объекта без указания схемы, то объект будет создан в текущей схеме (той, которая стоит первой в пути поиска). Узнать эту схему можно с помощью функции current_schema.

Опционально команда CREATE SCHEMA может включать подкоманды, создающие объекты внутри новой схемы. Эти подкоманды по сути равнозначны отдельным SQL-командам, выполняемым после создания схемы. Однако если используется выражение AUTHORIZATION, то все созданные в такой схеме объекты будут принадлежать указанному пользователю.

Параметры

schema_name
Задает имя схемы, которая должна быть создана. Если имя не указано, в качестве имени схемы используется имя пользователя. Имя схемы не может начинаться с префикса pg_, так как такие имена зарезервированы под системные схемы.
user_name
Имя роли пользователя, которому будет принадлежать новая схема. Если опущено, по умолчанию используется пользователь, выполняющий команду. Чтобы создать схему, принадлежащую другой роли, необходимо иметь возможность SET ROLE к этой роли.
schema_element
Задает оператор SQL, определяющий объект, который будет создан внутри схемы. В настоящее время в качестве подкоманд внутри CREATE SCHEMA принимаются только следующие операторы: CREATE TABLE, CREATE VIEW, CREATE INDEX, CREATE SEQUENCE, CREATE TRIGGER и GRANT. Остальные типы объектов можно создать отдельными командами после создания схемы.
IF NOT EXISTS
Подавляет ошибку, если схема с указанным именем уже существует, вместо этого будет выдано уведомление. При использовании этого параметра нельзя указывать подкоманды schema_element.

Примечания

Для создания схемы, вызывающий пользователь должен иметь привилегию 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 допускает указание выражения DEFAULT CHARACTER SET в команде CREATE SCHEMA, а также поддерживает больше типов подкоманд, чем в настоящее время разрешено в PostgreSQL.

Согласно стандарту SQL, подкоманды внутри CREATE SCHEMA могут быть указаны в любом порядке. Однако текущая реализация PostgreSQL не обрабатывает все случаи, при которых внутри этих подкоманд происходят ссылки на еще не созданные объекты. Поэтому в некоторых случаях может потребоваться изменить порядок подкоманд, чтобы избежать ссылок на несуществующие элементы.

Также согласно стандарту SQL, владелец схемы всегда является владельцем всех объектов, находящихся внутри этой схемы. В PostgreSQL разрешено, чтобы объекты в схеме принадлежали другим пользователям, отличным от владельца схемы. Это возможно только в том случае, если владелец схемы предоставляет другим пользователям привилегию CREATE на эту схему или если суперпользователь создает объекты в ней.

Параметр IF NOT EXISTS является расширением PostgreSQL.

Смотрите также

ALTER SCHEMA, DROP SCHEMA