CREATE SCHEMA
CREATE SCHEMA — создать схему
Синтаксис
CREATE SCHEMAимя_схемы[ AUTHORIZATIONуказание_роли] [элемент_схемы[ ... ] ] CREATE SCHEMA AUTHORIZATIONуказание_роли[элемент_схемы[ ... ] ] CREATE SCHEMA IF NOT EXISTSимя_схемы[ AUTHORIZATIONуказание_роли] CREATE SCHEMA IF NOT EXISTS AUTHORIZATIONуказание_ролиЗдесьуказание_роли:имя_пользователя| 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.
См. также
ALTER SCHEMA, DROP SCHEMACREATE SCHEMA
CREATE SCHEMA — define a new schema
Synopsis
CREATE SCHEMAschema_name[ AUTHORIZATIONrole_specification] [schema_element[ ... ] ] CREATE SCHEMA AUTHORIZATIONrole_specification[schema_element[ ... ] ] CREATE SCHEMA IF NOT EXISTSschema_name[ AUTHORIZATIONrole_specification] CREATE SCHEMA IF NOT EXISTS AUTHORIZATIONrole_specificationwhererole_specificationcan be:user_name| CURRENT_USER | SESSION_USER
Description
CREATE SCHEMA enters a new schema into the current database. The schema name must be distinct from the name of any existing schema in the current database.
A schema is essentially a namespace: it contains named objects (tables, data types, functions, and operators) whose names can duplicate those of other objects existing in other schemas. Named objects are accessed either by “qualifying” their names with the schema name as a prefix, or by setting a search path that includes the desired schema(s). A CREATE command specifying an unqualified object name creates the object in the current schema (the one at the front of the search path, which can be determined with the function current_schema).
Optionally, CREATE SCHEMA can include subcommands to create objects within the new schema. The subcommands are treated essentially the same as separate commands issued after creating the schema, except that if the AUTHORIZATION clause is used, all the created objects will be owned by that user.
Parameters
schema_nameThe name of a schema to be created. If this is omitted, the
user_nameis used as the schema name. The name cannot begin withpg_, as such names are reserved for system schemas.user_nameThe role name of the user who will own the new schema. If omitted, defaults to the user executing the command. To create a schema owned by another role, you must be a direct or indirect member of that role, or be a superuser.
schema_elementAn SQL statement defining an object to be created within the schema. Currently, only
CREATE TABLE,CREATE VIEW,CREATE INDEX,CREATE SEQUENCE,CREATE TRIGGERandGRANTare accepted as clauses withinCREATE SCHEMA. Other kinds of objects may be created in separate commands after the schema is created.IF NOT EXISTSDo nothing (except issuing a notice) if a schema with the same name already exists.
schema_elementsubcommands cannot be included when this option is used.
Notes
To create a schema, the invoking user must have the CREATE privilege for the current database. (Of course, superusers bypass this check.)
Examples
Create a schema:
CREATE SCHEMA myschema;
Create a schema for user joe; the schema will also be named joe:
CREATE SCHEMA AUTHORIZATION joe;
Create a schema named test that will be owned by user joe, unless there already is a schema named test. (It does not matter whether joe owns the pre-existing schema.)
CREATE SCHEMA IF NOT EXISTS test AUTHORIZATION joe;
Create a schema and create a table and view within it:
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;
Notice that the individual subcommands do not end with semicolons.
The following is an equivalent way of accomplishing the same result:
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;
Compatibility
The SQL standard allows a DEFAULT CHARACTER SET clause in CREATE SCHEMA, as well as more subcommand types than are presently accepted by Postgres Pro.
The SQL standard specifies that the subcommands in CREATE SCHEMA can appear in any order. The present Postgres Pro implementation does not handle all cases of forward references in subcommands; it might sometimes be necessary to reorder the subcommands in order to avoid forward references.
According to the SQL standard, the owner of a schema always owns all objects within it. Postgres Pro allows schemas to contain objects owned by users other than the schema owner. This can happen only if the schema owner grants the CREATE privilege on their schema to someone else, or a superuser chooses to create objects in it.
The IF NOT EXISTS option is a Postgres Pro extension.