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_, так как такие имена зарезервированы для системных схем.имя_пользователяИмя пользователя (роли), назначаемого владельцем новой схемы. Если опущено, по умолчанию владельцем будет пользователь, выполняющий команды. Чтобы назначить владельцем создаваемой схемы другую роль, необходимо иметь право
SET ROLEдля этой роли.элемент_схемыОператор 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.