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.