Команды SQL

Эта часть содержит справочную информацию для команд SQL, поддерживаемых QHB. Под "SQL" подразумевается язык в целом; информацию о соответствии стандартам и совместимости каждой команды можно найти на соответствующей справочной странице.


ABORT

ABORT - прервать текущую транзакцию

Синтаксис

ABORT [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ]

Описание

ABORT откатывает текущую транзакцию и отменяет все изменения, внесенные транзакцией. Команда ABORT идентична по своему поведению стандартной SQL-команде ROLLBACK, и присутствует только по историческим причинам

Параметры

WORK TRANSACTION

Необязательные ключевые слова, не влияют на результат.

AND CHAIN

Если указывается AND CHAIN , то сразу после окончания текущей транзакции начинается новая с теми же характеристиками, что и только что завершенная (см. раздел SET TRANSACTION). В противном случае новая транзакция не начинается.

Примечания

Используйте COMMIT для успешного завершения и фиксации транзакции.

При выполнении ABORT вне блока транзакций будет выдано предупреждение, и больше ничего не произойдет.

Примеры

Отмена всех изменений:

ABORT;

Совместимость

Команда ABORT является расширением QHB, и присутствует по историческим причинам. Cтандартная SQL-команда ROLLBACK идентична ей по своему поведению.

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

BEGIN, COMMIT, ROLLBACK


ALTER AGGREGATE

ALTER AGGREGATE — изменить определение агрегатной функции

Синтаксис

ALTER AGGREGATE имя ( сигнатура_агрегатной_функции ) RENAME TO новое_имя
ALTER AGGREGATE имя ( сигнатура_агрегатной_функции )
                OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER AGGREGATE имя ( сигнатура_агрегатной_функции ) SET SCHEMA новая_схема

Где сигнатура_агрегатной_функции:

* |
[ режим_аргумента ] [ имя_аргумента ] тип_аргумента [ , ... ] |
[ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [ , ... ] ]
	ORDER BY [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [ , ... ]

Описание

ALTER AGGREGATE изменяет определение агрегатной функции.

Выполнить команду ALTER AGGREGATE может только владелец соответствующей агрегатной функции. Чтобы изменить схему агрегатной функции, необходимо иметь право CREATE в новой схеме. Для изменения владельца, текущий пользователь также должен быть непосредственным или опосредованным членом новой роли, и эта роль должна иметь право CREATE в схеме агрегатной функции. (Эти ограничения направлены на то, чтобы при смене владельца не происходило ничего, что нельзя было бы сделать, имея право удалить и снова создать агрегатную функцию. Однако суперпользователь может изменить владельца любой агрегатной функции).

Параметры

Имя

Имя существующей агрегатной функции, которое может быть дополнено схемой.

режим_аргумента

Режим аргумента: IN или VARIADIC. Если этот параметр не указан, значение по умолчанию равно IN.

имя_аргумента

Название аргумента. Обратите внимание, что ALTER AGGREGATE фактически не обращает никакого внимания на имена аргументов, поскольку для определения идентичности агрегатной функции требуются только типы данных аргументов.

тип_аргумента

Тип входных данных, с которыми работает агрегатная функция. Чтобы сослаться на агрегатную функцию без аргументов, напишите * вместо списка аргументов. Чтобы сослаться на сортирующую агрегатную функцию, напишите ORDER BY между указаниями непосредственных и агрегируемых аргументов.

новое_имя

Новое имя агрегатной функции.

новый_владелец

Новый владелец агрегатной функции.

новая_схема

Новая схема для агрегатной функции.

Примечания

Чтобы сослаться на сортирующую агрегатную функцию, напишите ORDER BY
между указаниями непосредственных и агрегируемых аргументов, как в CREATE AGGREGATE. Однако, команда будет выполнена и без ORDER BY, если просто перечислить непосредственные и агрегирующие аргументы подряд в одном списке. В такой сокращенной форме, если VARIADIC "any" используется как в списке непосредственных, так и в списке агрегирующих аргументов, достаточно указать VARIADIC "any" только один раз.

Примеры

Переименование агрегатной функции myavg с типом integer в my_average:

ALTER AGGREGATE myavg(integer) RENAME TO my_average;

Смена владельца агрегатной функции myavg с типом integer на joe:

ALTER AGGREGATE myavg(integer) OWNER TO joe;

Перемещение сортирующей агрегатной функции mypercentile с непосредственным аргументом типа float8 и агрегируемым аргументом типа integer в схему myschema:

ALTER AGGREGATE mypercentile(float8 ORDER BY integer) SET SCHEMA myschema;

Так тоже будет работать:

ALTER AGGREGATE mypercentile(float8, integer) SET SCHEMA myschema;

Совместимость

Команда ALTER AGGREGATE отсутствует в стандарте SQL.

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

CREATE AGGREGATE, DROP AGGREGATE


ALTER COLLATION

ALTER COLLATION — изменить определение правила сортировки

Синтаксис

ALTER COLLATION имя RENAME TO новое_имя
ALTER COLLATION имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER COLLATION имя SET SCHEMA новая_схема

Описание

ALTER COLLATION изменяет определение правила сортировки.

Выполнить команду ALTER COLLATION может только владелец соответствующего правила сортировки. Для изменения владельца, текущий пользователь должен быть непосредственным или опосредованным членом новой роли-владельца, а эта роль должна иметь право CREATE в схеме правила сортировки. (Эти ограничения направлены на то, чтобы при смене владельца не происходило ничего, что нельзя было бы сделать, имея право удалить и снова создать правило сортировки. Однако суперпользователь может изменить владельца любого правила сортировки).

Параметры

имя

Имя существующего правила сортировки, которое может быть дополнено схемой.

новое_имя

Новое имя правила сортировки.

новый_владелец

Новый владелец правила сортировки.

новая_схема

Новая схема для правила сортировки.

REFRESH VERSION

Обновить версию правила сортировки. Смотрите примечания ниже.

Примечания

Во время применения правил сортировки, которые предоставляются библиотекой ICU, внутренняя версия сортировщика ICU будет записана в системный каталог при создании объекта для данного правила. При использовании правила, текущая версия будет сверена с записанной и в случае несоответствия будет выдано предупреждение, например:

WARNING:  collation "xx-x-icu" has version mismatch
DETAIL:  The collation in the database was created using version 1.2.3.4, but the operating system provides version 2.3.4.5.
HINT:  Rebuild all objects affected by this collation and run ALTER COLLATION pg_catalog."xx-x-icu" REFRESH VERSION, or build PostgreSQL with the right library version.

Изменение определений правил сортировки может привести к разрушению индексов и другим проблемам, поскольку СУБД рассчитывает, что хранимые объекты имеют определенный порядок сортировки. Этого следует избегать, но такое может иметь место, например, при обновлении при помощи qhb_upgrade исполняемых файлов сервера, скомпилированных с более новой версией ICU. Когда это происходит, все объекты зависящие от правил сортировки должны быть перестроены, например, с помощью REINDEX . После этого, версию правил сортировки нужно обновить выполнив ALTER COLLATION ... REFRESH VERSION. Это позволит обновить системный каталог и в него будет записана текущая версия сортировщика, и предупреждение исчезнет. Обратите внимание, что при выполнении команды фактически не проверяется, все ли затронутые объекты были перестроены правильно.

Для определения всех правил сортировки в текущей базе данных, которые необходимо обновить, и объектов, которые зависят от них, можно использовать следующий запрос:

SELECT pg_describe_object(refclassid, refobjid, refobjsubid) AS "Collation",
       pg_describe_object(classid, objid, objsubid) AS "Object"
  FROM pg_depend d JOIN pg_collation c
       ON refclassid = 'pg_collation'::regclass AND refobjid = c.oid
  WHERE c.collversion <> pg_collation_actual_version(c.oid)
  ORDER BY 1, 2;

Примеры

Переименование правила сортировки de_DE в german:

ALTER COLLATION "de_DE" RENAME TO german;

Изменение владельца правила сортировки en_US на joe:

ALTER COLLATION "en_US" OWNER TO joe;

Совместимость

Команда ALTER COLLATION отсутствует в стандарте SQL.

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

CREATE COLLATION, DROP COLLATION


ALTER CONVERSION

ALTER CONVERSION — изменить определение перекодировки

Синтаксис

ALTER CONVERSION имя RENAME TO новое_имя
ALTER CONVERSION имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER CONVERSION имя SET SCHEMA новая_схема

Описание

ALTER CONVERSION изменяет определение перекодировки.

Выполнить команду ALTER CONVERSION может только владелец соответствующей перекодировки. Для изменения владельца, текущий пользователь должен быть непосредственным или опосредованным членом новой роли, и эта роль должна иметь право CREATE в схеме перекодировки. (Эти ограничения направлены на то, чтобы при смене владельца не происходило ничего, что нельзя было бы сделать, имея право удалить и снова создать перекодировку. Однако суперпользователь может изменить владельца любого перекодировки).

Параметры

Имя

Имя существующей перекодировки, которое может быть дополнено схемой.

новое_имя

Новое имя перекодировки.

новый_владелец

Новый владелец перекодировки.

новая_схема

Новая схема для перекодировки.

Примеры

Переименование перекодировки iso_8859_1_to_utf8 в latin1_to_unicode:

ALTER CONVERSION iso_8859_1_to_utf8 RENAME TO latin1_to_unicode;

Смена владельца перекодировки iso_8859_1_to_utf8 на joe:

ALTER CONVERSION iso_8859_1_to_utf8 OWNER TO joe;

Совместимость

Команда ALTER CONVERSION отсутствует в стандарте SQL

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

CREATE CONVERSION, DROP CONVERSION


ALTER DATABASE

ALTER DATABASE - изменить атрибуты базы данных

Синтаксис

ALTER DATABASE имя [ [ WITH ] параметр [ ... ] ]

Где параметр может быть:

    ALLOW_CONNECTIONS разреш_подключения
    CONNECTION LIMIT предел_подключений
    IS_TEMPLATE это_шаблон

ALTER DATABASE имя RENAME TO новое_имя

ALTER DATABASE имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }

ALTER DATABASE имя SET TABLESPACE новое_табл_пространство

ALTER DATABASE имя SET параметр_конфигурации { TO | = } { значение | DEFAULT }
ALTER DATABASE имя SET параметр_конфигурации FROM CURRENT
ALTER DATABASE имя RESET параметр_конфигурации
ALTER DATABASE имя RESET ALL

Описание

ALTER DATABASE изменяет атрибуты базы данных.

Первая форма команды изменяет параметры указанной базы данных. (Подробнее описано ниже). Изменять эти параметры может только владелец базы данных или суперпользователь.

Вторая форма команды изменяет имя базы данных. Переименовать базу данных может только владелец базы данных или суперпользователь (не суперпользователи должны обладать правом CREATEDB). Переименовать текущую базу данных нельзя. (Если вы хотите сделать это, то подключитесь к другой базе данных).

Третья форма команды изменяет владельца базы данных. Чтобы сменить владельца, текущий пользователь должен быть ее владельцем, а также быть непосредственным или опосредованным (неявным) членом новой роли-владельца, и кроме того, иметь право CREATEDB. (Напомним, что суперпользователи получают все эти права автоматически).

Четвертая форма команды изменяет табличное-пространство-по-умолчанию базы данных. Это может сделать только владелец базы данных или суперпользователь; кроме того, вам необходимо иметь право на создание нового табличного пространства. Эта команда физически перемещает все таблицы (или индексы) из старого табличного пространства базы данных в новое. Новое табличное-пространство-по-умолчанию должно быть пустым, и никто не должен быть подключен к БД. Таблицы и индексы не из табличного-пространства-по-умолчанию, не затрагиваются.

Остальные формы данной команды изменяют сеансовое значение по умолчанию у run-time конфигурационной переменной базы данных QHB. При последующем запуске нового сеанса в этой базе данных, указанное значение становится значением по умолчанию. Значения переменных, заданные для базы данных таким способом, переопределяют значения из qhb.conf или полученные из командной строки QHB. Только владелец базы данных или суперпользователь может изменить сеансовые значения переменных для базы данных. Обратите внимание, что некоторые переменные не могут быть установлены таким образом или могут быть установлены только суперпользователем.

Параметры

имя

Имя базы данных, атрибуты которой вы хотите изменить.

разреш_подключения

Если false, то никто не сможет подключиться к этой базе данных.

предел_подключений

Сколько одновременных подключений может быть сделано к этой базе данных. (-1 означает отсутствие ограничений).

это_шаблон

Если true, то эта база данных может быть клонирована любым пользователем с правами CREATEDB; если значение false, то клонировать БД могут только суперпользователи или владелец базы данных.

новое_имя

Новое имя базы данных.

новый_владелец

Новый владелец базы данных.

новое_табл_пространство

Новое табличное пространство по умолчанию для базы данных.

Эту форму команды нельзя выполнить внутри блока транзакций.

параметр_конфигурации
значение

Устанавливает сеансовое значение по умолчанию для указанного параметра конфигурации. Если указано значение DEFAULT (или его равнозначный вариант RESET), то предыдущее значение параметра удаляется, и в новых сеансах будет действовать значение, взятое из системных настроек по умолчанию. Для сброса всех значений параметров базы данных выполните RESET ALL. SET FROM CURRENT устанавливает значение указанного параметра базы данных из его текущего значения в активном сеансе.

Дополнительную информацию об именах и значениях параметров смотрите в разделах SET и главе Конфигурация сервера.

Примечания

Существует возможность привязать параметры сеанса по умолчанию к определенной роли, а не к базе данных; см. ALTER ROLE. Ролевые параметры переопределяют параметры для конкретной базы данных, если возникает конфликт.

Примеры

Отключение сканирования индекса по умолчанию в базе данных test:

ALTER DATABASE test SET enable_indexscan TO off;

Совместимость

Команда ALTER DATABASE является расширением QHB.

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

CREATE DATABASE, DROP DATABASE, SET, CREATE TABLESPACE


ALTER DEFAULT PRIVILEGES

ALTER DEFAULT PRIVILEGES - определить права доступа по умолчанию

Синтаксис

ALTER DEFAULT PRIVILEGES
    [ FOR { ROLE | USER } целевая_роль [, ...] ]
    [ IN SCHEMA имя_схемы [, ...] ]
    предложение_GRANT_или_REVOKE

--Где предложение_GRANT_или_REVOKE может быть следующим:

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [, ...] | ALL [ PRIVILEGES ] }
    ON TABLES
    TO { [ GROUP ] имя_роли | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON SEQUENCES
    TO { [ GROUP ] имя_роли | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON FUNCTIONS
    TO { [ GROUP ] имя_роли | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON TYPES
    TO { [ GROUP ] имя_роли | PUBLIC } [, ...] [ WITH GRANT OPTION ]

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [, ...] | ALL [ PRIVILEGES ] }
    ON TABLES
    FROM { [ GROUP ] имя_роли | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON SEQUENCES
    FROM { [ GROUP ] имя_роли | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { EXECUTE | ALL [ PRIVILEGES ] }
    ON FUNCTIONS
    FROM { [ GROUP ] имя_роли | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON TYPES
    FROM { [ GROUP ] имя_роли | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

Описание

ALTER DEFAULT PRIVILEGES позволяет задавать права, которые будут применяться к объектам, создаваемым в будущем. (Это не влияет на права, назначенные уже существующим объектам). В настоящее время можно задавать права только для схем, таблиц (включая представления и сторонние таблицы), последовательностей, функций и типов (включая домены). Применительно к данной команде функциями считаются также агрегатные функции и процедуры. Слова FUNCTIONS и ROUTINES равнозначны этой команде. (ROUTINES предпочтительнее в перспективе как стандартный термин, охватывающий и функции, и процедуры. Задать права по умолчанию для функций и процедур по отдельности нельзя).

Вы можете изменить права по умолчанию только для объектов, которые будут созданы вами или ролями, членом которых вы являетесь. Права доступа могут быть установлены глобально (т. е. для всех объектов, создаваемых в текущей базе данных) или только для объектов, созданных в определенных схемах.

Как объяснено в разделе Права, права по умолчанию для любого типа объекта обычно предоставляют все назначаемые разрешения владельцу объекта и могут предоставлять некоторые права роли PUBLIC. Однако это поведение можно изменить, меняя права по умолчанию командой ALTER DEFAULT PRIVILEGES.

Параметры

целевая_роль

Имя существующей роли, членом которой является текущая роль. Если FOR ROLE не указано, предполагается текущая роль.

имя_схемы

Имя существующей схемы. Если этот параметр указан, то права доступа по умолчанию изменяются для объектов, которые будут создаваться в этой схеме позднее. Если IN SCHEMA не указано, меняются глобальные права по умолчанию. Указание IN SCHEMA не может быть указано при установлении прав для схем, так как схемы не могут быть вложенными.

имя_роли

Имя существующей роли, для которой необходимо предоставить или отозвать права. Этот параметр, а также все остальные параметры в предложении_grant_или_revoke, действуют как описано в GRANT или REVOKE, за исключением того, что они распространяются не на один конкретный объект, а на целый класс объектов.

Примечания

Для получения информации о текущих назначенных правах по умолчанию, воспользуйтесь командой \ddp в qsql. Как интерпретировать выводимую ей информацию, смотрите в описании команды \dp в разделе Права.

Если вы хотите удалить роль, права по умолчанию для которой были изменены, необходимо явно отменить изменения прав по умолчанию или воспользоваться командой DROP OWNED BY для упразднения назначенных для этой роли прав по умолчанию.

Примеры

Добавление права SELECT всем пользователям на все таблиц (и представления), которые будут созданы в будущем в схеме myschema, и добавление роли webuser права INSERT для этих же таблиц:

ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES TO PUBLIC;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT INSERT ON TABLES TO webuser;

Отмена предыдущих изменений, чтобы для таблиц, которые будут созданы в будущем, были определены только обычные права, без дополнительных:

ALTER DEFAULT PRIVILEGES IN SCHEMA myschema REVOKE SELECT ON TABLES FROM PUBLIC;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema REVOKE INSERT ON TABLES FROM webuser;

Удаление у роли public права на выполнение (EXECUTE), которое обычно выдаётся для функций (для всех функций, которые будут созданы ролью admin):

ALTER DEFAULT PRIVILEGES FOR ROLE admin REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;

Обратите внимание, что тот же эффекта нельзя получить с помощью команды, ограниченной одной схемой. Эта команда будет действовать, только если ей предшествовала соответствующая команда GRANT:

ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;

Дело в том, что на уровне схемы можно только назначить права по умолчанию, которые добавятся к назначенным глобально, но нельзя отозвать последние.

Совместимость

Команда ALTER DEFAULT PRIVILEGES отсутствует в стандарте SQL.

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

GRANT, REVOKE


ALTER DOMAIN

ALTER DOMAIN - изменить определение домена

Синтаксис

ALTER DOMAIN имя
    { SET DEFAULT выражение | DROP DEFAULT }
ALTER DOMAIN имя
    { SET | DROP } NOT NULL
ALTER DOMAIN имя
    ADD ограничение_домена [ NOT VALID ]
ALTER DOMAIN имя
    DROP CONSTRAINT [ IF EXISTS ] имя_ограничения [ RESTRICT | CASCADE ]
ALTER DOMAIN имя
     RENAME CONSTRAINT имя_ограничения TO имя_нового_ограничения
ALTER DOMAIN имя
    VALIDATE CONSTRAINT имя_ограничения
ALTER DOMAIN имя
    OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER DOMAIN имя
    RENAME TO новое_имя
ALTER DOMAIN имя
    SET SCHEMA новая_схема

Описание

ALTER DOMAIN изменяет определение существующего домена. Команда имеет несколько форм:

SET/DROP DEFAULT

Эти формы устанавливают или удаляют значение по умолчанию для домена. Обратите внимание, что значения по умолчанию применяются только к последующим командам INSERT; они не влияют на строки c данным доменом, уже находящиеся в таблице.

SET/DROP NOT NULL

Эти формы определяют, будет ли разрешены значения NULL. Установить SET NOT NULL можно только если столбцы, использующие домен, не содержат нулевых значений.

ADD ограничение_домена [ NOT VALID ]

Эта форма добавляет новое ограничение к домену, используя тот же синтаксис, который описан в CREATE DOMAIN. При добавлении нового ограничения домена все столбцы этого домен, будут проверены на соответствие вновь добавленному ограничению. Эти проверки могут быть пропущены, если добавить указание NOT VALID; а затем активировать позже с помощью ALTER DOMAIN ... VALIDATE CONSTRAINT. Но при вставке и обновлении строк они всегда проверяются по всем ограничениям, даже тем, которые отмечены NOT VALID. NOT VALID принимается только для ограничений CHECK.

DROP CONSTRAINT [ IF EXISTS ]

Эта форма удаляет ограничения домена. Если IF EXISTS указывается и ограничение не существует, это не считается ошибкой. В этом случае выдается предупреждение.

RENAME CONSTRAINT

Эта форма изменяет имя ограничения домена.

VALIDATE CONSTRAINT

Эта форма включает проверку ограничения, добавленного как NOT VALID то есть проверяет, что все значения в столбцах домена удовлетворяют указанному ограничению.

OWNER

Эта форма изменяет владельца домена на указанного пользователя.

RENAME

Эта форма изменяет имя домена.

SET SCHEMA

Эта форма изменяет схему домена. Все ограничения, связанные с доменом, также перемещаются в новую схему.

Выполнить команду ALTER DOMAIN может только владелец соответствующего домена. Чтобы изменить схему домена, необходимо иметь право CREATE в новой схеме. Для изменения владельца, текущий пользователь должен быть непосредственным или опосредованным членом новой роли, и эта роль должна иметь право CREATE в схеме домена. (Эти ограничения направлены на то, чтобы при смене владельца не происходило ничего, что нельзя было бы сделать, имея право удалить и снова создать домен. Однако суперпользователь может изменить владельца любого домена).

Параметры

имя

Имя, которое может быть дополнено схемой, существующего домена, который нужно изменить.

ограничение_домена

Новое ограничение домена.

имя_ограничения

Имя существующего ограничения, которое будет удалено или переименовано.

NOT VALID

Не проверять существующие сохраненные данные на соответствие ограничению.

CASCADE

Автоматически удалять объекты, зависящие от ограничения, и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей).

RESTRICT

Запретить удаление ограничения, если есть какие-либо зависимые от него объекты. Это поведение по умолчанию.

новое_имя

Новое имя домена.

имя_нового_ограничения

Новое имя ограничения.

новый_владелец

Имя пользователя, который станет новым владельцем домена.

новая_схема

Новая схема домена.

Примечания

Несмотря на то, что команда ALTER DOMAIN ADD CONSTRAINT пытается проверить, что существующие данные удовлетворяют новому ограничению, эта проверка не очень надежна, поскольку команда не может “видеть” строки таблицы, которые были только что вставлены или обновлены и еще не зафиксированы. Если существует опасность того, что параллельные операции могут вставлять неверные данные, можно применить следующий подход: создайте ограничения с указанием NOT VALID, зафиксируйте эту команду, подождите, пока завершатся все транзакции, начатые до фиксирования, а затем выполните ALTER DOMAIN VALIDATE CONSTRAINT для поиска данных, нарушающих ограничение. В этом случае проверка будет надёжной, так как после фиксирования ограничения оно будет гарантированно действовать на все новые значения типа домена, вносимые последующими транзакциями.

В настоящее время ALTER DOMAIN ADD CONSTRAINT, ALTER DOMAIN VALIDATE CONSTRAINT и ALTER DOMAIN SET NOT NULL завершаются ошибкой, если домен или любой производный от него домен используется с типом-контейнером (это может быть составной, диапазонный тип или массив) в какой-либо таблице базы данных. В дальнейшем они будут доработаны, с тем чтобы новое ограничение проверялось и при такой вложенности

Примеры

Добавление ограничения NOT NULL к домену:

ALTER DOMAIN zipcode SET NOT NULL;

Удаление ограничения NOT NULL из домена:

ALTER DOMAIN zipcode DROP NOT NULL;

Добавление ограничения-проверки к домену:

ALTER DOMAIN zipcode ADD CONSTRAINT zipchk CHECK (char_length(VALUE) = 5);

Удаление ограничения-проверки из домена:

ALTER DOMAIN zipcode DROP CONSTRAINT zipchk;

Переименование ограничения-проверки в домене:

ALTER DOMAIN zipcode RENAME CONSTRAINT zipchk TO zip_check;

Перемещение домена в другую схему:

ALTER DOMAIN zipcode SET SCHEMA customers;

Совместимость

Команда ALTER DOMAIN соответствует стандарту SQL, за исключением форм OWNER, RENAME, SET SCHEMA и VALIDATE CONSTRAINT, которые являются расширениями QHB. Указание NOT VALID формы ADD CONSTRAINT также является расширением QHB.

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

CREATE DOMAIN, DROP DOMAIN


ALTER EVENT TRIGGER

ALTER EVENT TRIGGER - изменить определение событийного триггера

Синтаксис

ALTER EVENT TRIGGER имя DISABLE
ALTER EVENT TRIGGER имя ENABLE [ REPLICA | ALWAYS ]
ALTER EVENT TRIGGER имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER EVENT TRIGGER имя RENAME TO новое_имя

Описание

ALTER EVENT TRIGGER изменяет свойства существующего событийного триггера.

Чтобы изменить событийный триггер, текущий пользователь должен быть суперпользователем.

Параметры

имя

Имя существующего триггера, который нужно изменить.

новый_владелец

Имя пользователя, который станет новым владельцем событийного триггера.

новое_имя

Новое имя событийного триггера.

DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER

Эти формы настраивают запуск событийного триггера. Отключенный триггер сохраняется в системе, но не выполняется, когда происходит событие, которое его запускает. Смотрите также session_replication_role.

Совместимость

Команда ALTER EVENT TRIGGER отсутствует в стандарте SQL.

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

CREATE EVENT TRIGGER, DROP EVENT TRIGGER


ALTER EXTENSION

ALTER EXTENSION - изменить определение расширения

Синтаксис

ALTER EXTENSION имя UPDATE [ TO новая_версия ]
ALTER EXTENSION имя SET SCHEMA новая_схема
ALTER EXTENSION имя ADD элемент_объект
ALTER EXTENSION имя DROP элемент_объект

Где элемент_объект может быть:

  ACCESS METHOD имя_объекта |
  AGGREGATE имя_агрегатной_функции ( сигнатура_агрегатной_функции ) |
  CAST (исходный_тип AS целевой_тип) |
  COLLATION имя_объекта |
  CONVERSION имя_объекта |
  DOMAIN имя_объекта |
  EVENT TRIGGER имя_объекта |
  FOREIGN DATA WRAPPER имя_объекта |
  FOREIGN TABLE имя_объекта |
  FUNCTION имя_функции [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ] |
  MATERIALIZED VIEW имя_объекта |
  OPERATOR имя_оператора (тип_слева, тип_справа) |
  OPERATOR CLASS имя_объекта USING индексный_метод |
  OPERATOR FAMILY имя_объекта USING индексный_метод |
  [ PROCEDURAL ] LANGUAGE имя_объекта |
  PROCEDURE имя_процедуры [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ] |
  ROUTINE имя_подпрограммы [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ] |
  SCHEMA имя_объекта |
  SEQUENCE имя_объекта |
  SERVER имя_объекта |
  TABLE имя_объекта |
  TEXT SEARCH CONFIGURATION имя_объекта |
  TEXT SEARCH DICTIONARY имя_объекта |
  TEXT SEARCH PARSER имя_объекта |
  TEXT SEARCH TEMPLATE имя_объекта |
  TRANSFORM FOR имя_типа LANGUAGE имя_языка |
  TYPE имя_объекта |
  VIEW имя_объекта

Где сигнатура_агрегатной_функции:

* |
[ режим_аргумента ] [ имя_аргумента ] тип_аргумента [ , ... ] |
[ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [ , ... ] ] ORDER BY [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [ , ... ]

Описание

ALTER EXTENSION изменяет определение установленного расширения. Эта команда имеет несколько форм:

UPDATE

Эта форма обновляет расширение до более новой версии. Расширение должно предоставить подходящий скрипт или набор скриптов обновления, который сможет изменить текущую установленную версию в требуемую .

SET SCHEMA

Эта форма перемещает объекты расширения в другую схему. Для успешного выполнения этой команды расширение должно быть перемещаемым.

ADD элемент_объект

Эта форма добавляет существующий объект к расширению. Указание чаще применяется в скриптах обновления расширений. Объект впоследствии будет рассматриваться как часть расширения; в частности, он может быть удален только вместе с расширением.

DROP элемент_объект

Эта форма удаляет объект из расширения. Указание чаще применяется в скриптах обновления расширений. Объект при этом не удаляется, а только отделяется от расширения.

Дополнительную информацию об этих операциях смотрите в разделе Упаковка связанных объектов в расширение.

Выполнить команду ALTER EXTENSION может только владелец соответствующего расширения. Для форм ADD/DROP требуется также быть владельцем добавляемого/удаляемого объекта.

Параметры

Имя

Имя установленного расширения.

новая_версия

Запрашиваемая новая версия расширения. Версию можно указать в виде идентификатора или строки. Если версия не указана, ALTER EXTENSION UPDATE попытается обновить расширение до версии по умолчанию в управляющем файле расширения.

новая_схема

Новая схема расширения.

имя_объекта
имя_агрегатной_функции
имя_функции
имя_оператора
имя_процедуры
имя_подпрограммы

Имя объекта, который будет добавлен или удален из расширения. Имена агрегатных функций, доменов, сторонних таблиц, функций, операторов, классов операторов, семейств операторов, процедур, подпрограмм, последовательностей, объектов текстового поиска, типов и представлений могут дополняться именем схемы.

исходный_тип

Имя исходного типа данных для приведения.

целевой_тип

Имя целевого типа данных для приведения.

режим_аргумента

Режим аргумента функции, процедуры или агрегатной функции: IN, OUT, INOUT или VARIADIC. Если этот параметр опущен, значение по умолчанию равно IN. Обратите внимание, что ALTER EXTENSION на самом деле не обращает никакого внимания OUT аргументы, так как только входные аргументы необходимы для определения идентичности функции. Так что достаточно перечислить IN, INOUT и VARIADIC. аргументы.

имя_аргумента

Имя аргумента функции, процедуры или агрегатной функции. Обратите внимание, что ALTER EXTENSION фактически не обращает никакого внимания на имена аргументов, поскольку для определения идентичности функции необходимы только типы данных аргументов.

тип_аргумента

Тип аргумента данных функции, процедуры или агрегатной функции.

тип_слева
тип_справа

Тип данных аргументов оператора, которое может быть дополнено схемой. В случае отсутствия аргумента оператора укажите вместо типа NONE.

PROCEDURAL

Не несёт смысловой нагрузки.

имя_типа

Имя типа данных, для которого делается преобразование.

имя_языка

Название языка, для которого делается преобразование.

Примеры

Обновление расширения hstore до версии 2.0:

ALTER EXTENSION hstore UPDATE TO '2.0';

Смена схемы расширения hstore на utils:

ALTER EXTENSION hstore SET SCHEMA utils;

Добавление существующей функции в расширение hstore:

ALTER EXTENSION hstore ADD FUNCTION populate_record(anyelement, hstore);

Совместимость

Команда ALTER EXTENSION является расширением QHB.

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

CREATE EXTENSION, DROP EXTENSION


ALTER FOREIGN DATA WRAPPER

ALTER FOREIGN DATA WRAPPER - изменить определение обертки сторонних данных

Синтаксис

ALTER FOREIGN DATA WRAPPER имя
    [ HANDLER функция_обработчик | NO HANDLER ]
    [ VALIDATOR функция_проверки | NO VALIDATOR ]
    [ OPTIONS ( [ ADD | SET | DROP ] параметр ['значение'] [, ... ]) ]
ALTER FOREIGN DATA WRAPPER имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER FOREIGN DATA WRAPPER имя RENAME TO новое_имя

Описание

ALTER FOREIGN DATA WRAPPER изменяет определение обертки сторонних данных. Первая форма команды изменяет вспомогательные функции или общие параметры обертки сторонних данных (требуется по крайней мере одно предложение). Вторая форма изменяет владельца обертки сторонних данных.

Только суперпользователи могут настраивать обертки сторонних данных. И только суперпользователи могут быть владельцами оберток сторонних данных.

Параметры

Имя

Имя существующей обертки сторонних данных.

HANDLER функция_обработчик

Задает новую функцию обработчика для обертки сторонних данных.

NO HANDLER

Используется, чтобы указать что обертка сторонних данных больше не имеет функцию обработчика. Обратите внимание, что сторонние таблицы, использующие обертки сторонних данных без функции обработчика, не будут доступны при обращении.

VALIDATOR функция_проверки

Задает новую функцию проверки для обертки сторонних данных. Обратите внимание, что возможна ситуация, когда предыдущие параметры обертки сторонних данных, зависимых серверов, сопоставлений пользователей или сторонних таблиц, окажутся недопустимыми для новой функции проверки. QHB не проверяет это. Пользователь самостоятельно должен убедиться, что эти параметры являются правильными, прежде чем использовать измененную обертки сторонних данных. Однако все параметры, изменяемые в данной команде ALTER FOREIGN DATA WRAPPER, будут проверены с помощью новой функции проверки.

NO VALIDATOR Указывает, что обертка сторонних данных больше не имеет функцию проверки.

OPTIONS ( [ ADD | SET | DROP ] параметр ['значение'] [, ... ] )

Эта форма настраивает параметры обертки сторонних данных. ADD, SET и DROP указывают, какое действие будет выполнено (добавление, установка и удаление, соответственно). ПО умолчанию, подразумевается ADD. Имена параметров должны быть уникальными, они вместе со значениями проверяются функцией проверки, если она установлена.

новый_владелец

Имя пользователя, который станет новым владельцем обертки сторонних данных.

новое_имя

Новое имя обертки сторонних данных.

Примеры

Изменение параметров обертки сторонних данных dbi: добавление параметра foo, удаление bar:

ALTER FOREIGN DATA WRAPPER dbi OPTIONS (ADD foo '1', DROP 'bar');

Установление для обертки сторонних данных dbi новой функции проверки bob.myvalidator:

ALTER FOREIGN DATA WRAPPER dbi VALIDATOR bob.myvalidator;

Совместимость

ALTER FOREIGN DATA WRAPPER соответствует стандарту ISO/IEC 9075-9 (SQL/MED), за исключением указаний HANDLER, VALIDATOR, OWNER TO и RENAME, являющихся расширениями.

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

CREATE FOREIGN DATA WRAPPER, DROP FOREIGN DATA WRAPPER


ALTER FOREIGN TABLE

ALTER FOREIGN TABLE - изменить определение сторонней таблицы

Синтаксис

ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ] имя [ * ]
    действие [, ... ]
ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ] имя [ * ]
    RENAME [ COLUMN ] имя_столбца TO новое_имя_столбца
ALTER FOREIGN TABLE [ IF EXISTS ] имя
    RENAME TO новое_имя
ALTER FOREIGN TABLE [ IF EXISTS ] имя
    SET SCHEMA новая_схема

Где действие может быть следующим:

    ADD [ COLUMN ] имя_столбца тип_данных [ COLLATE правило_сортировки ] [ ограничение_столбца [ ... ] ]
    DROP [ COLUMN ] [ IF EXISTS ] имя_столбца [ RESTRICT | CASCADE ]
    ALTER [ COLUMN ] имя_столбца [ SET DATA ] TYPE тип_данных [ COLLATE правило_сортировки ]
    ALTER [ COLUMN ] имя_столбца SET DEFAULT выражение
    ALTER [ COLUMN ] имя_столбца DROP DEFAULT
    ALTER [ COLUMN ] имя_столбца { SET | DROP } NOT NULL
    ALTER [ COLUMN ] имя_столбца SET STATISTICS integer
    ALTER [ COLUMN ] имя_столбца SET ( атрибут = значение [, ... ] )
    ALTER [ COLUMN ] имя_столбца RESET ( атрибут [, ... ] )
    ALTER [ COLUMN ] имя_столбца SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
    ALTER [ COLUMN ] имя_столбца OPTIONS ( [ ADD | SET | DROP ] параметр ['значение'] [, ... ])
    ADD ограничение_таблицы [ NOT VALID ]
    VALIDATE CONSTRAINT имя_ограничения
    DROP CONSTRAINT [ IF EXISTS ]  имя_ограничения [ RESTRICT | CASCADE ]
    DISABLE TRIGGER [ имя_триггера | ALL | USER ]
    ENABLE TRIGGER [ имя_триггера | ALL | USER ]
    ENABLE REPLICA TRIGGER имя_триггера
    ENABLE ALWAYS TRIGGER имя_триггера
    SET WITHOUT OIDS
    INHERIT таблица_родитель
    NO INHERIT таблица_родитель
    OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
    OPTIONS ( [ ADD | SET | DROP ] параметр ['значение'] [, ... ])

Описание

ALTER FOREIGN TABLE изменяет определение существующей сторонней таблицы. Существует несколько форм этой команды:

ADD COLUMN

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

DROP COLUMN [ IF EXISTS ]

Эта форма удаляет столбец из сторонней таблицы. Нужно написать указание CASCADE если что-то вне таблицы зависит от столбца; например, представление. Если указано IF EXISTS и столбец не существует, ошибка не происходит, вместо этого выдаётся замечание.

SET DATA TYPE

Эта форма изменяет тип столбца сторонней таблицы. Опять же, это не оказывает никакого влияния на базовое хранилище: это действие просто изменяет тип, который по мнению QHB, этот столбец имеет.

SET/DROP DEFAULT

Эти формы устанавливают или удаляют значение по умолчанию для столбца. Значения по умолчанию применяются только в последующих командах INSERT или UPDATE; они не вызывают изменения уже существующих строк в таблице.

SET/DROP NOT NULL

Устанавливает, будет ли столбец принимать значения NULL или нет.

SET STATISTICS

Эта форма задает цель сбора статистики для каждого столбца для последующих операций ANALYZE. Смотрите дополнительную информацию в описании подобной формы команды ALTER TABLE.

SET ( атрибут = значение [, ... ] )
RESET ( атрибут [, ... ] )

Эта форма устанавливает или сбрасывает значения для атрибута. Смотрите дополнительную информацию в описании подобной формы команды ALTER TABLE.

SET STORAGE

Эта форма задает режим хранения для столбца. Смотрите дополнительную информацию в описании подобной формы команды ALTER TABLE. Обратите внимание, что режим хранения не имеет никакого значения, если обертка сторонних данных таблицы будет игнорировать его.

ADD ограничение_таблицы [ NOT VALID ]

Эта форма добавляет новое ограничение в стороннюю таблицу, используя тот же синтаксис, что и CREATE FOREIGN TABLE . В настоящее время поддерживаются только ограничения CHECK.

В отличие от случая, когда ограничение добавляется в обычную таблицу, ограничение сторонней таблицы фактически никак не проверяется; скорее, это действие просто объявляет, что некоторое новое условие должно выполняться для всех строк в сторонней таблице. (Подробнее это рассматривается в описании CREATE FOREIGN TABLE) Если ограничение помечено как NOT VALID, то предполагается что оно не поддерживается, а записывается для возможного использования в будущем.

VALIDATE CONSTRAINT

Эта форма помечает ограничение, которое ранее было помечено NOT VALID, как проверенное. Никаких действий для проверки ограничения не предпринимается, но будущие запросы будут предполагать, что оно выполняется.

DROP CONSTRAINT [ IF EXISTS ]

Эта форма удаляет указанное ограничение для сторонней таблицы. Если указано IF EXISTS, и ограничение не существует, это не считается ошибкой. В этом случае выдаётся только замечание.

DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER

Эти формы настраивают срабатывание триггеров, принадлежащих сторонней таблице. Смотрите дополнительную информацию по аналогичной форме ALTER TABLE.

SET WITHOUT OIDS

Синтаксис обратной совместимости для удаления системного столбца oid. Так как добавить системные столбцы oid теперь невозможно, это указание фактически не действует.

INHERIT таблица_родитель

Эта форма добавляет целевую стороннюю таблицу в качестве нового дочернего элемента указанной родительской таблицы. Смотрите дополнительную информацию в аналогичной форме ALTER TABLE.

NO INHERIT таблица_родитель

Эта форма удаляет целевую стороннюю таблицу из списка дочерних элементов указанной родительской таблицы.

OWNER

Эта форма изменяет владельца сторонней таблицы на указанного пользователя.

OPTIONS ( [ ADD | SET | DROP ] параметр ['значение'] [, ... ] )

Эта форма изменяет параметры для сторонней таблицы или одного из ее столбцов. ADD, SET и DROP указывают на действие, которое необходимо выполнить. По умолчанию предполагается ADD. Повторяющиеся имена параметров не допускаются (хотя это нормально для параметра таблицы и параметра столбца, иметь одно и то же имя). Имена и значения параметров также проверяются с помощью библиотеки обертки сторонних данных.

RENAME

Форма RENAME изменяет имя сторонней таблицы или имя ее столбца.

SET SCHEMA

Эта форма перемещает стороннюю таблицу в другую схему.

Все действия, кроме RENAME и SET SCHEMA могут быть объединены в один список и выполнены одновременно. Например, можно добавить несколько столбцов и/или изменить тип нескольких столбцов в одной команде.

Если команда написана в виде ALTER FOREIGN TABLE IF EXISTS ... и сторонняя таблица не существует, это не считается ошибкой. В этом случае выдаётся только замечание..

Выполнить команду ALTER FOREIGN TABLE может только владелец соответствующей сторонней таблицы. Чтобы изменить схему сторонней таблицы, необходимо иметь право CREATE в новой схеме. Для изменения владельца, текущий пользователь должен быть непосредственным или опосредованным членом новой роли, и эта роль должна иметь право CREATE в схеме сторонней таблицы. (Эти ограничения направлены на то, чтобы при смене владельца не происходило ничего, что нельзя было бы сделать, имея право удалить и снова создать сторонней таблицы. Однако суперпользователь может изменить владельца любой сторонней таблицы). Чтобы добавить столбец или изменить тип столбца, необходимо также иметь право USAGE для его типа данных.

Параметры

Имя

Имя, которое может быть дополнено схемой, существующей сторонней таблицы, которую нужно изменить. Если указывается ONLY перед именем таблицы, изменяется только эта таблица. Если ONLY не указано, таблица и все ее потомки таблицы (если таковые имеются) будут изменены. После имени таблицы можно также добавить необязательное указание *, чтобы явно обозначить, что изменению подлежат все дочерние таблицы.

имя_столбца

Имя нового или существующего столбца.

новое_имя_столбца

Новое имя существующего столбца.

новое_имя

Новое имя таблицы.

тип_данных

Тип данных нового столбца или новый тип данных для существующего столбца.

ограничение_таблицы

Новое ограничение уровня таблицы для сторонней таблицы.

имя_ограничения

Имя существующего ограничения. которое нужно удалить.

CASCADE

Автоматически удалять объекты, зависящие от удаляемого столбца или ограничения (например, представления, ссылающиеся на столбец), и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей).

RESTRICT

Запретить удаление столбца или ограничения, если есть какие-либо зависимые объекты. Это поведение по умолчанию.

имя_триггера

Имя триггера, который нужно отключить или включить.

ALL

Отключает или включает все триггеры, принадлежащие сторонней таблице. (Если какие-либо из триггеров являются внутрисистемными, требуются права суперпользователя. Сама система не добавляет такие триггеры в сторонние таблицы, но дополнительный код может сделать это).

USER

Отключает или включает все триггеры, принадлежащие сторонней таблице, кроме сгенерированных внутрисистемных

таблица_родитель

Родительская таблица, с которой будет установлена или разорвана связь у этой сторонней таблицы.

новый_владелец

Имя пользователя, который станет новым владельцем таблицы.

новая_схема

Имя схемы, в которую будет перемещена таблица.

Примечания

Ключевое слово COLUMN не несет смысловой нагрузки и его можно опустить.

Согласованность со сторонним сервером не проверяется при добавлении или удалении столбца с помощью функции ADD COLUMN/DROP COLUMN, или при добавлении ограничений NOT NULL или CHECK, или изменении типа данных SET DATA TYPE. Пользователь несет ответственность за то, чтобы определение таблицы соответствовало удаленной стороне.

За более полным описанием параметров обратитесь к CREATE FOREIGN TABLE.

Примеры

Установление ограничения NOT NULL для столбца:

ALTER FOREIGN TABLE distributors ALTER COLUMN street SET NOT NULL;

Изменение параметров сторонней таблицы:

ALTER FOREIGN TABLE myschema.distributors
	OPTIONS (ADD opt1 'value', SET opt2 'value2', DROP opt3 'value3');

Совместимость

Формы ADD, DROP и SET DATA TYPE соответствуют стандарту SQL. Другие формы являются расширениями QHB. Кроме этого, возможность указать в одной команде ALTER FOREIGN TABLE несколько операций также является расширением.

ALTER FOREIGN TABLE DROP COLUMN позволяет удалить единственный столбец сторонней таблицы и оставить таблицу без столбцов. Это является расширением стандарта SQL, который не допускает существование сторонних таблиц без столбцов.

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

CREATE FOREIGN TABLE, DROP FOREIGN TABLE


ALTER FUNCTION

ALTER FUNCTION - изменить определение функции

Синтаксис

ALTER FUNCTION имя [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ]
    действие [ ... ] [ RESTRICT ]
ALTER FUNCTION имя [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ]
    RENAME TO новое_имя
ALTER FUNCTION имя [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ]
    OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER FUNCTION имя [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ]
    SET SCHEMA новая_схема
ALTER FUNCTION имя [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ]
    DEPENDS ON EXTENSION имя_расширения

Где действие может быть следующим:

    CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
    IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF
    [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
    PARALLEL { UNSAFE | RESTRICTED | SAFE }
    COST стоимость_выполнения
    ROWS строк_в_результате
    SUPPORT вспомогательная_функция
    SET параметр_конфигурации { TO | = } { значение | DEFAULT }
    SET параметр_конфигурации FROM CURRENT
    RESET параметр_конфигурации
    RESET ALL

Описание

ALTER FUNCTION изменяет определение функции.

Выполнить команду ALTER FUNCTION может только владелец соответствующей функции. Чтобы изменить схему функции, необходимо иметь право CREATE в новой схеме. Для изменения владельца, текущий пользователь должен быть непосредственным или опосредованным членом новой роли, и эта роль должна иметь право CREATE в схеме функции. (Эти ограничения направлены на то, чтобы при смене владельца не происходило ничего, что нельзя было бы сделать, имея право удалить и снова создать функцию. Однако суперпользователь может изменить владельца любой функции).

Параметры

Имя

Имя, которое может быть дополнено схемой, существующей функции. Если список аргументов не указан, имя должно быть уникальным в своей схеме.

режим_аргумента

Режим аргумента: IN, OUT, INOUT или VARIADIC. По умолчанию равно IN. Обратите внимание, что ALTER FUNCTION на самом деле не обращает никакого внимания OUT аргументы, так как только входные аргументы необходимы для определения идентичности функции. Так что достаточно перечислить IN, INOUT и VARIADIC аргументы.

имя_аргумента

Название аргумента. Обратите внимание, что ALTER FUNCTION фактически не обращает никакого внимания на имена аргументов, поскольку для определения идентичности функции необходимы только типы данных аргументов.

тип_аргумента

Тип(ы) данных аргументов функции (возможно, дополненный(ые) схемой), если таковые имеются.

новое_имя

Новое имя функции.

новый_владелец

Новый владелец функции. Обратите внимание, что если функция помечена как SECURITY DEFINER, в дальнейшем она будет выполняться от имени нового владельца.

новая_схема

Новая схема функции.

имя_расширения

Имя расширения, от которого должна зависеть функция.

CALLED ON NULL INPUT
RETURNS NULL ON NULL INPUT
STRICT

CALLED ON NULL INPUT изменяет функцию таким образом, чтобы она вызывалась, когда некоторые или все ее аргументы равны NULL. RETURNS NULL ON NULL INPUT или STRICT изменяет функцию таким образом, чтобы она не вызывалась, если какой-либо из ее аргументов равен NULL; а вместо вызова автоматически выдавался результат NULL. Дополнительную информацию смотрите в разделе CREATE FUNCTION.

IMMUTABLE
STABLE
VOLATILE

Устанавливает заданный вариант изменчивости функции. Дополнительную информацию смотрите в разделе CREATE FUNCTION.

[EXTERNAL] SECURITY INVOKER
[EXTERNAL] SECURITY DEFINER

Устанавливает, является ли функция определяющей контекст безопасности. Ключевое слово EXTERNAL игнорируется для соответствия стандарту SQL. Дополнительную информацию об этой возможности смотрите в разделе CREATE FUNCTION.

PARALLEL

Устанавливает, будет ли функция считаться безопасной для распараллеливания. Дополнительную информацию смотрите в разделе CREATE FUNCTION.

LEAKPROOF

Устанавливает, является ли функция герметичной. Дополнительную информацию об этой возможности смотрите в разделе CREATE FUNCTION.

COST стоимость_выполнения

Изменяет ориентировочную стоимость выполнения функции. Дополнительную информацию смотрите в разделе CREATE FUNCTION.

ROWS строк_в_результате

Изменяет ориентировочное число строк в результате функции, возвращающей множество. Дополнительную информацию смотрите в разделе CREATE FUNCTION.

SUPPORT вспомогательная_функция

Устанавливает или меняет вспомогательную функцию для планировщика, которая будет использоваться с этой функцией. Дополнительную информацию смотрите в разделе Информация по оптимизации функций. Чтобы использовать эту опцию текущий пользователь должен быть суперпользователем.

Имя новой вспомогательной функции является обязательным, поэтому данное указание не позволяет полностью отказаться от использования вспомогательной функции. Используйте CREATE OR REPLACE FUNCTION, если это необходимо.

параметр_конфигурации
значение

Добавляет или изменяет установку параметра конфигурации, выполняемую при вызове функции. Если задано значение DEFAULT или равнозначное указание RESET, локальное переопределение для функции удаляется и функция выполняется со значением, установленным в окружении. Для удаления всех установок параметров функции укажите RESET ALL. SET FROM CURRENT устанавливает для последующих вызовов функции значение параметра, действующее в момент выполнения ALTER FUNCTION.

Дополнительную информацию о разрешенных именах и значениях параметров смотрите в разделе SET и главе Конфигурация сервера.

RESTRICT

Игнорируется для соответствия стандарту SQL.

Примеры

Переименование функции sqrt для типа integer в square_root:

ALTER FUNCTION sqrt(integer) RENAME TO square_root;

Смена владельца функции sqrt для типа integer на joe:

ALTER FUNCTION sqrt(integer) OWNER TO joe;

Смена схемы функции sqrt для типа integer на maths:

ALTER FUNCTION sqrt(integer) SET SCHEMA maths;

Обозначение функции sqrt для типа integer как зависимой от расширения mathlib:

ALTER FUNCTION sqrt(integer) DEPENDS ON EXTENSION mathlib;

Изменение пути поиска, который устанавливается автоматически для функции:

ALTER FUNCTION check_password(text) SET search_path = admin, pg_temp;

Отмена автоматического определения search_path для функции:

ALTER FUNCTION check_password(text) RESET search_path;

Теперь функция будет выполняться с тем путём, который задан в момент вызова.

Совместимость

Эта команда частично совместима с командой ALTER FUNCTION в стандарте SQL. Стандарт позволяет менять больше свойств функции, но не предоставляет возможности переименовывать функции, переключать контекст безопасности, связывать с функциями значения параметров конфигурации, а также менять владельца, схему и тип изменчивости функции. Стандарт SQL также требует обязательного наличия слова RESTRICT, тогда как в QHB оно не обязательное.

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

CREATE FUNCTION, DROP FUNCTION, ALTER PROCEDURE, ALTER ROUTINE


ALTER GROUP

ALTER GROUP - изменить имя роли или членство

Синтаксис

ALTER GROUP указание_роли ADD USER имя_пользователя [, ... ]
ALTER GROUP указание_роли DROP USER имя_пользователя [, ... ]

Где указание_роли может быть:

    имя_роли
  | CURRENT_USER
  | SESSION_USER

ALTER GROUP имя_группы RENAME TO новое_имя

Описание

ALTER GROUP изменяет атрибуты группы пользователей. Это устаревшая команда, хотя и все еще поддерживаемая для обратной совместимости, потому что группы (и пользователи тоже) были заменены более общей концепцией ролей.

Первые две формы команды добавляют пользователей в группу или удаляют их из группы. (Любая роль может фигурировать либо как "пользователь”, либо как "группа" в данном случае) Эти формы фактически эквивалентны командам разрешающим/запрещающим членство в роли «группа»; поэтому вместо них рекомендуется использовать GRANT и REVOKE/

Третья форма команды изменяет названия группы. Она в точности равнозначна команде ALTER ROLE, выполняющей переименование роли.

Параметры

имя_группы

Имя группы (роли), которую нужно изменить.

имя_пользователя

Пользователи (роли), которые должны быть добавлены или удалены из группы. Пользователи должны уже существовать; ALTER GROUP не создает и не удаляет пользователей.

новое_имя

Новое название группы.

Примеры

Добавление пользователей в группу:

ALTER GROUP staff ADD USER karl, john;

Удаление пользователей из группы:

ALTER GROUP workers DROP USER beth;

Совместимость

Команда ALTER GROUP отсутствует в стандарте SQL.

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

GRANT, REVOKE, ALTER ROLE


ALTER INDEX

ALTER INDEX - изменить определение индекса

Синтаксис

ALTER INDEX [ IF EXISTS ] имя RENAME TO новое_имя
ALTER INDEX [ IF EXISTS ] имя SET TABLESPACE табл_пространство
ALTER INDEX имя ATTACH PARTITION имя_индекса
ALTER INDEX имя DEPENDS ON EXTENSION имя_расширения
ALTER INDEX [ IF EXISTS ] имя SET ( параметр_хранения = значение [, ... ] )
ALTER INDEX [ IF EXISTS ] имя RESET ( параметр_хранения [, ... ] )
ALTER INDEX [ IF EXISTS ] имя ALTER [ COLUMN ] номер_столбца
    SET STATISTICS целое
ALTER INDEX ALL IN TABLESPACE имя [ OWNED BY имя_роли [, ... ] ]
    SET TABLESPACE новое_табл_пространство [ NOWAIT ]

Описание

ALTER INDEX изменяет определение существующего индекса. Существует несколько форм команды, описанных ниже. Обратите внимание, что требуемый уровень блокировки может отличаться для каждой формы. Если явно не указано, то по умолчанию запрашивается блокировка ACCESS EXCLUSIVE. Если в списке указано несколько подкоманд, то запрашивается самая строгой блокировка из требуемых подкомандами.

RENAME

Форма RENAME изменяет имя индекса. Если индекс связан с ограничением таблицы (UNIQUE, PRIMARY KEY или EXCLUDE), ограничение также переименовывается. Это не оказывает никакого влияния на сохраненные данные.

Переименование индекса требует блокировки SHARE UPDATE EXCLUSIVE.

SET TABLESPACE

Эта форма изменяет табличное пространство индекса на указанное и перемещает файлы данных, связанные с индексом, в новое табличное пространство. Чтобы изменять табличное пространство индекса, текущий пользователь должен быть владельцем индекса и иметь право CREATE в новом табличном пространстве. Все индексы в текущей базе данных в табличном пространстве можно переместить с помощью формы ALL IN TABLESPACE. При этом индексы блокируются для перемещения и затем перемещается каждый индекс. Эта форма также поддерживает OWNED BY:, с которым будут перемещены только индексы, принадлежащие заданным ролям. Если указана опция NOWAIT, то команда завершится ошибкой, если она не сможет сразу получить все необходимые блокировки. Обратите внимание, что системные каталоги не будут перемещены этой командой, при необходимости используйте вызов ALTER DATABASE или явный вызов ALTER INDEX. Смотрите также CREATE TABLESPACE.

ATTACH PARTITION

Эта форма присоединяет указанный индекс к изменяемому. Указанный индекс должен находиться в партиции таблицы, содержащей изменяемый индекс, и иметь эквивалентное определение. Присоединенный индекс не может быть удален сам по себе, и будет автоматически удален, при удалении родительского.

DEPENDS ON EXTENSION

Эта форма помечает индекс как зависящий от расширения, таким образом, если расширение удаляется, индекс также будет автоматически удален.

SET ( параметр_хранения = значение [, ... ] )

Эта форма изменяет один или несколько специфичных для индекса параметров хранения. Дополнительные сведения о доступных параметрах смотрите в CREATE INDEX. Обратите внимание, что содержимое индекса не будет изменено немедленно; для получения желаемого эффекта в зависимости от параметров может потребоваться перестроить индекс командой REINDEX.

RESET ( параметр_хранения [, ... ] )

Эта форма сбрасывает один или несколько специфичных для индекса параметров хранения к значениям по умолчанию. Как и в случае с SET, для полного обновления индекса может потребоваться выполнить REINDEX.

ALTER [ COLUMN ] номер_столбца SET STATISTICS целое

Эта форма задаёт ориентир сбора статистики по столбцу для последующих операций ANALYZE, хотя её можно использовать только для индексируемых столбцов, определенных как выражение. Поскольку выражения не имеют уникального имени мы ссылаемся на них, используя порядковый номер столбца в индексе. Диапазон допустимых значений ориентира: 0..10000; при -1 применяется системное значение по умолчанию (default_statistics_target). Дополнительную информацию об использовании статистики планировщиком запросов QHB см. в разделе Статистика, используемая планировщиком.

Параметры

IF EXISTS

Не считать ошибкой, если индекс не существует. В этом случае будет выдано замечание.

номер_столбца

Число, указывающее на номер столбца в индексе по порядку (слева направо).

Имя

Имя, которое может быть дополнено схемой, существующего индекса, который необходимо изменить.

новое_имя

Новое имя индекса.

табл_пространство

Табличное пространство, в которое будет перемещен индекс.

имя_расширения

Имя расширения, от которого будет зависеть индекс.

параметр_хранения

Имя специфичного для индекса параметра хранения.

значение

Новое значение специфичного для индекса параметра хранения. Это может быть число или строка, в зависимости от параметра.

Примечания

Эти операции также можно выполнить с помощью команды ALTER TABLE. ALTER INDEX фактически является просто синонимом форм команды ALTER TABLE, которые применяются к индексам.

Ранее существовала форма ALTER INDEX OWNER, но теперь она игнорируется (с предупреждением). Владелец индекса должен быть и владельцем таблицы. Изменение владельца таблицы автоматически изменяет владельца индекса.

Изменение любой части индекса системного каталога не допускается.

Примеры

Переименование существующего индекса:

ALTER INDEX distributors RENAME TO suppliers;

Перемещение индекса в другое табличное пространство:

ALTER INDEX distributors SET TABLESPACE fasttablespace;

Изменение фактора заполнения индекса (предполагается, что это поддерживает метод индекса):

ALTER INDEX distributors SET (fillfactor = 75);
REINDEX INDEX distributors;

Устанавливает ориентир сбора статистики для индекса по выражению:

CREATE INDEX coord_idx ON measured (x, y, (z + t));
ALTER INDEX coord_idx ALTER COLUMN 3 SET STATISTICS 1000;

Совместимость

Команда ALTER INDEX является расширением QHB.

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

CREATE INDEX, REINDEX


ALTER LANGUAGE

ALTER LANGUAGE - изменить определение процедурного языка

Синтаксис

ALTER [ PROCEDURAL ] LANGUAGE имя RENAME TO новое_имя
ALTER [ PROCEDURAL ] LANGUAGE имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }

Описание

ALTER LANGUAGE изменяет определение процедурного языка. Единственная функция этой команды переименовать язык или назначить нового владельца. Выполнить ALTER LANGUAGE может только суперпользователь или владелец языка.

Параметры

Имя

Название языка

новое_имя

Новое название языка

новый_владелец

Новый владелец языка

Совместимость

Команда ALTER LANGUAGE отсутствует в стандарте SQL.

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

CREATE LANGUAGE, DROP LANGUAGE


ALTER LARGE OBJECT

ALTER LARGE OBJECT - изменить определение большого объекта

Синтаксис

ALTER LARGE OBJECT oid_большого_объекта OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }

Описание

ALTER LARGE OBJECT изменяет определение большого объекта.

Выполнить команду ALTER LARGE OBJECT может только владелец соответствующего большого объекта. Для изменения владельца, текущий пользователь должен быть непосредственным или опосредованным членом новой роли. (Однако суперпользователь может изменить владельца любого большого объекта). В настоящее время единственное возможное изменение заключается в назначении нового владельца, так что всегда действуют оба ограничения.

Параметры

oid_большого_объекта

OID большого объекта, подлежащего изменению

новый_владелец

Новый владелец большого объекта

Совместимость

Команда ALTER LARGE OBJECT отсутствует в стандарте SQL.

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

Большие объекты


ALTER MATERIALIZED VIEW

ALTER MATERIALIZED VIEW - изменить определение материализованного представления

Синтаксис

ALTER MATERIALIZED VIEW [ IF EXISTS ] имя
    действие [, ... ]
ALTER MATERIALIZED VIEW имя
    DEPENDS ON EXTENSION имя_расширения
ALTER MATERIALIZED VIEW [ IF EXISTS ] имя
    RENAME [ COLUMN ] имя_столбца TO новое_имя_столбца
ALTER MATERIALIZED VIEW [ IF EXISTS ] имя
    RENAME TO новое_имя
ALTER MATERIALIZED VIEW [ IF EXISTS ] имя
    SET SCHEMA новая_схема
ALTER MATERIALIZED VIEW ALL IN TABLESPACE имя [ OWNED BY имя_роли [, ... ] ]
    SET TABLESPACE новое_табл_пространство [ NOWAIT ]

Где действие может быть следующим:

    ALTER [ COLUMN ] имя_столбца SET STATISTICS integer
    ALTER [ COLUMN ] имя_столбца SET ( атрибут = значение [, ... ] )
    ALTER [ COLUMN ] имя_столбца RESET ( атрибут [, ... ] )
    ALTER [ COLUMN ] имя_столбца SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
    CLUSTER ON имя_индекса
    SET WITHOUT CLUSTER
    SET ( параметр_хранения = значение [, ... ] )
    RESET ( параметр_хранения [, ... ] )
    OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }

Описание

ALTER MATERIALIZED VIEW изменяет различные расширенные свойства существующего материализованного представления.

Выполнить команду ALTER MATERIALIZED VIEW может только владелец соответствующего материализованного представления. Чтобы изменить схему материализованного представления, необходимо иметь право CREATE в новой схеме. Для изменения владельца, текущий пользователь должен быть непосредственным или опосредованным членом новой роли, и эта роль должна иметь право CREATE в схеме материализованного представления. (Эти ограничения направлены на то, чтобы при смене владельца не происходило ничего, что нельзя было бы сделать, имея право удалить и снова создать материализованное представление. Однако суперпользователь может изменить владельца любого материализованного представления).

Форма DEPENDS ON EXTENSION помечает материализованное представление как зависящее от расширения, так что материализованное представление будет автоматически удалено, если расширение удалено будет.

Формы и указания доступные для команды ALTER MATERIALIZED VIEW, являются подмножеством тех, которые доступны для команды ALTER TABLE, и имеют то же значение, когда используются для материализованных представлений. Смотрите описание ALTER TABLE для получения дополнительной информации.

Параметры

Имя

Имя, которое может быть дополнено схемой, существующего материализованного представления.

имя_столбца

Имя нового или существующего столбца.

имя_расширения

Имя расширения, от которого будет зависеть материализованное представление.

новое_имя_столбца

Новое имя существующего столбца.

новый_владелец

Имя пользователя, который станет новым владельцем материализованного представления.

новое_имя

Новое название материализованного представления.

новая_схема

Новая схема материализованного представления.

Примеры

Переименование материализованного представления foo в bar:

ALTER MATERIALIZED VIEW foo RENAME TO bar;

Совместимость

Команда ALTER MATERIALIZED VIEW является расширением QHB.

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

CREATE MATERIALIZED VIEW, DROP MATERIALIZED VIEW, REFRESH MATERIALIZED VIEW


ALTER OPERATOR

ALTER OPERATOR - изменить определение оператора

Синтаксис

ALTER OPERATOR имя ( { тип_слева | NONE } , { тип_справа | NONE } )
    OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }

ALTER OPERATOR имя ( { тип_слева | NONE } , { тип_справа | NONE } )
    SET SCHEMA новая_схема

ALTER OPERATOR имя ( { тип_слева | NONE } , { тип_справа | NONE } )
    SET ( {  RESTRICT = { процедура_ограничения | NONE }
           | JOIN = { процедура_соединения | NONE }
         } [, ... ] )

Описание

ALTER OPERATOR изменяет определение оператора.

Выполнить команду ALTER OPERATOR может только владелец соответствующего оператора. Для изменения владельца, вы должны быть непосредственным или опосредованным членом новой роли, и эта роль должна иметь право CREATE в схеме оператора. (Эти ограничения направлены на то, чтобы при смене владельца не происходило ничего, что нельзя было бы сделать, имея право удалить и снова создать оператора. Однако суперпользователь может изменить владельца любого оператора).

Параметры

Имя

Имя, которое может быть дополнено схемой, существующего оператора.

тип_слева

Тип данных левого операнда оператора; укажите NONE если оператор не имеет левого операнда.

тип_справа

Тип данных правого операнда оператора; укажите NONE если у оператора нет правого операнда.

новый_владелец

Новый владелец оператора.

новая_схема

Новая схема оператора.

процедура_ограничения

Функция оценки селективности ограничения для этого оператора; укажите NONE, чтобы удалить существующую функцию оценки.

процедура_соединения

Функция оценки селективности соединения для этого оператора; укажите NONE, чтобы удалить существующую функцию оценки.

Примеры

Смена владельца нестандартного оператора a @@ b для типа text:

ALTER OPERATOR @@ (text, text) OWNER TO joe;

Смена функций оценки избирательности ограничения и соединения для нестандартного оператора a && b для типа int[]:

ALTER OPERATOR && (_int4, _int4) SET (RESTRICT = _int_contsel, JOIN = _int_contjoinsel);

Совместимость

Команда ALTER OPERATOR отсутствует в стандарте SQL.

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

CREATE OPERATOR, DROP OPERATOR


ALTER OPERATOR CLASS

ALTER OPERATOR CLASS - изменить определение класса операторов

Синтаксис

ALTER OPERATOR CLASS имя USING индексный_метод
    RENAME TO новое_имя

ALTER OPERATOR CLASS имя USING индексный_метод
    OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }

ALTER OPERATOR CLASS имя USING индексный_метод
    SET SCHEMA новая_схема

Описание

ALTER OPERATOR CLASS изменяет определение класса оператора.

Выполнить команду ALTER OPERATOR CLASS может только владелец соответствующего класса оператора. Для изменения владельца, текущий пользователь должен быть непосредственным или опосредованным членом новой роли, и эта роль должна иметь право CREATE в схеме класса оператора. (Эти ограничения направлены на то, чтобы при смене владельца не происходило ничего, что нельзя было бы сделать, имея право удалить и снова создать класс оператора. Однако суперпользователь может изменить владельца любого класса оператора).

Параметры

Имя

Имя, которое может быть дополнено схемой, существующего класса оператора.

индексный_метод

Имя индексного метода, для которого предназначен этот класс операторов.

новое_имя

Новое имя класса оператора.

новый_владелец

Новый владелец класса оператора.

новая_схема

Новая схема класса оператора.

Совместимость

Команда ALTER OPERATOR CLASS отсутствует в стандарте SQL.

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

CREATE OPERATOR CLASS, DROP OPERATOR CLASS, ALTER OPERATOR FAMILY


ALTER OPERATOR FAMILY

ALTER OPERATOR FAMILY - изменить определение семейства операторов

Синтаксис

ALTER OPERATOR FAMILY имя USING индексный_метод ADD
  {  OPERATOR номер_стратегии имя_оператора ( тип_операнда, тип_операнда )
              [ FOR SEARCH | FOR ORDER BY семейство_сортировки ]
   | FUNCTION номер_опорной_функции [ ( тип_операнда [ , тип_операнда ] ) ]
              имя_функции [ ( тип_аргумента [, ...] ) ]
  } [, ... ]

ALTER OPERATOR FAMILY имя USING индексный_метод DROP
  {  OPERATOR номер_стратегии ( тип_операнда [ , тип_операнда ] )
   | FUNCTION номер_опорной_функции ( тип_операнда [ , тип_операнда ] )
  } [, ... ]

ALTER OPERATOR FAMILY имя USING индексный_метод
    RENAME TO новое_имя

ALTER OPERATOR FAMILY имя USING индексный_метод
    OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }

ALTER OPERATOR FAMILY имя USING индексный_метод
    SET SCHEMA новая_схема

Описание

ALTER OPERATOR FAMILY изменяет определение семейства операторов. Вы можете добавить операторов и опорные функции в семейство операторов, удалить их из семейства операторов,
изменять имя семейства операторов или его владельца.

Когда операторы и опорные функции добавляются в семейство операторов командой ALTER OPERATOR FAMILY, они не становятся частью какого-либо конкретного класса операторов в семействе, а просто считаются «слабосвязанными» с семейством. Это указывает на то, что эти операторы и функции семантически совместимы с семейством, но не требуются для правильного функционирования какого-либо конкретного индекса. (Операторы и функции, которые так действительно требуются, должны быть объявлены как часть класса оператора, см. CREATE OPERATOR CLASS). QHB позволяет в любое время удалить из семейства слабосвязанные члены, но члены класса оператора не могут быть удалены без удаления всего класса и любых индексов, зависящих от него. Как правило, в классы операторов включаются операторы и функции одного типа данных, поскольку они необходимы для поддержки индекса для этого конкретного типа данных, в то время как операторы и функции перекрестных типов данных становятся слабосвязанные членами семейства.

Выполнить команду ALTER OPERATOR FAMILY может только суперпользователь. (Эти ограничения направлены на то, чтобы ошибочное определение семейства операторов не вызвало нарушения или даже сбой в работе сервера).

В настоящее время ALTER OPERATOR FAMILY не проверяет, включает ли определение семейства операторов все операторы и функции, требуемые для индексного метода, а также образуют ли они целостный набор. Ответственность за определение допустимого семейства операторов несет пользователь.

Дополнительную информацию см. в разделе Интерфейсные расширения для индексов.

Параметры

Имя

Имя, которое может быть дополнено схемой, существующего семейства операторов.

индексный_метод

Имя индексного метода, для которого предназначено это семейство операторов.

номер_стратегии

Номер стратегии индексного метода для оператора, связанного с семейством операторов.

имя_оператора

Имя, которое может быть дополнено схемой, оператора, связанного с семейством операторов.

тип_операнда

В предложении OPERATOR, указывается тип(ы) данных операнда оператора, или NONE, если это левый или правый унарный оператор. В отличие от сопоставимого синтаксиса в CREATE OPERATOR CLASS, типы данных операнда всегда должны быть указаны.

В предложении ADD FUNCTION это тип данных, который должна поддерживать функция, если он отличается от входного типа данных функции. Для функций сравнения B-деревьев и хеш-функций указывать тип_операнда необязательно, так как их входные типы данных всегда будут верными. Однако для функций поддержки сортировки B-деревьев и всех функций в классах операторов GiST, SP-GiST и GIN необходимо указать тип(ы) операндов, с которыми будут использоваться эти функции.

В предложении DROP FUNCTION должен быть указан тип операнда, для поддержки которого предназначена функция.

семейство_сортировки

Имя, которое может быть дополнено схемой, семейства операторов btree, описывающего порядок сортировки, связанный с оператором сортировки.

Если не указано ни FOR SEARCH (для поиска), ни FOR ORDER BY (для сортировки), то по умолчанию FOR SEARCH.

номер_опорной_функции

Номер опорной функции индексного метода для функции, связанной с данным семейством операторов

имя_функции

Имя, которое может быть дополнено схемой, функции, которая является опорной функцией индексного метода для данного семейства операторов. Если список аргументов отсутствует, имя функции должно быть уникальным в её схеме.

тип_аргумента

Тип(ы) данных параметра функции.

новое_имя

Новое имя семейства операторов.

новый_владелец

Новый владелец семейства операторов.

новая_схема

Новая схема для семейства операторов.

Предложения OPERATOR и FUNCTION могут указываться в любом порядке.

Примечания

Обратите внимание, что в синтаксисе DROP, указывается только «слот» в семействе операторов, по номеру стратегии или опорной функции, и входные типы данных. Имя оператора или функции, занимающей слот, не упоминается. Кроме того, для DROP FUNCTION необходимо указать типы входных данных, которые должна поддерживать функция; для индексов GiST, SP-GiST и Gin это может не иметь ничего общего с фактическими типами входных аргументов функции.

Поскольку механизм индексирования не проверяет права на доступ к функциям перед их использованием, включение функции или оператора в семейство операторов равносильно предоставлению права на их выполнение. Это обычно не является проблемой для тех видов функций, которые полезны в семействе операторов.

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

Примеры

Следующий пример добавляет опорные функции и операторы смешанных типов в семейство операторов, уже содержащее классы операторов B-дерева для типов данных int4 и int2.

ALTER OPERATOR FAMILY integer_ops USING btree ADD

  -- int4 и int2
  OPERATOR 1 < (int4, int2) ,
  OPERATOR 2 <= (int4, int2) ,
  OPERATOR 3 = (int4, int2) ,
  OPERATOR 4 >= (int4, int2) ,
  OPERATOR 5 > (int4, int2) ,
  FUNCTION 1 btint42cmp(int4, int2) ,

  -- int2 и int4
  OPERATOR 1 < (int2, int4) ,
  OPERATOR 2 <= (int2, int4) ,
  OPERATOR 3 = (int2, int4) ,
  OPERATOR 4 >= (int2, int4) ,
  OPERATOR 5 > (int2, int4) ,
  FUNCTION 1 btint24cmp(int2, int4) ;

Удаление этих же элементов:

ALTER OPERATOR FAMILY integer_ops USING btree DROP

  -- int4 vs int2
  OPERATOR 1 (int4, int2) ,
  OPERATOR 2 (int4, int2) ,
  OPERATOR 3 (int4, int2) ,
  OPERATOR 4 (int4, int2) ,
  OPERATOR 5 (int4, int2) ,
  FUNCTION 1 (int4, int2) ,

  -- int2 vs int4
  OPERATOR 1 (int2, int4) ,
  OPERATOR 2 (int2, int4) ,
  OPERATOR 3 (int2, int4) ,
  OPERATOR 4 (int2, int4) ,
  OPERATOR 5 (int2, int4) ,
  FUNCTION 1 (int2, int4) ;

Совместимость

Команда ALTER OPERATOR FAMILY отсутствует в стандарте SQL.

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

CREATE OPERATOR FAMILY, DROP OPERATOR FAMILY, CREATE OPERATOR CLASS, ALTER OPERATOR CLASS, DROP OPERATOR CLASS


ALTER POLICY

ALTER POLICY - изменить определение политики защиты на уровне строк

Синтаксис

ALTER POLICY имя ON имя_таблицы RENAME TO новое_имя

ALTER POLICY имя ON имя_таблицы
    [ TO { имя_роли | PUBLIC | CURRENT_USER | SESSION_USER } [, ...] ]
    [ USING ( выражение_использования ) ]
    [ WITH CHECK ( выражение_проверки ) ]

Описание

ALTER POLICY изменяет определение существующей политики защиты на уровне строк. Обратите внимание, что ALTER POLICY разрешает изменить только набор ролей, к которым применяется политика, и выражения USING и WITH CHECK. Чтобы изменить другие свойства политики, такие как команда, к которой она применяется или является ли она разрешительной или ограничительной, политика должна быть удалена и создана заново.

Чтобы использовать ALTER POLICY, необходимо быть владельцем таблицы, к которой применяется политика.

Во второй форме ALTER POLICY список ролей, выражение_использования и выражение_проверки заменяются независимо, если указаны. Если одно из этих условий опущено, соответствующая часть политики остается неизменной.

Параметры

Имя

Имя существующей политики, которую нужно изменить.

имя_таблицы

Имя, которое может быть дополнено схемой, таблицы, к которой применяется политика.

новое_имя

Новое имя для политики.

имя_роли

Роль(роли), на которую действует политика. Одновременно можно указать несколько ролей. Чтобы применить политику ко всем ролям, используйте PUBLIC.

выражение_использования

Выражение USING для политики. Дополнительные сведения смотрите в разделе CREATE POLICY.

выражение_проверки

Выражение WITH CHECK для политики. Дополнительные сведения смотрите в разделе CREATE POLICY.

Совместимость

Команда ALTER POLICY является расширением QHB.

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

CREATE POLICY, DROP POLICY


ALTER PROCEDURE

ALTER PROCEDURE - изменить определение процедуры

Синтаксис

ALTER PROCEDURE имя [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ]
    действие [ ... ] [ RESTRICT ]
ALTER PROCEDURE имя [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ]
    RENAME TO новое_имя
ALTER PROCEDURE имя [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ]
    OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER PROCEDURE имя [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ]
    SET SCHEMA новая_схема
ALTER PROCEDURE имя [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ]
    DEPENDS ON EXTENSION имя_расширения

Где действие может быть следующим:

    [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
    SET параметр_конфигурации { TO | = } { значение | DEFAULT }
    SET параметр_конфигурации FROM CURRENT
    RESET параметр_конфигурации
    RESET ALL

Описание

ALTER PROCEDURE изменяет определение процедуры.

Выполнить команду ALTER PROCEDURE может только владелец соответствующей процедуры. Чтобы изменить схему процедуры, необходимо иметь право CREATE в новой схеме. Для изменения владельца, текущий пользователь должен быть непосредственным или опосредованным членом новой роли, и эта роль должна иметь право CREATE в схеме процедуры. (Эти ограничения направлены на то, чтобы при смене владельца не происходило ничего, что нельзя было бы сделать, имея право удалить и снова создать процедуру. Однако суперпользователь может изменить владельца любой процедуры).

Параметры

Имя

Имя, которое может быть дополнено схемой, существующей процедуры. Если список аргументов не указан, имя должно быть уникальным в ее схеме.

режим_аргумента

Режим аргумента: IN или VARIADIC. По умолчанию равно IN.

имя_аргумента

Название аргумента. Обратите внимание, что ALTER PROCEDURE фактически не обращает никакого внимания на имена аргументов, поскольку для определения идентичности процедуры необходимы только типы данных аргументов.

тип_аргумента

Тип(ы) данных аргументов процедуры (возможно, дополненный(ые) схемой), если таковые имеются.

новое_имя

Новое имя процедуры.

новый_владелец

Новый владелец функции. Обратите внимание, что если процедура помечена как SECURITY DEFINER, в дальнейшем она будет выполняться от имени нового владельца.

новая_схема

Новая схема для процедуры.

имя_расширения

Имя расширения, от которого будет зависеть процедура.

[EXTERNAL] SECURITY INVOKER
[EXTERNAL] SECURITY DEFINER

Устанавливает, является ли процедура определяющей контекст безопасности. Ключевое слово EXTERNAL игнорируется для соответствия стандарту SQL. Дополнительную информацию об этой возможности смотрите в разделе CREATE PROCEDURE.

параметр_конфигурации
значение

Добавляет или изменяет установку параметра конфигурации, выполняемую при вызове процедуры. Если задано значение DEFAULT или равнозначное указание RESET, локальное переопределение для процедуры удаляется и функция выполняется со значением, установленным в окружении. Для удаления всех установок параметров процедуры укажите RESET ALL. SET FROM CURRENT устанавливает для последующих вызовов процедуры значение параметра, действующее в момент выполнения ALTER FUNCTION

Дополнительную информацию о разрешенных именах и значениях параметров смотрите в разделе SET и главе Конфигурация сервера.

RESTRICT

Игнорируется для соответствия стандарту SQL.

Примеры

Переименование процедуры insert_data с двумя аргументами типа integer в insert_record:

ALTER PROCEDURE insert_data(integer, integer) RENAME TO insert_record;

Смена владельца процедуры insert_data с двумя аргументами типа integer на joe:

ALTER PROCEDURE insert_data(integer, integer) OWNER TO joe;

Смена схемы процедуры insert_data с двумя аргументами типа integer на accounting:

ALTER PROCEDURE insert_data(integer, integer) SET SCHEMA accounting;

Обозначение процедуры insert_data(integer, integer) как зависимой от расширения myext:

ALTER PROCEDURE insert_data(integer, integer) DEPENDS ON EXTENSION myext;

Изменение пути поиска, который устанавливается автоматически для процедуры:

ALTER PROCEDURE check_password(text) SET search_path = admin, pg_temp;

Отмена автоматического определения search_path для процедуры:

ALTER PROCEDURE check_password(text) RESET search_path;

Теперь процедура будет выполняться с тем путём, который задан в момент вызова.

Совместимость

Команда частично совместима с командой ALTER PROCEDURE в стандарте SQL. Стандарт позволяет изменять больше свойств процедуры, но не предоставляет возможности переименовать процедуру, сделать процедуру определяющей контекст безопасности, связать с процедурой значения параметров конфигурации или изменить владельца, схему или характеристику изменчивости процедуры. Стандарт также требует, обязательного наличия слова RESTRICT, которое является необязательным в QHB.

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

CREATE PROCEDURE, DROP PROCEDURE, ALTER FUNCTION, ALTER ROUTINE


ALTER PUBLICATION

ALTER PUBLICATION — изменить определение публикации

Синтаксис

ALTER PUBLICATION имя ADD TABLE [ ONLY ] имя_таблицы [ * ] [, ...]
ALTER PUBLICATION имя SET TABLE [ ONLY ] имя_таблицы [ * ] [, ...]
ALTER PUBLICATION имя DROP TABLE [ ONLY ] имя_таблицы [ * ] [, ...]
ALTER PUBLICATION имя SET ( параметр_публикации [= значение] [, ... ] )
ALTER PUBLICATION имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER PUBLICATION имя RENAME TO новое_имя

Описание

Команда ALTER PUBLICATION может изменять атрибуты публикации.

Первые три формы команды управляют вхождением таблиц в публикации. Указание SET TABLE заменяет список таблиц в публикации заданным. Указания ADD TABLE и DROP TABLE добавляют и удаляют таблицы в публикации, соответственно. Обратите внимание, что для добавления таблиц в публикацию, на которую уже оформлена подписка, потребуется выполнить ALTER SUBSCRIPTION ... REFRESH PUBLICATION на стороне подписчика, чтобы это изменение вступило в силу.

Четвертая форма этой команды, указанная в синтаксисе, может изменять все свойства публикации, указанные в разделе в CREATE PUBLICATION. Свойства, не упомянутые в команде, сохраняют свои предыдущие значения.

Остальные формы меняют владельца и название публикации.

Вы должны владеть публикацией, чтобы использовать ALTER PUBLICATION . Чтобы изменить владельца, текущий пользователь должен быть прямым или косвенным членом новой роли владельца. Новый владелец должен иметь СОЗДАТЬ права доступа к базе данных.

Выполнить команду ALTER PUBLICATION может только владелец соответствующей публикации. Для изменения владельца, текущий пользователь должен быть непосредственным или опосредованным членом новой роли, и эта роль должна иметь право CREATE в базе данных. Кроме того, новым владельцем публикации FOR ALL TABLES должна быть суперпользователем. Однако суперпользователь может изменить владельца публикации, обходя эти ограничения.

Параметры

Имя

Название существующей публикации, определение которой подлежит изменению.

имя_таблицы

Имя существующей таблицы. Если перед именем таблицы указывается слово ONLY, затрагивается только эта таблица. Если ONLY не указано, затрагиваются и эта таблица и все ее потомки (если таковые имеются). После имени таблицы можно добавить необязательное указание *, это явно обозначит, что должны затрагиваться и все дочерние таблицы..

SET ( параметр_публикации [= значение] [, ... ] )

Это предложение изменяет параметры публикации, первоначально заданные командой CREATE PUBLICATION. новый_владелец

Имя пользователя, который станет новым владельцем публикации.

новое_имя

Новое название для публикации.

Примеры

Изменение публикации, чтобы публиковались только удаления и изменения:

ALTER PUBLICATION noinsert SET (publish = 'update, delete');

Добавление таблиц в публикацию:

ALTER PUBLICATION mypublication ADD TABLE users, departments;

Совместимость

Команда ALTER PUBLICATION является расширением QHB.

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

CREATE PUBLICATION, DROP PUBLICATION, CREATE SUBSCRIPTION, ALTER SUBSCRIPTION


ALTER ROLE

ALTER ROLE - изменить роль в базе данных

Синтаксис

ALTER ROLE указание_роли [ WITH ] параметр [ ... ]

Где параметр может быть:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT предел_подключений
    | [ ENCRYPTED ] PASSWORD 'пароль' | PASSWORD NULL
    | VALID UNTIL 'дата_время'

ALTER ROLE имя RENAME TO новое_имя

ALTER ROLE { указание_роли | ALL } [ IN DATABASE имя_бд ] SET параметр_конфигурации { TO | = } { значение | DEFAULT }
ALTER ROLE { указание_роли | ALL } [ IN DATABASE имя_бд ] SET параметр_конфигурации FROM CURRENT
ALTER ROLE { указание_роли | ALL } [ IN DATABASE имя_бд ] RESET параметр_конфигурации
ALTER ROLE { указание_роли | ALL } [ IN DATABASE имя_бд ] RESET ALL

Где указание_роли может быть:

    имя_роли
  | CURRENT_USER
  | SESSION_USER

Описание

ALTER ROLE изменяет атрибуты роли QHB.

Первая форма этой команды, может изменить большинство атрибутов роли, которые указываются в CREATE ROLE. (Покрываются все возможные атрибуты, отсутствует только возможность добавления/удаления членов роли; для этого нужно использовать формы GRANT и REVOKE). Атрибуты, не упомянутые в команде, сохраняют свои предыдущие настройки. Суперпользователи базы данных могут изменять любые из этих параметров для любой роли. Пользователи(роли) с правом CREATEROLE могут изменять любые из этих параметров, но только не у ролей суперпользователя и репликации. Обычные пользователи (роли) могут изменить только свой пароль.

Вторая форма меняет название роли. Суперпользователи базы данных могут переименовать любую роль. Пользователи(роли) с правом CREATEROLE могут переименовывать роли, не являющиеся суперпользователями. Текущий пользователь сеанса не может быть переименован. (Подключитесь как другой пользователь, если вам нужно это сделать). Так как в паролях с MD5-шифрованием имя роли используется в качестве криптосоли, при переименовании роли её пароль очищается, если он был зашифрован MD5

Остальные формы изменяют значение по умолчанию конфигурационной переменной, которое будет распространятся на сеансы роли либо для всех баз данных, либо, если указано IN DATABASE только для сеансов в указанной базе данных. Если вместо имени роли указывается ALL, то значение переменной распространяется на все роли. Использование ALL с IN DATABASE по сути равносильно использованию команды ALTER DATABASE ... SET ....

Когда роль впоследствии запустит новый сеанс, указанное значение станет значением по умолчанию, переопределяя все присутствующие настройки qhb.conf или полученные из командной строки QHB. Это происходит только во время входа в систему; выполнение SET ROLE или SET SESSION AUTHORIZATION не вызывает установки новых значений конфигурации. Параметры, заданные для всех баз данных, переопределяются переопределяется параметрами уровня БД, установленными для роли. Параметры для баз данных или ролей могут переопределять только суперпользователи.

Суперпользователи значения переменных по умолчанию для любых ролей. Пользователи(роли) с правом CREATEROLE могут изменять значения по умолчанию для ролей, не являющихся суперпользователями. Обычные пользователи (роли) могут устанавливать значения по умолчанию только для себя. Некоторые переменные конфигурации не могут быть установлены таким образом или могут быть установлены только в том случае, если суперпользователь выполняет команду. Только суперпользователи могут изменять настройки для всех ролей во всех базах данных.

Параметры

Имя

Имя роли, атрибуты которой должны быть изменены.

CURRENT_USER Выбирает для изменения текущего пользователя, вместо явно определенной роли.

SESSION_USER

Выбирает для изменения текущего пользователя сеанса, вместо явно определенной роли.

SUPERUSER
NOSUPERUSER
CREATEDB
NOCREATEDB
CREATEROLE
NOCREATEROLE
INHERIT
NOINHERIT
LOGIN
NOLOGIN
REPLICATION
NOREPLICATION
BYPASSRLS
NOBYPASSRLS
CONNECTION LIMIT предел_подключений
[ ENCRYPTED ] PASSWORD 'пароль'
PASSWORD NULL
VALID UNTIL 'дата_время'

Эти указания изменяют атрибуты, изначально заданные с помощью CREATE ROLE. Дополнительные сведения см. на странице CREATE ROLE.

новое_имя

Новое имя роли.

имя_бд

Имя базы данных, в которой должна быть установлена конфигурационная переменная.

параметр_конфигурации
значение

Указанный параметр конфигурации принимает заданное значение по умолчанию в сеансах роли. Если значение задано DEFAULT или, что равнозначно, используется указание RESET, переопределение этого параметра для роли удаляется, и роль будет получать в новых сеансах системное значение параметра. Чтобы очистить значения всех параметров роли нужно воспользоваться указанием RESET ALL. SET FROM CURRENT сохраняет текущее значение параметра сеанса в качестве значения для роли. Если указано IN DATABASE, параметр конфигурации устанавливается или удаляется только для данной роли и базы данных.

Определения переменных для роли применяются только в начале сеанса; команды SET ROLE и SET SESSION AUTHORIZATION эти определения не обрабатывают.

Дополнительную информацию о именах и значениях параметров смотрите в разделе SET и главе Конфигурация сервера.

Примечания

Для добавления новых ролей используйте команду CREATE ROLE, а для удаления - DROP ROLE.

ALTER ROLE не управляет членством роли, для этого применяются команды GRANT и REVOKE.

При указании незашифрованного пароля с помощью этой команды необходимо соблюдать осторожность. Пароль будет передан на сервер в виде открытого текста, и он также может быть зарегистрирован в журнале команд клиента или журнале сервера. qsql содержит команду \password, которая может быть использована для изменения пароля роли без предоставления открытого текста пароля.

Кроме того, можно привязать сеанс по умолчанию к определенной базе данных, а не к роли; см. раздел ALTER DATABASE . В случае возникновения конфликта параметры, относящиеся к конкретной роли базы данных, переопределяют параметры, относящиеся к конкретной роли, которые, в свою очередь, переопределяют параметры, относящиеся к конкретной базе данных.

Примеры

Изменение пароля роли:

ALTER ROLE davide WITH PASSWORD 'hu8jmn3';

Удаление пароля роли:

ALTER ROLE davide WITH PASSWORD NULL;

Изменение срока действия пароля (в частности, определяется, что пароль должен перестать действовать в полдень 4 мая 2015 г. в часовом поясе UTC+1):

ALTER ROLE chris VALID UNTIL 'May 4 12:00:00 2015 +1';

Установка бесконечного срока действия пароля:

ALTER ROLE fred VALID UNTIL 'infinity';

Добавление роли прав на создание других ролей и новых баз данных:

ALTER ROLE miriam CREATEROLE CREATEDB;

Определение нестандартного значения параметра maintenance_work_mem для роли:


ALTER ROLE worker_bee SET maintenance_work_mem = 100000;

Определение нестандартного значения параметра client_min_messages для роли и заданной базы:

ALTER ROLE fred IN DATABASE devel SET client_min_messages = DEBUG;

Совместимость

Команда ALTER ROLE является расширением QHB.

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

CREATE ROLE, DROP ROLE, ALTER DATABASE, SET


ALTER ROUTINE

ALTER ROUTINE - изменить определение подпрограммы

Синтаксис

ALTER ROUTINE имя [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ]
    действие [ ... ] [ RESTRICT ]
ALTER ROUTINE имя [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ]
    RENAME TO новое_имя
ALTER ROUTINE имя [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ]
    OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER ROUTINE имя [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ]
    SET SCHEMA новая_схема
ALTER ROUTINE имя [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ]
    DEPENDS ON EXTENSION имя_расширения

Где действие может быть следующим:

    IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF
    [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
    PARALLEL { UNSAFE | RESTRICTED | SAFE }
    COST стоимость_выполнения
    ROWS строк_в_результате
    SET параметр_конфигурации { TO | = } { значение | DEFAULT }
    SET параметр_конфигурации FROM CURRENT
    RESET параметр_конфигурации
    RESET ALL

Описание

ALTER ROUTINE изменяет определение подпрограммы, которая может быть агрегатной функцией, нормальной функцией или процедурой. Дополнительные примеры и дополнительные сведения смотрите в разделах ALTER AGGREGATE, ALTER FUNCTION и ALTER PROCEDURE.

Примеры

Переименование подпрограммы foo для типа integer в foobar:

ALTER ROUTINE foo(integer) RENAME TO foobar;

Эта команда будет работать независимо от того, является ли foo процедурой, агрегатной или обычной функцией.

Совместимость

Команда частично совместима с командой ALTER ROUTINE в стандарте SQL. Дополнительная информация в разделе ALTER FUNCTION и ALTER PROCEDURE. Возможность сослаться по имени подпрограммы на агрегатную функцию является расширением QHB.

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

ALTER AGGREGATE, ALTER FUNCTION, ALTER PROCEDURE, DROP ROUTINE

Обратите внимание, что команда CREATE ROUTINE отсутствует.


ALTER RULE

ALTER RULE - изменить определение правила

Синтаксис

ALTER RULE имя ON имя_таблицы RENAME TO новое_имя

Описание

ALTER RULE изменяет свойства существующего правила. В настоящее время единственным доступным действием является изменение имени правила.

Чтобы использовать ALTER RULE, необходимо быть владельцем таблицы или представления, к которым применяется правило.

Параметры

Имя

Имя существующего правила, которое нужно изменить.

имя_таблицы

Имя, которое может быть дополнено схемой, таблицы или представления, к которым применяется правило.

новое_имя

Новое имя правила.

Примеры

Переименование существующего правила:

ALTER RULE notify_all ON emp RENAME TO notify_me;

Совместимость

Команда ALTER RULE является расширением QHB, как и вся система перезаписи запросов.

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

CREATE RULE, DROP RULE


ALTER SCHEMA

ALTER SCHEMA - изменить определение схемы

Синтаксис

ALTER SCHEMA имя RENAME TO новое_имя
ALTER SCHEMA имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }

Описание

ALTER SCHEMA изменяет определение схемы.

Выполнить команду ALTER SCHEMA может только владелец соответствующей схемы. Чтобы переименовать схему, необходимо иметь право CREATE в базе данных. Для изменения владельца, текущий пользователь должен быть непосредственным или опосредованным членом новой роли, и эта роль должна иметь право CREATE в базы данных. (Обратите внимание, что суперпользователи имеют все эти права автоматически).

Параметры

Имя

Имя существующей схемы.

новое_имя

Новое имя схемы. Новое имя не может начинаться с pg_, поскольку такие имена зарезервированы для системных схем.

новый_владелец

Новый владелец схемы.

Совместимость

Команда ALTER SCHEMA отсутствует в стандарте SQL.

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

CREATE SCHEMA, DROP SCHEMA


ALTER SEQUENCE

ALTER SEQUENCE - изменить определение генератора последовательности

Синтаксис

ALTER SEQUENCE [ IF EXISTS ] имя
    [ AS тип_данных ]
    [ INCREMENT [ BY ] шаг ]
    [ MINVALUE мин_значение | NO MINVALUE ] [ MAXVALUE макс_значение | NO MAXVALUE ]
    [ START [ WITH ] начало ]
    [ RESTART [ [ WITH ] перезапуск ] ]
    [ CACHE кеш ] [ [ NO ] CYCLE ]
    [ OWNED BY { имя_таблицы.имя_столбца | NONE } ]
ALTER SEQUENCE [ IF EXISTS ] имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER SEQUENCE [ IF EXISTS ] имя RENAME TO новое_имя
ALTER SEQUENCE [ IF EXISTS ] имя SET SCHEMA новая_схема

Описание

ALTER SEQUENCE изменяет параметры существующего генератора последовательности. Все параметры, не заданные в команде ALTER SEQUENCE, сохраняют свои предыдущие настройки.

Выполнить команду ALTER SEQUENCE может только владелец соответствующей последовательности. Чтобы изменить схему последовательности, необходимо иметь право CREATE в новой схеме. Для изменения владельца, текущий пользователь должен быть непосредственным или опосредованным членом новой роли, и эта роль должна иметь право CREATE в схеме последовательности. (Эти ограничения направлены на то, чтобы при смене владельца не происходило ничего, что нельзя было бы сделать, имея право удалить и снова создать последовательность. Однако суперпользователь может изменить владельца любой последовательности).

Параметры

Имя

Имя, которое может быть дополнено схемой, последовательности, подлежащей изменению.

IF EXISTS

Не считать ошибкой, если последовательность не существует. В этом случае будет выдано замечание.

тип_данных

Необязательное предложение AS тип_данных меняет тип данных последовательности. Допустимые типы: smallint, integer и bigint.

Изменение типа данных автоматически изменяет минимальное и максимальное значения последовательности в том случае, когда предыдущие минимальное и максимальное значения были минимальным или максимальным значением старого типа данных (другими словами, если последовательность была создана с использованием NO MINVALUE или NO MAXVALUE, явно или неявно). В противном случае минимальное и максимальное значения сохраняются, если только новые значения не заданы в рамках этой команды. Если минимальное и максимальное значения не вписываются в новый тип данных, будет выдана ошибка.

шаг

Предложение INCREMENT BY шаг является необязательным. Положительное значение шага генерирует возрастающую последовательность, отрицательное - убывающую. Если не указано, старое значение шага будет сохранено.

мин_значение
NO MINVALUE

Необязательное предложение MINVALUE мин_значение определяет минимальное значение, которое может генерировать последовательность. Если указано NO MINVALUE для возрастающей последовательности, то будет использоваться значение по умолчанию 1, а для убывающей - минимальное число для её типа данных. Если ничего не указано, то текущее минимальное значение будет сохранено.

макс_значение
NO MAXVALUE

Необязательное предложение MAXVALUE макс_значение определяет максимальное значение для последовательности. Если указано NO MAXVALUE, для возрастающей последовательности значением по умолчанию будет максимальное число для её типа данных, а для убывающей -1. Если ничего не указано, то текущее максимальное значение будет сохранено.

начало

Необязательное предложение START WITH начало изменяет записанное начальное значение последовательности. Это не влияет на текущее значение последовательности;таким образом задается значение, которое будет использовать во время перезапуска последовательности в будущем ALTER SEQUENCE RESTART.

перезапуск

Необязательное предложение RESTART [ WITH перезапуск ] меняет текущее значение последовательности. Это похоже на вызов функции setval параметром is_called = false: указанное значение будет возвращено при следующем вызове функции nextval. Если в предложении RESTART отсутствует значение перезапуск, будет выставлено начальное значение, которое было указано при выполнении CREATE SEQUENCE или последнего установленного ALTER SEQUENCE START WITH.

В отличие от вызова функции setval, операция RESTART над последовательностью является транзакционной, и блокирует возможно получать номера из параллельных транзакций из той же последовательности. Если это поведение не устраивает, следует воспользоваться функцией setval.

Кэш

Предложение CACHE кеш позволяет заранее распределять и хранить в памяти последовательные номера для быстрого доступа. Минимальное значение равно 1 (за один раз может быть сгенерировано только одно значение, т. е. нет кэша). Если не указано, старое значение кэша будет сохранено.

CYCLE

Необязательный параметр CYCLE можно использовать для того чтобы зациклить последовательность при достижении макс_значения или мин_значения для возрастающей и убывающей последовательности, соответственно. Если предел достигнут, то следующим сгенерированным номером будет мин_значение или макс_значение, соответственно.

NO CYCLE

Если указано NO CYCLE, после того, как последовательность достигнет своего максимального значения, при вызове функции nextval будет возвращена ошибка.

Если указания CYCLE и NO CYCLE отсутствуют, сохраняется предыдущее поведение зацикливания.

OWNED BY имя_таблицы.имя_столбца
OWNED BY NONE

Указание OWNED BY связывает последовательность с определённым столбцом таблицы, для того чтобы при удалении этого столбца (или всей таблица), последовательность была тоже автоматически удалена. Это указание заменяет любую ранее установленную связь данной последовательности. Указанная таблица должна иметь того же владельца и находиться в той же схеме, что и последовательность. Указание OWNED BY NONE удаляет все существующие связи, делая последовательность "независимой".

новый_владелец

Имя пользователя нового владельца последовательности.

новое_имя

Новое имя последовательности.

новая_схема

Новая схема последовательности.

Примечания

ALTER SEQUENCE не сразу повлияет на результат, возвращаемый nextval в серверных процессах, отличных от текущего, которые могли предварительно сгенерировать (кэшировать) значения последовательности. Они будут использовать все кэшированные значения до того, как "заметят" изменения параметров генерации последовательности. Текущий сервер немедленно реагирует на изменения.

ALTER SEQUENCE не влияет на значение currval.

ALTER SEQUENCE блокирует параллельные вызовы nextval, currval, lastval и setval.

По историческим причинам ALTER TABLE также может работать с последовательностями; но все разновидности ALTER TABLE, допустимые для управления последовательностями, равнозначны вышеперечисленным формам.

Примеры

Перезапуск последовательности serial с числа 105:

ALTER SEQUENCE serial RESTART WITH 105;

Совместимость

Команда ALTER SEQUENCE соответствует стандарту SQL, за исключением указаний AS, START WITH, OWNED BY, OWNER TO, RENAME TO и SET SCHEMA, которые являются расширениями QHB.

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

CREATE SEQUENCE, DROP SEQUENCE


ALTER SERVER

ALTER SERVER - изменить определение стороннего сервера

Синтаксис

ALTER SERVER имя [ VERSION 'новая_версия' ]
    [ OPTIONS ( [ ADD | SET | DROP ] параметр ['значение'] [, ... ] ) ]
ALTER SERVER имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER SERVER имя RENAME TO новое_имя

Описание

ALTER SERVER изменяет определение стороннего сервера. Первая форма изменяет строку версии сервера или общие параметры сервера (требуется по крайней мере одно предложение). Вторая форма изменяет владельца сервера.

Чтобы изменить сервер, текущий пользователь должен быть владельцем сервера. Кроме того, чтобы изменить владельца, вы должны владеть сервером, а также быть прямым или косвенным членом новой роли владельца, и текущий пользователь должен иметь право USAGE для обертки стороннего сервера. (Обратите внимание, что суперпользователи удовлетворяют всем этим критериям автоматически).

Выполнить команду ALTER SERVER может только владелец сервера. Чтобы изменить владельца, необходимо быть его владельцем, а также непосредственным или опосредованным членом новой роли-владельца, и кроме того, иметь право USAGE для обертки сторонних данных сервера. (Суперпользователи удовлетворяют всем этим условиям автоматически).

Параметры

Имя

Имя существующего сервера.

новая версия

Новая версия сервера.

OPTIONS ( [ ADD | SET | DROP ] параметр ['значение'] [, ... ] )

Эти формы изменяют параметры сервера. ADD, SET и DROP указывают действие, которое необходимо выполнить. По умолчанию предполагается ADD . Имена параметров должны быть уникальными; имена и значения проверяются с помощью обертки сторонних данных.

новый_владелец

Имя пользователя, который станет новым владельцем стороннего сервера.

новое_имя

Новое имя для стороннего сервера.

Примеры

Изменение свойств сервера foo, добавление параметров подключения:

ALTER SERVER foo OPTIONS (host 'foo', dbname 'foodb');

Изменение свойств сервера foo: смена версии, изменение параметра host:

ALTER SERVER foo VERSION '8.4' OPTIONS (SET host 'baz');

Совместимость

Команда ALTER SERVER соответствует стандарту ISO / IEC 9075-9 (SQL/MED). Формы OWNER TO и RENAME являются расширениями QHB.

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

CREATE SERVER, DROP SERVER


ALTER STATISTICS

ALTER STATISTICS - изменить определение объекта расширенной статистики

Синтаксис

ALTER STATISTICS имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER STATISTICS имя RENAME TO новое_имя
ALTER STATISTICS имя SET SCHEMA новая_схема

Описание

ALTER STATISTICS изменяет параметры существующего объекта расширенной статистики. Все параметры, не заданные в команде ALTER STATISTICS, сохраняют свои предыдущие значения.

Выполнить команду ALTER STATISTICS может только владелец соответствующего объекта статистики. Чтобы изменить схему объекта статистики, необходимо иметь право CREATE в новой схеме. Для изменения владельца, текущий пользователь должен быть непосредственным или опосредованным членом новой роли, и эта роль должна иметь право CREATE в схеме объекта статистики. (Эти ограничения направлены на то, чтобы при смене владельца не происходило ничего, что нельзя было бы сделать, имея право удалить и снова создать объект статистики. Однако суперпользователь может изменить владельца любого объекта статистики).

Параметры

Имя

Имя, которое может быть дополнено схемой, объекта статистики, подлежащего изменению.

новый_владелец

Имя пользователя, который станет новым владельцем объекта статистики.

новое_имя

Новое имя объекта статистики.

новая_схема

Новая схема объекта статистики.

Совместимость

Команда ALTER STATISTICS отсутствует в стандарте SQL.

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

CREATE STATISTICS, DROP STATISTICS


ALTER SUBSCRIPTION

ALTER SUBSCRIPTION - изменить определение подписки

Синтаксис

ALTER SUBSCRIPTION имя CONNECTION 'строка_подключения'
ALTER SUBSCRIPTION имя SET PUBLICATION имя_публикации [, ...] [ WITH ( параметр_set_publication [= значение] [, ... ] ) ]
ALTER SUBSCRIPTION имя REFRESH PUBLICATION [ WITH ( параметр_обновления [= значение] [, ... ] ) ]
ALTER SUBSCRIPTION имя ENABLE
ALTER SUBSCRIPTION имя DISABLE
ALTER SUBSCRIPTION имя SET ( параметр_подписки [= значение] [, ... ] )
ALTER SUBSCRIPTION имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER SUBSCRIPTION имя RENAME TO новое_имя

Описание

ALTER SUBSCRIPTION изменяет большинство свойств подписки, которые можно указать в команде CREATE SUBSCRIPTION .

Выполнить команду ALTER SUBSCRIPTION может только владелец соответствующей подписки. Чтобы изменить владельца, нужно быть непосредственным или опосредованным членом новой роли-владельца. Новый владелец должен быть суперпользователем. (В настоящее время все владельцы подписок должны быть суперпользователями, так что на практике проверка владельца будет пропущена. Но в будущем это может быть изменено).

Параметры

Имя

Имя подписки, свойства которой должны быть изменены.

CONNECTION 'строка_подключения'

Это предложение изменяет свойство соединения, первоначально установленное командой CREATE SUBSCRIPTION. За дополнительными сведениями обратитесь к описанию этой команды.

SET PUBLICATION имя_публикации

Изменяет список публикаций, на которые оформлена подписка. Дополнительную информацию смотрите в разделе CREATE SUBSCRIPTION. По умолчанию эта команда также выполняет действие REFRESH PUBLICATION.

В указании параметр_set_publication задаются дополнительные свойства операции. Поддерживаемые параметры:

  • refresh (boolean)

При значении false команда не будет пытаться обновить информацию о таблицах. REFRESH PUBLICATION после этого следует выполнять отдельно. Значение по умолчанию: true.

Кроме того здесь могут задаваться параметры обновления, упомянутые в описании REFRESH PUBLICATION.

REFRESH PUBLICATION

Считывает недостающую информацию о таблицах с публикующего сервера. Это приводит к перезапуску репликации таблиц, добавленных в публикации, на которые оформлена подписка, после последнего вызова REFRESH PUBLICATION или CREATE SUBSCRIPTION .

В указании параметр_обновления задаются дополнительные свойства операции обновления. Поддерживаемые параметры::

  • copy_data (boolean)

Указывает, следует ли копировать существующие данные в публикациях, на которые оформляется подписка, после запуска репликации. Значение по умолчанию: true.

ENABLE

Включает ранее отключенную подписку, запуская процесс логической репликации в конце транзакции.

DISABLE

Отключает запущенную подписку, останавливая процесс логической репликации в конце транзакции.

SET ( параметр_подписки [= значение] [, ... ] )

Это предложение изменяет параметры, первоначально заданные с помощью команды CREATE SUBSCRIPTION. Допустимые параметры: slot_name и synchronous_commit

новый_владелец

Имя пользователя, который станет новым владельцем подписки.

новое_имя

Новое имя подписки.

Примеры

Изменение подписки, заключающееся в подписывании на публикацию insert_only:

ALTER SUBSCRIPTION mysub SET PUBLICATION insert_only;

Отключение (остановка) подписки:

ALTER SUBSCRIPTION mysub DISABLE;

Совместимость

Команда ALTER SUBSCRIPTION является расширением QHB.

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

CREATE SUBSCRIPTION, DROP SUBSCRIPTION, CREATE PUBLICATION, ALTER PUBLICATION


ALTER SYSTEM

ALTER SYSTEM - изменить параметр конфигурации сервера

Синтаксис

ALTER SYSTEM SET параметр_конфигурации { TO | = } { значение | 'значение' | DEFAULT }

ALTER SYSTEM RESET параметр_конфигурации
ALTER SYSTEM RESET ALL

Описание

ALTER SYSTEM используется для изменения параметров конфигурации сервера во всем кластере баз данных. Это может быть более удобным, чем традиционный метод ручного редактирования qhb.conf файла. ALTER SYSTEM записывает заданную настройку параметра в файл qhb.auto.conf, который считывается в дополнение к qhb.conf. При указании в качестве значения параметра DEFAULT или применении формы RESET, соответствующий элемент конфигурации удаляется из qhb.auto.conf файл. Удаляет все настроенные таким способом параметры указание RESET ALL.

Значения, установленные с помощью ALTER SYSTEM, будут действовать после следующей перезагрузки конфигурации сервера или после перезагрузки сервера (в случае изменения параметров, изменения которых могут вступить в силу только при запуске сервера). Перезагрузка конфигурации сервера может быть выполнена с помощью вызова SQL-функции pg_reload_conf(), выполнив qhb_ctl reload или отправив сигнал SIGHUP главному серверному процессу.

Выполнить команду ALTER SYSTEM могут только суперпользователи. Кроме того, поскольку эта команда действует непосредственно на файловую систему и не может быть отменена, она не может быть помещена в блок транзакций или функцию.

Параметры

параметр_конфигурации

Имя настраиваемого параметра конфигурации. Доступные параметры описаны в главе Конфигурация сервера.

значение

Новое значение параметра. Значения могут быть указаны в виде строковых констант, идентификаторов, чисел или разделенных запятыми списков из них, в зависимости от конкретного параметра. Если в качестве значения указать DEFAULT, параметр и его значение удаляется из qhb.auto.conf.

Примечания

Эта команда не может быть использована для установки data_directory, как и для параметров, которые не разрешены в qhb.conf см. раздел Учетная запись пользователя.

Другие способы задания параметров смотри в разделе Настройка параметров.

Примеры

Установка уровня ведения журнала транзакций (wal_level):

ALTER SYSTEM SET wal_level = replica;

Отмена изменения, восстановление значения, заданного в qhb.conf:

ALTER SYSTEM RESET wal_level;

Совместимость

Команда ALTER SYSTEM является расширением QHB.

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

SET, SHOW


ALTER TABLE

ALTER TABLE - изменить определение таблицы

Синтаксис

ALTER TABLE [ IF EXISTS ] [ ONLY ] имя [ * ]
    действие [, ... ]
ALTER TABLE [ IF EXISTS ] [ ONLY ] имя [ * ]
    RENAME [ COLUMN ] имя_столбца TO новое_имя_столбца
ALTER TABLE [ IF EXISTS ] [ ONLY ] имя [ * ]
    RENAME CONSTRAINT имя_ограничения TO имя_нового_ограничения
ALTER TABLE [ IF EXISTS ] имя
    RENAME TO новое_имя
ALTER TABLE [ IF EXISTS ] имя
    SET SCHEMA новая_схема
ALTER TABLE ALL IN TABLESPACE имя [ OWNED BY имя_роли [, ... ] ]
    SET TABLESPACE новое_табл_пространство [ NOWAIT ]
ALTER TABLE [ IF EXISTS ] имя
    ATTACH PARTITION имя_партиции { FOR VALUES указание_границ_партиции | DEFAULT }
ALTER TABLE [ IF EXISTS ] имя
    DETACH PARTITION имя_партиции
ALTER TABLE [ IF EXISTS ] имя
    действие_pg_pathman

Где действие может быть следующим:

    ADD [ COLUMN ] [ IF NOT EXISTS ] имя_столбца тип_данных [ COLLATE правило_сортировки ] [ ограничение_столбца [ ... ] ]
    DROP [ COLUMN ] [ IF EXISTS ] имя_столбца [ RESTRICT | CASCADE ]
    ALTER [ COLUMN ] имя_столбца [ SET DATA ] TYPE тип_данных [ COLLATE правило_сортировки ] [ USING выражение ]
    ALTER [ COLUMN ] имя_столбца SET DEFAULT выражение
    ALTER [ COLUMN ] имя_столбца DROP DEFAULT
    ALTER [ COLUMN ] имя_столбца { SET | DROP } NOT NULL
    ALTER [ COLUMN ] имя_столбца ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( параметры_последовательности ) ]
    ALTER [ COLUMN ] имя_столбца { SET GENERATED { ALWAYS | BY DEFAULT } | SET параметр_последовательности | RESTART [ [ WITH ] перезапуск ] } [...]
    ALTER [ COLUMN ] имя_столбца DROP IDENTITY [ IF EXISTS ]
    ALTER [ COLUMN ] имя_столбца SET STATISTICS integer
    ALTER [ COLUMN ] имя_столбца SET ( атрибут = значение [, ... ] )
    ALTER [ COLUMN ] имя_столбца RESET ( атрибут [, ... ] )
    ALTER [ COLUMN ] имя_столбца SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
    ADD ограничение_таблицы [ NOT VALID ]
    ADD ограничение_таблицы_по_индексу
    ALTER CONSTRAINT имя_ограничения [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
    ALTER CONSTRAINT имя_ограничения [USING INDEX имя_индекса]
    VALIDATE CONSTRAINT имя_ограничения
    DROP CONSTRAINT [ IF EXISTS ]  имя_ограничения [ RESTRICT | CASCADE ]
    DISABLE TRIGGER [ имя_триггера | ALL | USER ]
    ENABLE TRIGGER [ имя_триггера | ALL | USER ]
    ENABLE REPLICA TRIGGER имя_триггера
    ENABLE ALWAYS TRIGGER имя_триггера
    DISABLE RULE имя_правила_перезаписи
    ENABLE RULE имя_правила_перезаписи
    ENABLE REPLICA RULE имя_правила_перезаписи
    ENABLE ALWAYS RULE имя_правила_перезаписи
    DISABLE ROW LEVEL SECURITY
    ENABLE ROW LEVEL SECURITY
    FORCE ROW LEVEL SECURITY
    NO FORCE ROW LEVEL SECURITY
    CLUSTER ON имя_индекса
    SET WITHOUT CLUSTER
    SET WITHOUT OIDS
    SET TABLESPACE новое_табл_пространство
    SET { LOGGED | UNLOGGED }
    SET CONSTANT
    SET ( параметр_хранения = значение [, ... ] )
    RESET ( параметр_хранения [, ... ] )
    INHERIT таблица_родитель
    NO INHERIT таблица_родитель
    OF имя_типа
    NOT OF
    OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
    REPLICA IDENTITY { DEFAULT | USING INDEX имя_индекса | FULL | NOTHING }

Где указание_границ_партиции  может быть:

IN ( выражение_границ_партиции [, ...] ) |
FROM ( { выражение_границ_партиции | MINVALUE | MAXVALUE } [, ...] )
  TO ( { выражение_границ_партиции | MINVALUE | MAXVALUE } [, ...] ) |
WITH ( MODULUS числовая_константа, REMAINDER числовая_константа )

Где действие_pg_pathman  может быть:

    PARTITION BY HASH ( ключ_разбиения ) PARTITIONS ( число_партиций ) [ CONCURRENTLY ]
    PARTITION BY RANGE ( ключ_разбиения ) START FROM ( начальное_значение ) INTERVAL ( значение ) [ CONCURRENTLY ]
    ADD PARTITION имя_партиции VALUES LESS THAN ( значение ) [ TABLESPACE табл_пространство ]
    DROP PARTITION имя_партиции
    MERGE PARTITIONS имя_партиции [, ... ] INTO PARTITION имя_партиции [ TABLESPACE табл_пространство ]
    MOVE PARTITION имя_партиции [ TABLESPACE табл_пространство ]
    RENAME PARTITION имя_партиции TO новое_имя_партиции
    SET INTERVAL ( значение )
    SPLIT PARTITION имя_партиции AT ( значение ) [ INTO ( PARTITION левая_партиция [ TABLESPACE табл_пространство1 ], PARTITION правая_партиция [ TABLESPACE табл_пространство2 ] ) ]

Где ограничение_столбца  может быть:

[ CONSTRAINT имя_ограничения ]
{ NOT NULL |
  NULL |
  CHECK ( выражение ) [ NO INHERIT ] |
  DEFAULT выражение_по_умолчанию |
  GENERATED ALWAYS AS ( генерирующее_выражение ) STORED |
  GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( параметры_последовательности ) ] |
  UNIQUE параметры_индекса |
  PRIMARY KEY параметры_индекса |
  REFERENCES целевая_таблица [ ( целевой_столбец ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
    [ ON DELETE ссылочное_действие ] [ ON UPDATE ссылочное_действие ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

Где ограничение_таблицы  может быть:

[ CONSTRAINT имя_ограничения ]
{ CHECK ( выражение ) [ NO INHERIT ] |
  UNIQUE ( имя_столбца [, ... ] ) параметры_индекса |
  PRIMARY KEY ( имя_столбца [, ... ] ) параметры_индекса |
  EXCLUDE [ USING индексный_метод ] ( элемент_исключения WITH оператор [, ... ] ) параметры_индекса [ WHERE ( предикат ) ] |
  FOREIGN KEY ( имя_столбца [, ... ] ) REFERENCES целевая_таблица [ ( целевой_столбец [, ... ] ) ]
    [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE ссылочное_действие ] [ ON UPDATE ссылочное_действие ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

Где ограничение_таблицы_по_индексу  может быть:

    [ CONSTRAINT имя_ограничения ]
    { UNIQUE | PRIMARY KEY } USING INDEX имя_индекса
    [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

Где параметры_индекса в ограничениях UNIQUE, PRIMARY KEY и EXCLUDE  могут быть:

[ INCLUDE ( имя_столбца [, ... ] ) ]
[ WITH ( параметр_хранения [= значение] [, ... ] ) ]
[ USING INDEX TABLESPACE табл_пространство ]

Где элемент_исключения в ограничении EXCLUDE может быть:

{ имя_столбца | ( выражение ) } [ класс_операторов ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]

Описание

ALTER TABLE изменяет определение существующей таблицы. Существует несколько форм команды, описанные ниже. Обратите внимание, что требуемый уровень блокировки может отличаться для каждой формы. Если явно не отмечено другое, требуется блокировка ACCESS EXCLUSIVE. При перечислении нескольких подкоманд будет запрашиваться самая сильная блокировка из требуемых ими.

ADD COLUMN [ IF NOT EXISTS ]

Эта форма добавляет новый столбец в таблицу, используя тот же синтаксис, что и CREATE TABLE. Если указано IF NOT EXISTS и столбец с таким именем уже существует, это не будет ошибкой.

DROP COLUMN [ IF EXISTS ]

Эта форма удаляет столбец из таблицы. Индексы и ограничения таблицы, связанные со столбцом, также будут автоматически удалены. Также будет удалена многовариантная статистика, охватывающая удаляемый столбец, если после его удаления в статистике останутся данные только одного столбца. Чтобы удалить какие-либо зависящие от этого столбца объекты, например, внешние ключи или представления, необходимо добавить в команду указание CASCADE. Если в команде указано IF EXISTS и удаляемый столбец не существует, это не считается ошибкой, вместо этого просто выдаётся замечание.

SET DATA TYPE

Эта форма изменяет тип столбца таблицы. Индексы и простые табличные ограничения, включающие столбец, будут автоматически преобразованы для использования нового типа столбца путем повторного разбора определяющего их выражения. Необязательное указание COLLATE задает правило сортировки для нового столбца; если оно опущены, устанавливается правило сортировки по умолчанию для нового типа столбца. Необязательное указание USING определяет, как вычислить новое значение столбца из старого; если оно опущено, выполняется преобразование по умолчанию от старого типа данных к новому. Предложение USING становится обязательным, если нет никакого неявного приведения или присваивания с приведением от старого к новому типу.

SET/DROP DEFAULT

Эти формы устанавливают или удаляют для столбца значение по умолчанию. Значения по умолчанию применяются только в последующих командах INSERT или UPDATE; они не вызывают изменения уже существующих строк в таблице.

SET/DROP NOT NULL

Эти формы определяют, будет ли столбец принимать значения NULL или нет.

Указание SET NOT NULL может применяться к столбцу, только если ни одна из записей в таблице не содержит значение NULL. Как правило, это проверяется во время выполнения команды ALTER TABLE и требует сканирования всей таблицы; однако, в случае наличия у столбца ограничения CHECK, которое гарантирует, что NULL значения отсутствуют, сканирование таблицы пропускается.

Если таблица является партицией, DROP NOT NULL нельзя выполнить, в случае если колонка помечена NOT NULL в родительской таблице. Чтобы удалить ограничение NOT NULL со всех партиций, нужно выполнить DROP NOT NULL у родительской таблицы. При этом, если ограничения NOT NULL отсутствует у родительской таблицы, такое ограничение все же может быть добавлено к отдельным партициям, если это необходимо; то есть потомки могут запретить значения NULL, даже если родитель разрешает их, но не наоборот.

ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY
SET GENERATED { ALWAYS | BY DEFAULT }
DROP IDENTITY [ IF EXISTS ]

Эти формы определяют, является ли столбец столбцом идентификации, и меняют свойства генерирования значений уже существующего столбца идентификации. Дополнительные сведения см. в разделе CREATE TABLE.

Если указывается DROP IDENTITY IF EXISTS, и столбец не является столбцом идентификации, ошибка не возникает. В этом случае выдаётся только замечание.

SET параметр_последовательности
RESTART

Эти формы меняют нижележащую последовательность ранее созданного столбца идентификации. Параметр_последовательности поддерживается командой ALTER SEQUENCE, например INCREMENT BY.

SET STATISTICS

Эта форма задаёт ориентир сбора статистики по столбцу для последующих операций ANALYZE. Диапазон допустимых значений ориентира: 0..10000; при -1 применяется системное значение по умолчанию (default_statistics_target). Дополнительную информацию об использовании статистики планировщиком запросов QHB см. в разделе Статистика, используемая планировщиком.

SET STATISTICS запрашивает блокировку SHARE UPDATE EXCLUSIVE.

SET ( атрибут = значение [, ... ] )
RESET ( атрибут [, ... ] )

Эта форма устанавливает или сбрасывает параметры для каждого атрибута. В настоящее время единственными параметрами атрибутов являются n_distinct и n_distinct_inherited, которые переопределяют оценки числа различных значений, производимые последующими операциями ANALYZE. n_distinct влияет на статистику для самой таблицы, в то время как n_distinct_inherited влияет на статистику, собранную для таблицы и ее потомков. Если установлено положительное значение, ANALYZE будет считать, что столбец содержит точно указанное число различных значений не NULL. Если установлено отрицательное значение, которое должно быть больше или равно -1, ANALYZE будет считать, что число различных значений не NULL в столбце линейно зависит от размера таблицы; точное число должно быть вычислено путем умножения расчетного размера таблицы на абсолютное значение данного числа. Например, значение -1 означает, что все значения в столбце различны, а значение -0,5 означает, что каждое значение повторяется в среднем дважды. Это может быть полезно, когда размер таблицы изменяется с течением времени, так как умножение на количество строк в таблице выполняется только во время планирования запроса. С 0 количество различных значений оценивается как обычно. Дополнительную информацию об использовании статистики планировщиком запросов QHB смотри в разделе Статистика, используемая планировщиком.

Для изменения параметров атрибутов запрашивается блокировка SHARE UPDATE EXCLUSIVE.

SET STORAGE

Эта форма задает режим хранения для столбца. Этот параметр определяет, будет ли этот столбец храниться внутри таблицы или в отдельной таблице TOAST, а также следует ли сжимать данные. Режим PLAIN необходимо использовать для значений фиксированной длины, таких как integer; это вариант хранения внутри, без сжатия. Режим MAIN предназначен для хранения внутри, но сжимаемых данных. Режим EXTERNAL предназначен для внешних, несжатых данных, а также EXTENDED предназначен для внешних, сжатых данных. EXTENDED используется по умолчанию для большинства типов данных, которые поддерживают non-PLAIN хранение. Применение EXTERNAL позволяет ускорить операции с подстроками на очень больших значениях text и bytea, за счёт проигрыша в объёме хранилища. Обратите внимание, что SET STORAGE сам по себе ничего не меняет в таблице, а лишь задает стратегию, которой следует придерживаться при последующих обновлениях таблицы. Дополнительную информацию смотрите в разделе TOAST.

ADD ограничение_таблицы [ NOT VALID ]

Эта форма добавляет новое ограничение к таблице, используя тот же синтаксис, что и CREATE TABLE, плюс параметр NOT VALID, который в настоящее время разрешен только для ограничений внешнего ключа и проверки.

Обычно эта форма вызывает сканирование таблицы, чтобы проверить, что все существующие строки в таблице удовлетворяют новому ограничению. Но если используется опция ... NOT VALID , это потенциально-длительное сканирование пропускается. Ограничение по-прежнему будет применяться к последующим вставкам или обновлениям (то есть они будут завершены ошибкой, если в ссылочной таблице нет соответствующей строки, в случае внешних ключей, или они завершатся ошибкой, если новая строка не соответствует указанному условию проверки). Но база данных не будет считать, что ограничение выполняется для всех строк в таблице, пока оно не будет проверено с помощью VALIDATE CONSTRAIN. Дополнительную информацию об использовании указания NOT VALID вы найдете ниже, в Примечании.

Для добавления ограничения внешнего ключа запрашивается блокировка SHARE ROW EXCLUSIVE в целевой таблице, помимо блокировки таблицы, в которой создаётся ограничение.

С ограничениями уникальности и первичного ключа, которые добавляются в партиционированные таблицы, связаны дополнительные требования; смотрите CREATE TABLE. Кроме того, в настоящее время ограничения внешнего ключа для партиционированных таблиц не могут объявляться как непроверенные (NOT VALID).

ADD ограничение_таблицы_по_индексу

Эта форма добавляет новое PRIMARY KEY или UNIQUE ограничение для таблицы, основанное на существующем уникальном индексе. Все столбцы индекса будут включены в ограничение.

Индекс не может быть частичным и включать столбцы-выражения. Кроме того, это должен быть индекс b-дерево с порядком сортировки по умолчанию. Эти ограничения гарантируют, что индекс эквивалентен тому, который был бы построен обычным ADD PRIMARY KEY или ADD UNIQUE командами.

Если указывается PRIMARY KEY, и столбцы индекса еще не помечены NOT NULL, то эта команда попытается выполнить ALTER COLUMN SET NOT NULL для каждой такой колонки. Проверка, что столбцы не содержат нулей, потребует полного сканирования таблицы. Во всех остальных случаях это очень быстрая операция.

Если имя ограничения указано, то индекс будет переименован, чтобы соответствовать имени ограничения. В противном случае ограничение будет называться так же, как и индекс.

После выполнения этой команды индекс становится «принадлежащим» ограничению, так же, как если бы индекс был построен командой ADD PRIMARY KEY или ADD UNIQUE. Кроме того, удаление ограничения приведет и к удалению индекса.

В настоящее время эта форма не поддерживается для партиционированных таблиц.

Замечание
Добавление ограничения с помощью существующего индекса может быть полезно в ситуациях, когда необходимо добавить новое ограничение, не блокируя обновления таблицы в течение длительного времени. Чтобы сделать это, создайте индекс, используя CREATE INDEX CONCURRENTLY, а затем задействуйте его как полноценное ограничение, используя эту запись. Смотрите пример ниже.

ALTER CONSTRAINT

Эта форма меняет атрибуты созданного ранее ограничения. В настоящее время изменять можно только ограничения внешнего ключа.

VALIDATE CONSTRAINT

Эта форма проверяет ограничение внешнего ключа или проверочное ограничение, которое ранее было создано как NOT VALID, путем сканирования всей таблицы, чтобы убедиться, что нет строк, для которых ограничение не выполняется. Если ограничение уже помечено как проверенное, ничего не происходит. (См. Примечания ниже для объяснения полезности этой команды).

DROP CONSTRAINT [ IF EXISTS ]

Эта форма удаляет указанное ограничение на таблицу вместе с индексом, лежащим в основе ограничения. Если указано IF EXISTS и ограничение не существует,это не считается ошибкой. В этом случае выдается уведомление.

DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER

Эти формы настраивают срабатывание триггеров, принадлежащих таблице. Отключенный триггер сохраняется в системе, но не выполняется, когда происходит его запускающее событие. Для отложенного триггера состояние enable проверяется при наступлении события, а не при фактическом выполнении функции триггера. Можно отключить или включить один триггер, указанный по имени, или все триггеры в таблице, или только пользовательские триггеры (этот параметр исключает внутренние триггеры ограничений, такие как те, которые используются для реализации ограничений внешнего ключа или отложенных ограничений уникальности и исключения). Отключение или включение сгенерированных внутрисистемных триггеров ограничений требует прав суперпользователя; это должно быть сделано с осторожностью, так как, конечно, целостность ограничения не может быть гарантирована, если триггеры не выполняются.

На механизм срабатывания триггера также влияет переменная конфигурации session_replication_role. Включённые без дополнительных указаний триггеры (по умолчанию) будут срабатывать, когда роль репликации “origin” (по умолчанию) или “local”. Триггеры настроенные с указанием ENABLE REPLICA будут срабатывать только в том случае, если сеанс находится в режиме “replica", и триггеры настроенные с указанием ENABLE ALWAYS будут запущены независимо от текущего режима репликации.

Эффект этого механизма заключается в том, что в конфигурации по умолчанию триггеры не срабатывают на репликах. Это полезно, потому что если триггер используется в исходной базе для распространения данных между таблицами, то система репликации также будет реплицировать и распределённые таким образом данные, и триггер не должен срабатывать во второй раз на реплике, потому что это приведет к дублированию. Однако если триггер используется для другой цели, например для создания внешних оповещений, то его можно задать равным ENABLE ALWAYS, чтобы он также срабатывал в репликах.

Эта команда запрашивает блокировку SHARE ROW EXCLUSIVE.

DISABLE/ENABLE [ REPLICA | ALWAYS ] RULE

Эти формы настраивают запуск правил перезаписи, принадлежащих таблице. Отключенное правило сохраняется в системе, но не применяется во время перезаписи запроса. Семантика является такой же, как для отключенных/включенных триггеров. Эта конфигурация игнорируется для правила ON SELECT, которое всегда применяется для поддержания работы представлений, даже в сеансах, исполняющих не основную роль репликации.

Механизм запуска правила также зависит от переменной конфигурации session_replication_role, аналогичной триггерам, описанным выше.

DISABLE/ENABLE ROW LEVEL SECURITY

Эти формы управляют применением политик защиты строк, принадлежащих таблице. Если защита включена и для таблицы не определены политики, то применяется политика по умолчанию - запретить доступ. Обратите внимание, что политики могут существовать для таблицы, даже если защита на уровне строк отключена - в этом случае политики НЕ применяются и их ограничения игнорируются. Смотрите также CREATE POLICY

NO FORCE/FORCE ROW LEVEL SECURITY

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

CLUSTER ON

Эта форма выбирает индекс по умолчанию для будущих операций кластера CLUSTER. Это фактически не перекластеризует таблицу.

Для изменения параметров кластеризации запрашивается блокировка SHARE UPDATE EXCLUSIVE.

SET WITHOUT CLUSTER

Эта форма удаляет из таблицы самую последнюю используемую спецификацию индекса кластера. Это влияет на будущие операции кластера, для которых не будет задан индекс.

Для изменения параметров кластеризации запрашивается блокировка SHARE UPDATE EXCLUSIVE.

SET WITHOUT OIDS

Обеспечивающий обратную совместимость синтаксис удаления системного столбца oid. Так как добавить системные столбцы oid теперь невозможно, это указание фактически не действует.

SET TABLESPACE

Эта форма изменяет табличное пространство таблицы на указанное табличное пространство и перемещает файлы данных, связанные с таблицей, в новое табличное пространство. Индексы на таблице, если таковые имеются, не перемещаются; но их можно перемещать отдельно дополнительными командами SET TABLESPACE. При применении к партиционированной таблице ничего не перемещается, но все партиции, созданные впоследствии с помощью CREATE TABLE PARTITION OF, будут использовать это табличное пространство, если только оно не будет переопределено предложением TABLESPACE.

Все таблицы в текущей базе данных в табличном пространстве можно переместить с помощью формы ALL IN TABLESPACE, которая заблокирует все таблицы, которые будут перемещены в первую очередь, а затем переместит каждую из них. Эта форма также поддерживает указание OWNED BY: с которым перемещаются только таблицы указанных владельцев. Если указана опция NOWAIT, то команда завершится ошибкой, если она не сможет сразу получить все необходимые блокировки. Обратите внимание, что системные каталоги не перемещаются этой командой; если требуется переместить их, следует использовать ALTER DATABASE или явные вызовы ALTER TABLE. Отношения information_schema не считаются частью системных каталогов и подлежат перемещению. См. также CREATE TABLESPACE.

SET { LOGGED / UNLOGGED }

Эта форма меняет характеристику журналирования таблицы, делает таблицу журналируемой/нежурналируемой, соответственно (см.UNLOGGED). Не может быть применена к временной таблице.

SET ( параметр_хранения = значение [, ... ] )

Эта форма изменяет один или несколько параметров хранения для таблицы. Смотрите Параметры хранения для получения подробной информации о доступных параметрах. Обратите внимание, что содержимое таблицы не будет этой командой изменено немедленно; в зависимости от параметра Вам может потребоваться переписать таблицы, чтобы получить желаемый эффект. Это можно сделать с помощью команд VACUUM FULL, CLUSTER или одной из форм ALTER TABLE, которая принудительно перезаписывает таблицу. Для параметров, связанных с планировщиком, изменения вступят в силу с момента следующей блокировки таблицы, поэтому текущие выполняемые запросы не будут затронуты.

Данная форма запрашивает блокировку SHARE UPDATE EXCLUSIVE для изменения параметров хранения, связанных с фактором заполнения, TOAST и автоочисткой, а также параметра планировщика parallel_workers.

RESET ( параметр_хранения [, ... ] )

Эта форма сбрасывает один или несколько параметров хранения до значений по умолчанию. Как и в случае с SET, для полного обновления таблицы может потребоваться перезапись таблицы.

INHERIT таблица_родитель

Эта форма добавляет целевую таблицу в качестве нового потомка(дочернего элемента) указанной родительской таблицы. Впоследствии запросы к родительской таблице будут включать записи целевой таблицы. Для добавления в качестве потомка, целевая таблица уже должна содержать все те же столбцы, что и родительская (она также может содержать дополнительные столбцы). Столбцы должны иметь соответствующие типы данных, и если они имеют NOT NULL ограничения в родителе, то они также должны иметь NOT NULL ограничения в потомке.

Также в таблице-потомке должны присутствовать все ограничения CHECK родительской таблицы, за исключением помеченных как не наследуемых (то есть созданных с помощью команда ALTER TABLE ... ADD CONSTRAINT ... NO INHERIT) которые игнорируются; все соответствующие ограничения дочерней таблицы не должны быть помечены как не наследуемые. В настоящий момент UNIQUE, PRIMARY KEY, и FOREIGN KEY ограничения не учитываются, но это может измениться в будущем.

NO INHERIT таблица_родитель

Эта форма удаляет целевую таблицу из списка потомков(дочерних элементов) указанной родительской таблицы. Запросы к родительской таблице больше не будут включать записи, полученные из целевой таблицы.

OF имя_типа

Эта форма связывает таблицу с составным типом, как если бы таблица была сформирована командой CREATE TABLE OF. Список имен и типов столбцов таблицы должен точно соответствовать списку составного типа. Таблица не должна быть потомком другой таблицы. Эти ограничения гарантируют, что CREATE TABLE OF позволит эквивалентное создание таблицы.

NOT OF

Эта форма отделяет типизированную таблицу от ее типа.

OWNER TO

Эта форма изменяет владельца таблицы, последовательности, представления, материализованного представления или сторонней таблицы для указанного пользователя.

REPLICA IDENTITY

Эта форма изменяет информацию, которая записывается в журнал предзаписи для идентификации строк, которые обновляются или удаляются. Этот параметр не действует, за исключением случаев, когда используется логическая репликация. В режиме DEFAULT (по умолчанию для не системных таблиц) записывается старые значения столбцов первичного ключа, если таковые имеются. В режиме USING INDEX записывается старые значения столбцов, составляющих индекс, который должен быть быть уникальным, не частичным, не отложенным и включать только столбцы, помеченные NOT NULL. В режиме FULL записываются старые значения всех столбцов в строке. В режиме NOTHING не записывается никакой информации о старой строке. (Это значение по умолчанию для системных таблиц). Во всех случаях старые значения не регистрируются, если хотя бы один из столбцов, которые должны быть записаны, не отличается от старой и новой версий строки.

RENAME

Форма RENAME изменяет имя таблицы (или индекса, последовательности, представления, материализованного представления или сторонней таблицы), имя отдельного столбца в таблице или имя ограничения таблицы. При переименовании ограничения, имеющего базовый индекс, этот индекс также переименовывается. При этом никакого влияния на сохраненные данные.

SET SCHEMA

Эта форма перемещает таблицу в другую схему. Связанные индексы, ограничения и последовательности, принадлежащие столбцам таблицы, также перемещаются.

ATTACH PARTITION имя_партиции { FOR VALUES указание_границ_партиции | DEFAULT }

Эта форма присоединяет существующую таблицу (которая сама может быть партиционирована) в качестве партиции к целевой таблице. Таблица может быть присоединена в качестве партиции для конкретных значений с помощью FOR VALUES или в качестве партиции по умолчанию с помощью DEFAULT. Для каждого индекса в целевой таблице будет создан соответствующий индекс в присоединенной таблице; или, если эквивалентный индекс уже существует, он будет присоединен к индексу целевой таблицы, как при выполнении команды ALTER INDEX ATTACH PARTITION. Обратите внимание, что если существующая таблица является сторонней таблицей, то в настоящее время ее нельзя присоединить в качестве партиции целевой таблицы, если в целевой таблице есть уникальные UNIQUE индексы. (Смотрите также CREATE FOREIGN TABLE).

Для партиции, добавляемой с FOR VALUES, используется то же указание_границ_партиции, что и в CREATE TABLE. Спецификация привязки к партициям должна соответствовать стратегии партиционирования и ключу разбиения целевой таблицы. Присоединяемая таблица должна содержать все те же столбцы, что и целевая таблица, и не более; кроме того, типы столбцов также должны совпадать. Кроме того, присоединяемая таблица должна иметь все NOT NULL и CHECK ограничения целевой таблицы. В настоящий момент ограничения FOREIGN KEY не рассматриваются. UNIQUE и PRIMARY KEY ограничения из родительской таблицы будут созданы в партиции, если они еще не существуют. Если какое-либо из ограничений CHECK присоединяемой таблицы помечено как NO INHERIT, команда выдаст ошибку; такие ограничения нужно будет пересоздать без предложения NO INHERIT.

Если новая партиция является обычной таблицей, выполняется полное сканирование таблицы, чтобы проверить, что существующие строки в таблице не нарушают ограничение партиции. Можно избежать этого сканирования, добавив ограничение CHECK для таблицы, позволяющее использовать только строки, удовлетворяющие требуемому ограничению партиции, перед выполнением этой команды. Ограничение CHECK будет использоваться для определения того, что таблицу не нужно сканировать для проверки ограничения партиции. Это не работает, однако, если какой-либо из ключей раздела является выражением и раздел не принимает значения NULL. При присоединении партиции по списку, не принимающей значения NULL, также добавьте ограничение NOT NULL в столбец ключа разбиения, если это не выражение.

Если новая партиция является сторонней таблицей, не делается проверки того, что все строки в сторонней таблице подчиняются ограничению партиции. (См. обсуждение в разделе создания сторонней таблицыCREATE FOREIGN TABLE).

Если таблица имеет партицию по умолчанию, добавление новой партиции изменяет ограничение партиции по умолчанию. Партиция по умолчанию не может содержать строк, которые необходимо было бы переместить в новую партицию, поэтому она будет просканирована и проверена на предмет их отсутствия. Этого сканирования, как и сканирования новой партиции, можно избежать, если определить подходящее ограничение CHECK. Кроме того, как и сканирование новой партиции, оно всегда пропускается, когда партиция является сторонней таблицей.

Для присоединения партиции запрашивается блокировка SHARE UPDATE EXCLUSIVE в родительской таблице, помимо блокировок ACCESS EXCLUSIVE в присоединяемых таблицах и партиции по умолчанию (при наличии).

DETACH PARTITION имя_партиции

Эта форма отсоединяет указанную партицию целевой таблицы. Отсоединенная партиция продолжает существовать как отдельная таблица, но больше не имеет никаких связей с таблицей, из которой была отсоединена. Все индексы, присоединенные к индексам целевой таблицы, отсоединяются.

Все формы ALTER TABLE, которые действуют на одну таблицу, за исключением RENAME, SET SCHEMA, ATTACH PARTITION, и DETACH PARTITION могут быть объединены в список из нескольких изменений, которые будут применяться вместе. Например, можно добавить несколько столбцов и/или изменить тип нескольких столбцов в одной команде. Это особенно полезно с большими таблицами, в виду того что так вся таблица обрабатывается за один проход.

Выполнить команду ALTER TABLE может только владелец соответствующей таблицы. Чтобы изменить схему или табличное пространство таблицы, необходимо иметь право CREATE в новой схеме или табличном пространстве. Чтобы добавить таблицу в качестве нового потомка(дочернего элемента) родительской таблицы, текущий пользователь должен быть владельцем родительской таблицы. Кроме того, чтобы присоединить таблицу в качестве новой партиции таблицы, вы должны быть владельцем присоединяемой таблицы. Для изменения владельца, текущий пользователь должен быть непосредственным или опосредованным членом новой роли, и эта роль должна иметь право CREATE в схеме таблицы. (Эти ограничения направлены на то, чтобы при смене владельца не происходило ничего, что нельзя было бы сделать, имея право удалить и снова создать таблицу. Однако суперпользователь может изменить владельца любой таблицы). Чтобы добавить столбец, сменить тип столбца или применить предложение OF, необходимо также иметь право USAGE для соответствующего типа данных.

Параметры

IF EXISTS

Не считать ошибкой, если таблица не существует. В этом случае будет выдано замечание.

Имя

Имя, которое может быть дополнено схемой, существующей таблицы для изменения. Если указывается ONLY перед именем таблицы, изменяется только эта таблица. Если ONLY не указано, таблица и все ее потомки (если таковые имеются) будут изменены. После имени таблицы можно также добавить необязательное указание *, чтобы явно обозначить, что изменению подлежат все дочерние таблицы.

имя_столбца

Имя нового или существующего столбца.

новое_имя_столбца

Новое имя существующего столбца.

новое_имя

Новое имя таблицы.

тип_данных

Тип данных нового столбца или новый тип данных для существующего столбца.

ограничение_таблицы

Новое ограничение таблицы.

имя_ограничения

Имя нового или существующего ограничения.

CASCADE

Автоматически удаляются объекты, зависящие от удаляемого столбца или ограничения (например, представления, ссылающиеся на столбец), и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей).

RESTRICT

Запретить удаление столбца или ограничения, если существуют зависящие от них объекты. Это поведение по умолчанию.

имя_триггера

Имя триггера, который нужно отключить или включить.

ALL

Отключить или включить все триггеры, принадлежащие таблице. (Для этого потребуются права суперпользователя, если в числе этих триггеров оказываются сгенерированные внутрисистемные триггеры исключений, таким как те, что используются для реализации ограничений внешнего ключа или отложенных ограничений уникальности и исключения).

USER

Отключить или включить все триггеры, принадлежащие таблице, сгенерированных внутрисистемных триггеров исключений, таких как те, что используются для реализации ограничений внешнего ключа или отложенных ограничений уникальности и исключения.

имя_индекса

Имя существующего индекса.

параметр_хранения

Имя параметра хранения таблицы.

значение

Новое значение для параметра хранения таблицы. Это может быть число или строка в зависимости от параметра.

таблица_родитель

Родительская таблица для связывания или отмены связи с этой таблицей.

новый_владелец

Имя пользователя, который станет новым владельцем таблицы.

новое_табл_пространство

Имя табличного пространства, в которое будет перемещена таблица.

новая_схема

Имя схемы, в которую будет перемещена таблица.

имя_партиции

Имя таблицы, присоединяемой в качестве новой партиции, или наоборот, отсоединяемой от данной таблицы.

указание_границ_партиции

Указание границ для новой партиции. Подробнее синтаксис этого указания рассматривается в описании CREATE TABLE.

Примечания ALTER TABLE

Ключевое слово COLUMN не несёт смысловой нагрузки и может быть опущено.

Когда столбец добавляется с помощью ADD COLUMN и задано неизменчивое выражение DEFAULT, что значение по умолчанию вычисляется во время выполнения инструкции и результат сохраняется в метаданных таблицы. Это значение будет использоваться для столбца для всех существующих строк. Если указание DEFAULT отсутствует, используется значение NULL. Ни в том, ни в другом случае не требуется переписывать таблицу.

Добавление столбца с изменчивым выражением DEFAULT или изменение типа существующего столбца потребует перезаписи всей таблицы и ее индексов. В качестве исключения, при изменении типа существующего столбца, с указанием USING не изменяется содержимое столбца, и старый тип двоично приводится к новому или является неограниченным доменом поверх нового типа, перезапись таблицы не требуется; но все индексы на затронутых столбцах все равно должны быть перестроены. Перестроение таблицы и / или индекса может занять значительное время для большой таблицы; которая при этом временно требует вдвое больше места на диске.

Добавление ограничений CHECK или NOT NULL требует сканирования таблицы, чтобы убедиться, что существующие строки соответствуют ограничению, но не требует перезаписи таблицы.

Аналогично, при присоединении новой партиции она может быть проверена, чтобы убедиться, что существующие строки соответствуют ограничению партиции.

Основная причина предоставления возможности указать несколько изменений в одной команде ALTER TABLE заключается в том, что это позволяет совместить сканирования и перезаписи таблицы, требуемые этим операциям, и выполнить их за один проход.

Сканирование большой таблицы для проверки нового внешнего ключа или проверочного ограничения может занять много времени, и другие обновления таблицы блокируются до тех пор, пока не будет зафиксирована команда ALTER TABLE ADD CONSTRAINT. Основное предназначение указания NOT VALID при добавлении ограничения состоит в уменьшении влияния этой операции на параллельные изменения данных. С NOT VALID, команда ADD CONSTRAINT не сканирует таблицу и может быть немедленно зафиксирована. После этого, можно выполнить команду VALIDATE CONSTRAINT, чтобы проверить, что существующие строки удовлетворяют ограничению. Эта команда не будет препятствовать параллельным изменениям, так как ей известно, что в других транзакциях для добавляемых или изменяемых строк ограничение уже будет действовать; только ранее существующие строки должны быть проверены. Следовательно, проверка запрашивает SHARE UPDATE EXCLUSIVE блокировка на таблицу. (Если ограничение является внешним ключом, то в целевой таблице этого ключа также запрашивается блокировка ROW SHARE). Помимо оптимизации параллельной работы, может быть полезно использовать указания NOT VALID и VALIDATE CONSTRAINT в тех случаях, когда заведомо известно, что в таблице есть строки, нарушающие ограничения. После создания ограничения добавить новые недопустимые строки будет невозможно, а все существующие проблемы могут разрешаться в удобное время, пока VALIDATE CONSTRAINT не выполнится успешно.

Форма DROP COLUMN физически не удаляет столбец, а просто делает его невидимым для операций SQL. Последующие операции вставки и обновления в таблице будут сохранять нулевое значение для столбца. Таким образом, удаление столбца выполняется быстро, но это не приводит к немедленному уменьшению размера таблицы на диске, поскольку пространство, занимаемое удаляемым столбцом, не восстанавливается. Пространство будет освобождаться с течением времени по мере обновления существующих строк.

Чтобы принудительно освободить место, занимаемое удаляемым столбцом, можно выполнить одну из форм ALTER TABLE, которая выполняет перезапись всей таблицы. В результате все строки будут воссозданы так, что в удалённом столбце будет содержаться NULL.

Перезаписывающие формы ALTER TABLE небезопасны с точки зрения MVCC. После перезаписи таблицы таблица будет казаться пустой для параллельных транзакций, если они используют снимок, сделанный до того, как произошла перезапись. Смотрите раздел Ограничения для получения более подробной информации.

В указании USING предложения SET DATA TYPE фактически можно указать любое выражение, включающее старые значения строки; то есть оно может ссылаться на другие столбцы, а также на преобразуемый столбец. Это позволяет выполнять очень общие преобразования с помощью SET DATA TYPE. Из-за этой гибкости, выражение USING не применяется к значению столбца по умолчанию (если таковое имеется); результат может не быть константным выражением, как это требуется для значения по умолчанию. Это означает, что при отсутствии неявного приведения или присвоения от старого к новому типу, SET DATA TYPE возможно, не удастся преобразовать значение по умолчанию, даже если указано USING. В таких случаях нужно удалить значение по умолчанию с помощью DROP DEFAULT, выполнить ALTER TYPE, а затем использовать SET DEFAULT чтобы добавить подходящее новое значение по умолчанию. Аналогичные соображения применимы к индексам и ограничениям, связанным со столбцом.

Если таблица имеет таблицы-потомки(дочерние таблицы), то не разрешается добавлять, переименовывать или изменять тип столбца в родительской таблице, не делая то же самое для потомков. Это гарантирует, что у потомков столбцы, соответствуют родительским. Подобным образом, нельзя переименовать ограничение CHECK в родительской таблице, не переименовывая его во всех дочерних таблицах, что тоже гарантирует соответствие всех ограничений CHECK. (Однако это ограничение не распространяется на ограничения, основанные на индексах). Кроме того, поскольку выборка из родительской таблицы также отирает из ее потомков, ограничение на родительской таблице не может быть помечено как действующее, если оно также не помечено как действующее для ее потомков. Во всех этих случаях команда ALTER TABLE ONLY не будет выполнена

Рекурсивная операция DROP COLUMN удаляет столбец дочерней таблицы только в том случае, если дочерняя таблица не унаследовала этот столбец не наследуется от каких-то других родителей, и никогда не был определён в дочерней таблице независимо. Нерекурсивная операция DROP COLUMN (т. е., ALTER TABLE ONLY ... DROP COLUMN) никогда не удаляет никакие унаследованные столбцы, а вместо этого помечает их как независимо определенные, а не унаследованные. С партиционированной таблицей нерекурсивная команда DROP COLUMN выдаст ошибку, так как все партиции таблицы должны содержать те же столбцы, что и главная таблица.

Действия для столбцов идентификации (ADD GENERATED, SET и т. д., DROP IDENTITY), а также действия TRIGGER, CLUSTER, OWNER и TABLESPACE никогда не распространяются рекурсивно на дочерние таблицы; то есть, они всегда действуют так, как будто указано ONLY. Операция добавления ограничения выполняется рекурсивно только для ограничений CHECK, не помеченных как NO INHERIT.

Изменение любой части таблицы системного каталога не допускается.

За более подробным описанием допустимых параметров обратитесь к CREATE TABLE. В главе Определение данных содержится дополнительная информация о наследовании.

Примеры

Добавление в таблицу столбца типа varchar:

ALTER TABLE distributors ADD COLUMN address varchar(30);

Удаление столбца из таблицы:

ALTER TABLE distributors DROP COLUMN address RESTRICT;

Изменение типов двух существующих столбцов в одной операции:

ALTER TABLE distributors
    ALTER COLUMN address TYPE varchar(80),
    ALTER COLUMN name TYPE varchar(100);

Смена типа целочисленного столбца, содержащего время в стиле Unix, на тип timestamp with time zone с применением предложения USING:

ALTER TABLE foo
    ALTER COLUMN foo_timestamp SET DATA TYPE timestamp with time zone
    USING
        timestamp with time zone 'epoch' + foo_timestamp * interval '1 second';

То же самое, но в случае, когда у столбца есть значение по умолчанию, которое не может быть автоматически приведено к новому типу данных:

ALTER TABLE foo
    ALTER COLUMN foo_timestamp DROP DEFAULT,
    ALTER COLUMN foo_timestamp TYPE timestamp with time zone
    USING
        timestamp with time zone 'epoch' + foo_timestamp * interval '1 second',
    ALTER COLUMN foo_timestamp SET DEFAULT now();

Переименование существующего столбца:

ALTER TABLE distributors RENAME COLUMN address TO city;

Переименование существующей таблицы:

ALTER TABLE distributors RENAME TO suppliers;

Переименование существующего ограничения:

ALTER TABLE distributors RENAME CONSTRAINT zipchk TO zip_check;

Добавление в столбец ограничения NOT NULL:

ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;

Удаление ограничения NOT NULL из столбца:

ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL;

Добавление ограничения-проверки в таблицу и все её потомки:

ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);

Добавление ограничения-проверки только в таблицу, но не в её потомки:

ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5)
	NO INHERIT;

(Данное ограничение-проверка не будет наследоваться и будущими потомками тоже).

Удаление ограничения-проверки из таблицы и из всех её потомков:

ALTER TABLE distributors DROP CONSTRAINT zipchk;

Удаление ограничения-проверки только из самой таблицы:

ALTER TABLE ONLY distributors DROP CONSTRAINT zipchk;

(Ограничение-проверка остаётся во всех дочерних таблицах).

Добавление в таблицу ограничения внешнего ключа:

ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address)
	REFERENCES addresses (address);

Добавление в таблицу ограничения внешнего ключа с наименьшим влиянием на работу других:

ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address)
	REFERENCES addresses (address) NOT VALID;
ALTER TABLE distributors VALIDATE CONSTRAINT distfk;

Добавление в таблицу ограничения уникальности (по нескольким столбцам):

ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);

Добавление в таблицу первичного ключа с автоматическим именем (учтите, что в таблице может быть только один первичный ключ):

ALTER TABLE distributors ADD PRIMARY KEY (dist_id);

Добавление в таблицу ограничения уникальности:

CREATE TABLE products (
    product_no integer CONSTRAINT must_be_different UNIQUE,
    name text,
    price numeric
);

Создание другого индекса по тому же столбцу, по которому был создан первоначальный индекс, и изменение ограничения для использования нового индекса:

CREATE UNIQUE INDEX must_be_different_new
    ON products USING BTREE(product_no);

ALTER TABLE products
    ALTER CONSTRAINT must_be_different
    USING INDEX must_be_different_new;

Перемещение таблицы в другое табличное пространство:

ALTER TABLE distributors SET TABLESPACE fasttablespace;

Перемещение таблицы в другую схему:

ALTER TABLE myschema.distributors SET SCHEMA yourschema;

Пересоздание ограничения первичного ключа без блокировки изменений в процессе перестроения индекса:

CREATE UNIQUE INDEX CONCURRENTLY dist_id_temp_idx ON distributors (dist_id);
ALTER TABLE distributors DROP CONSTRAINT distributors_pkey,
    ADD CONSTRAINT distributors_pkey PRIMARY KEY USING INDEX dist_id_temp_idx;

Присоединение партиции к таблице, разбиваемой по диапазонам:

ALTER TABLE measurement
    ATTACH PARTITION measurement_y2016m07 FOR VALUES FROM ('2016-07-01') TO ('2016-08-01');

Присоединение партиции к таблице, разбиваемой по списку:

ALTER TABLE cities
    ATTACH PARTITION cities_ab FOR VALUES IN ('a', 'b');

Присоединение партиции к таблице, разбиваемой по хешу:

ALTER TABLE orders
    ATTACH PARTITION orders_p4 FOR VALUES WITH (MODULUS 4, REMAINDER 3);

Присоединение партиции по умолчанию к партиционированной таблице:

ALTER TABLE cities
    ATTACH PARTITION cities_partdef DEFAULT;

Удаление партиции из партиционированной таблицы:

ALTER TABLE measurement
    DETACH PARTITION measurement_y2015m12;

Партиционирование существующей таблицы по диапазонам с интервалом 100 и последующее разделение партиции journal_1 на две (с использованием pg_pathman):

ALTER TABLE journal
    PARTITION BY RANGE(id)
    START FROM (0)
    INTERVAL (100);

ALTER TABLE journal
    SPLIT PARTITION journal_1
    AT (50)
    INTO (PARTITION journal_050, PARTITION journal_100);

Добавление новой партиции в таблицу journal, партиционированную по диапазонам (с использованием pg_pathman):

ALTER TABLE journal
    ADD PARTITION journal_300
    VALUES LESS THAN (300);

Объединение двух соседних партиций таблицы journal в одну:

ALTER TABLE journal
    MERGE PARTITIONS journal_050 INTO PARTITION journal_100;

Партиционирование существующей таблицы по хешу с использованием pg_pathman:

ALTER TABLE journal
    PARTITION BY HASH PARTITIONS (3);

Совместимость

Формы ADD (без USING INDEX), DROP COLUMN, DROP IDENTITY, RESTART, SET DEFAULT, SET DATA TYPE (без USING), SET GENERATED и SET параметр_последовательности соответствуют стандарту SQL. Другие формы являются расширениями стандарта SQL, которые реализованы в QHB. Кроме того, возможность указать несколько операций изменения в одной команде ALTER TABLE, тоже является расширением.

ALTER TABLE DROP COLUMN позволяет удалить единственный столбец таблицы, оставляя таблицу без столбцов. Это расширение стандарта SQL, который не допускает таблицы без столбцов.

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

CREATE TABLE


ALTER TABLESPACE

ALTER TABLESPACE - изменить определение табличного пространства

Синтаксис

ALTER TABLESPACE имя RENAME TO новое_имя
ALTER TABLESPACE имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER TABLESPACE имя SET ( параметр_табличного_пространства = значение [, ... ] )
ALTER TABLESPACE имя RESET ( параметр_табличного_пространства [, ... ] )

Описание

ALTER TABLESPACE изменяет определение табличного пространства.

Выполнить команду ALTER TABLESPACE может только владелец табличного пространства. Для изменения владельца, текущий пользователь должен быть непосредственным или опосредованным членом новой роли владельца. (Обратите внимание, что суперпользователи имеют эти права автоматически).

Параметры

Имя

Имя существующего табличного пространства.

новое_имя

Новое имя табличного пространства. Новое имя не может начинаться с pg_, поскольку такие имена зарезервированы для системных табличных пространств.

новый_владелец

Новый владелец табличного пространства.

параметр_табличного_пространства

Параметр табличного пространства, который необходимо установить или сбросить. В настоящее время доступны только следующие параметры seq_page_cost, random_page_cost и effective_io_concurrency. Установка любого значения для табличного пространства переопределит обычную оценку стоимости чтения страниц из таблиц в этом пространстве, установленную параметрами конфигурации с тем же именем (см. seq_page_cost, random_page_cost, effective_io_concurrency). Это может быть полезно, если одно из табличных пространств расположено на диске, который быстрее или медленнее, чем остальная дисковая система.

Примеры

Переименование табличного пространства index_space в fast_raid:

ALTER TABLESPACE index_space RENAME TO fast_raid;

Смена владельца табличного пространства index_space:

ALTER TABLESPACE index_space OWNER TO mary;

Совместимость

Команда ALTER TABLESPACE отсутствует в стандарте SQL.

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

CREATE TABLESPACE, DROP TABLESPACE


ALTER TEXT SEARCH CONFIGURATION

ALTER TEXT SEARCH CONFIGURATION - изменить определение конфигурации текстового поиска

Синтаксис

ALTER TEXT SEARCH CONFIGURATION имя
    ADD MAPPING FOR тип_фрагмента [, ... ] WITH имя_словаря [, ... ]
ALTER TEXT SEARCH CONFIGURATION имя
    ALTER MAPPING FOR тип_фрагмента [, ... ] WITH имя_словаря [, ... ]
ALTER TEXT SEARCH CONFIGURATION имя
    ALTER MAPPING REPLACE старый_словарь WITH новый_словарь
ALTER TEXT SEARCH CONFIGURATION имя
    ALTER MAPPING FOR тип_фрагмента [, ... ] REPLACE старый_словарь WITH новый_словарь
ALTER TEXT SEARCH CONFIGURATION имя
    DROP MAPPING [ IF EXISTS ] FOR тип_фрагмента [, ... ]
ALTER TEXT SEARCH CONFIGURATION имя RENAME TO новое_имя
ALTER TEXT SEARCH CONFIGURATION имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER TEXT SEARCH CONFIGURATION имя SET SCHEMA новая_схема

Описание

ALTER TEXT SEARCH CONFIGURATION изменяет определение конфигурации текстового поиска. Вы можете изменить его сопоставления типов фрагментов со словарями, или изменить имя или владельца конфигурации.

Выполнить команду ALTER TEXT SEARCH CONFIGURATION может только владелец соответствующей конфигурации

Параметры

Имя

Имя, которое может быть дополнено схемой, существующей конфигурации текстового поиска.

тип_фрагмента

Имя типа фрагмента, которое выдается при разборе конфигурации.

имя_словаря

Имя словаря текстового поиска, в котором будет искаться указанный тип(ы) фрагмента. Если в списке указано несколько словарей, к ним будут обращаться в указанном порядке.

старый_словарь

Имя словаря текстового поиска, который будет заменен в сопоставлении.

новый_словарь

Имя словаря текстового поиска, которое будет подставлено там, где был старый_словарь.

новое_имя

Новое имя конфигурации текстового поиска.

новый_владелец

Новый владелец конфигурации текстового поиска.

новая_схема

Новая схема конфигурации текстового поиска.

Форма ADD MAPPING FOR устанавливает список словарей, которые будут просматриваться в поиске указанных типов фрагментов; Если уже существует сопоставление для любого из типов фрагментов, выдается ошибка. Форма ALTER MAPPING FOR делает то же самое, но сначала удаляет все существующие сопоставления для типов фрагментов. Формы ALTER MAPPING REPLACE подставляет новый_словарь вместо старый_словарь везде, где последний появляется. Это делается только для указанных типов фрагментов, когда присутствует FOR, или для всех сопоставлений конфигурации в противном случае. Форма DROP MAPPING удаляет все словари для указанных типов фрагментов, в результате чего фрагментов этих типов игнорируются конфигурацией текстового поиска. Если сопоставлений для заданных типов фрагментов нет, возникает ошибка, если не добавлено указание IF EXISTS.

Примеры

В следующем примере словарь english заменяется на swedish везде, где использовался english в конфигурации my_config.

ALTER TEXT SEARCH CONFIGURATION my_config
  ALTER MAPPING REPLACE english WITH swedish;

Совместимость

Команда ALTER TEXT SEARCH CONFIGURATION отсутствует в стандарте SQL.

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

CREATE TEXT SEARCH CONFIGURATION, DROP TEXT SEARCH CONFIGURATION


ALTER TEXT SEARCH DICTIONARY

ALTER TEXT SEARCH DICTIONARY - изменить определение словаря текстового поиска

Синтаксис

ALTER TEXT SEARCH DICTIONARY имя (
    параметр [ = значение ] [, ... ]
)
ALTER TEXT SEARCH DICTIONARY имя RENAME TO новое_имя
ALTER TEXT SEARCH DICTIONARY имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER TEXT SEARCH DICTIONARY имя SET SCHEMA новая_схема

Описание

ALTER TEXT SEARCH DICTIONARY изменяет определение словаря текстового поиска. Можно изменить параметры справочника, относящиеся к определенному шаблону, или изменить имя или владельца справочника.

Выполнить ALTER TEXT SEARCH DICTIONARY может только владелец словаря.

Параметры

Имя

Имя, которое может быть дополнено схемой, существующего словаря текстового поиска.

параметр

Имя параметра шаблона, который должен быть установлен для этого словаря.

значение

Новое значение, используемое для параметра настройки шаблона. Если знак равенства и значение опущены, то любая предыдущая настройка для параметра удаляется из справочника, позволяя использовать значение по умолчанию.

новое_имя

Новое имя словаря текстового поиска.

новый_владелец

Новый владелец словаря текстового поиска.

новая_схема

Новая схема словаря текстового поиска.

Параметры настройки шаблона, могут указываться в любом порядке.

Примеры

Команда в следующем примере меняет список стоп-слов словаря на базе Snowball. Другие параметры остаются неизменными.

ALTER TEXT SEARCH DICTIONARY my_dict ( StopWords = newrussian );

Команда в следующем примере меняет параметр, определяющий язык, на dutch, и удаляет параметр, задающий список стоп-слов.

ALTER TEXT SEARCH DICTIONARY my_dict ( language = dutch, StopWords );

Следующая команда «изменяет» определение словаря, на самом деле не меняя ничего.

ALTER TEXT SEARCH DICTIONARY my_dict ( dummy );

(Это работает потому, что код удаления параметра не считает ошибкой отсутствие такого параметра). Этот трюк может быть полезен при изменении файлов конфигурации словаря; ALTER принудит все существующие сеансы перечитать файлы конфигурации, что в противном случае они не сделают никогда, если прочитали конфигурацию ранее.

Совместимость

Команда ALTER TEXT SEARCH DICTIONARY отсутствует в стандарте SQL.

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

CREATE TEXT SEARCH DICTIONARY, DROP TEXT SEARCH DICTIONARY


ALTER TEXT SEARCH PARSER

ALTER TEXT SEARCH PARSER - изменить определение анализатора текстового поиска

Синтаксис

ALTER TEXT SEARCH PARSER имя RENAME TO новое_имя
ALTER TEXT SEARCH PARSER имя SET SCHEMA новая_схема

Описание

ALTER TEXT SEARCH PARSER изменяет определение анализатора текстового поиска. В настоящее время единственной поддерживаемой функциональностью является изменение имени анализатора текстового поиска.

Выполнить ALTER TEXT SEARCH PARSER может только суперпользователь.

Параметры

Имя

Имя, которое может быть дополнено схемой, существующего анализатора текстового поиска.

новое_имя

Новое имя анализатора текстового поиска.

новая_схема

Новая схема анализатора текстового поиска.

Совместимость

Команда ALTER TEXT SEARCH PARSER отсутствует в стандарте SQL.

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

CREATE TEXT SEARCH PARSER, DROP TEXT SEARCH PARSER


ALTER TEXT SEARCH TEMPLATE

ALTER TEXT SEARCH TEMPLATE - изменить определение шаблона текстового поиска

Синтаксис

ALTER TEXT SEARCH TEMPLATE имя RENAME TO новое_имя
ALTER TEXT SEARCH TEMPLATE имя SET SCHEMA новая_схема

Описание

ALTER TEXT SEARCH TEMPLATE изменяет определение шаблона текстового поиска. В настоящее время единственная поддерживаемая функциональность-это изменение имени шаблона.

Выполнить команду ALTER TEXT SEARCH TEMPLATE может только суперпользователь.

Параметры

Имя

Имя, которое может быть дополнено схемой, существующего шаблона текстового поиска.

новое_имя

Новое имя шаблона текстового поиска.

новая_схема

Новая схема для шаблона текстового поиска.

Совместимость

Команда ALTER TEXT SEARCH TEMPLATE отсутствует в стандарте SQL.

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

CREATE TEXT SEARCH TEMPLATE, DROP TEXT SEARCH TEMPLATE


ALTER TRIGGER

ALTER TRIGGER - изменить определение триггера

Синтаксис

ALTER TRIGGER имя ON имя_таблицы RENAME TO новое_имя
ALTER TRIGGER имя ON имя_таблицы DEPENDS ON EXTENSION имя_расширения

Описание

ALTER TRIGGER изменяет свойства существующего триггера. Форма RENAME изменяет имя данного триггера без изменения определения триггера. Форма DEPENDS ON EXTENSION помечает триггер как зависящий от расширения, таким образом, если расширение удаляется, триггер также будет автоматически удален.

Текущий пользователь должен быть владельцем таблицы, на которой работает триггер, чтобы иметь возможность изменять его свойства.

Параметры

Имя

Имя существующего триггера, свойства которого нужно изменить.

имя_таблицы

Имя таблицы, на которую действует этот триггер.

новое_имя

Новое имя для триггера.

имя_расширения

Имя расширения, от которого должен зависеть триггер.

Примечания

Возможность временного включения или отключения триггера предоставляется командой ALTER TABLE, а не ALTER TRIGGER, поскольку ALTER TRIGGER не имеет удобного способа выразить возможность включения или отключения всех триггеров таблицы одновременно.

Примеры

Переименование существующего триггера:

ALTER TRIGGER emp_stamp ON emp RENAME TO emp_track_chgs;

Обозначение триггера как зависимого от расширения:

ALTER TRIGGER emp_stamp ON emp DEPENDS ON EXTENSION emplib;

Совместимость

Команда ALTER TRIGGER является расширением QHB.

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

ALTER TABLE


ALTER TYPE

ALTER TYPE - изменить определение типа

Синтаксис

ALTER TYPE имя действие [, ... ]
ALTER TYPE имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER TYPE имя RENAME ATTRIBUTE имя_атрибута TO новое_имя_атрибута [ CASCADE | RESTRICT ]
ALTER TYPE имя RENAME TO новое_имя
ALTER TYPE имя SET SCHEMA новая_схема
ALTER TYPE имя ADD VALUE [ IF NOT EXISTS ] новое_значение_перечисления [ { BEFORE | AFTER } соседнее_значение_перечисления ]
ALTER TYPE имя RENAME VALUE существующее_значение_перечисления TO новое_значение_перечисления

Где действие может быть следующим:

    ADD ATTRIBUTE имя_атрибута тип_данных [ COLLATE правило_сортировки ] [ CASCADE | RESTRICT ]
    DROP ATTRIBUTE [ IF EXISTS ] имя_атрибута [ CASCADE | RESTRICT ]
    ALTER ATTRIBUTE имя_атрибута [ SET DATA ] TYPE тип_данных [ COLLATE правило_сортировки ] [ CASCADE | RESTRICT ]

Описание

ALTER TYPE изменяет определение существующего типа. Существует несколько форм этой команды:

ADD ATTRIBUTE

Эта форма добавляет новый атрибут к составному типу, используя тот же синтаксис, что и CREATE TYPE .

DROP ATTRIBUTE [ IF EXISTS ]

Эта форма удаляет атрибут из составного типа. Если указано IF EXISTS и атрибут не существует, это не считается ошибкой. В этом случае выдаётся только замечание

SET DATA TYPE

Эта форма изменяет тип атрибута составного типа.

OWNER

Эта форма изменяет владельца типа.

RENAME

Эта форма изменяет имя типа или имя отдельного атрибута составного типа.

SET SCHEMA

Эта форма перемещает тип в другую схему.

ADD VALUE [ IF NOT EXISTS ] [ BEFORE | AFTER ]

Эта форма добавляет новое значение в тип-перечисление. Порядок нового значения в перечислении можно указать как BEFORE или AFTER с одним из существующих значений. Без указания BEFORE или AFTER новый элемент добавляется в конец списка значений.

С указанием IF NOT EXISTS, если тип уже содержит новое значение, ошибки не произойдёт: будет выдано замечание и ничего больше. Без этого указания, если такое значение уже представлено, возникнет ошибка.

RENAME VALUE

Эта форма переименовывает значение в типе-перечислении. Позиция значения в порядке перечисления не изменяется. Если указанное значение отсутствует в типе-перечислении или новое имя уже присутствует, произойдет ошибка.

Указания ADD ATTRIBUTE, DROP ATTRIBUTE и ALTER ATTRIBUTE
можно объединить в один список множественных изменений, для одновременного выполнения. Например, можно добавить несколько атрибутов и/или изменить тип нескольких атрибутов в одной команде.

Выполнить команду ALTER TYPE может только владелец соответствующего типа. Чтобы изменить схему типа, необходимо иметь право CREATE в новой схеме. Для изменения владельца, текущий пользователь должен быть непосредственным или опосредованным членом новой роли, и эта роль должна иметь право CREATE в схеме типа. (Эти ограничения направлены на то, чтобы при смене владельца не происходило ничего, что нельзя было бы сделать, имея право удалить и снова создать тип. Однако суперпользователь может изменить владельца любого типа). Чтобы добавить атрибут или изменить тип атрибута, необходимо иметь право USAGE для соответствующего типа данных.

Параметры

Имя

Имя, которое может быть дополнено схемой, существующего типа, который нужно изменить.

новое_имя

Новое имя типа.

новый_владелец

Имя пользователя, который станет новым владельцем типа.

новая_схема

Новая схема типа.

имя атрибута

Имя атрибута, который нужно добавить, изменить или удалить.

новое_имя_атрибута

Новое имя атрибута.

тип_данных

Тип данных добавляемого атрибута, либо новый тип данных изменяемого атрибута.

новое_значение_перечисления

Новое значение, которое будет добавлено в список значений типа-перечисления, или новое имя, которое будет присвоено существующему значению. Как и все элементы перечисления, оно должно быть заключенным в кавычки.

соседнее_значение_перечисления

Существующие значение в перечислении, непосредственно перед или после которого по порядку перечисления будет добавлено новое значение. Как и все элементы перечисления, оно должно быть заключенным в кавычки.

существующее_значение_перечисления

Существующее значение в перечислении, которое должно быть переименовано. Как и все элементы перечисления, оно должно быть заключенным в кавычки.

CASCADE

Автоматически распространять операцию на типизированные таблицы изменяемого типа и их потомки.

RESTRICT

Запретить выполнение операции, если изменяемый тип является типом типизированной таблицы. Это поведение по умолчанию.

Примечания

Если ALTER TYPE ... ADD VALUE (форма, которая добавляет новое значение к типу-перечислению) выполняется внутри блока транзакций, новое значение не может быть использовано до тех пор, пока транзакция не будет зафиксирована.

Сравнение, включающее добавленное значение перечисления, иногда происходит медленнее, чем сравнение, включающее только исходные члены типа перечисления. Это, как правило, происходит только в том случае, если BEFORE или AFTER устанавливает порядок нового элемента не в конце списка. Однако, иногда это наблюдается даже тогда, когда новое значение добавляется в конец списка (это происходит, если счётчик OID «прокручивается» с момента изначального создания типа-перечисления). Замедление обычно незначительно; но если это имеет значение, оптимальная производительность может быть восстановлена путем удаления и повторного создания типа-перечисления, или путем выгрузки копии и загрузки базы данных.

Примеры

Переименование типа данных:

ALTER TYPE electronic_mail RENAME TO email;

Смена владельца типа email на joe:

ALTER TYPE email OWNER TO joe;

Смена схемы типа email на customers:

ALTER TYPE email SET SCHEMA customers;

Добавление в тип нового атрибута:

ALTER TYPE compfoo ADD ATTRIBUTE f3 int;

Добавление нового значения в тип-перечисление, в определённое положение по порядку:

ALTER TYPE colors ADD VALUE 'orange' AFTER 'red';

Переименование значения в перечислении:

ALTER TYPE colors RENAME VALUE 'purple' TO 'mauve';

Совместимость

Формы добавления и удаления атрибутов являются частью стандарта SQL; другие формы являются расширениями QHB.

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

CREATE TYPE, DROP TYPE


ALTER USER

ALTER USER - изменить роль в базе данных

Синтаксис

ALTER USER указание_роли [ WITH ] параметр [ ... ]

Где параметр может быть:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT предел_подключений
    | [ ENCRYPTED ] PASSWORD 'пароль' | PASSWORD NULL
    | VALID UNTIL 'дата_время'

ALTER USER имя RENAME TO новое_имя

ALTER USER { указание_роли | ALL } [ IN DATABASE имя_бд ] SET параметр_конфигурации { TO | = } { значение | DEFAULT }
ALTER USER { указание_роли | ALL } [ IN DATABASE имя_бд ] SET параметр_конфигурации FROM CURRENT
ALTER USER { указание_роли | ALL } [ IN DATABASE имя_бд ] RESET параметр_конфигурации
ALTER USER { указание_роли | ALL } [ IN DATABASE имя_бд ] RESET ALL

Где указание_роли может быть:

    имя_роли
  | CURRENT_USER
  | SESSION_USER

Описание

Команда ALTER USER теперь стала синонимом команды ALTER ROLE.

Совместимость

Команда ALTER USER является расширением QHB. В стандарте SQL определение пользователей считается зависимым от реализации.

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

ALTER ROLE


ALTER USER MAPPING

ALTER USER MAPPING - изменить определение сопоставления пользователей

Синтаксис

ALTER USER MAPPING FOR { имя_пользователя | USER | CURRENT_USER | SESSION_USER | PUBLIC }
    SERVER имя_сервера
    OPTIONS ( [ ADD | SET | DROP ] параметр ['значение'] [, ... ] )

Описание

ALTER USER MAPPING изменяет определение сопоставления пользователей.

Владелец стороннего сервера может изменять сопоставления любых пользователей для этого сервера. Кроме того, пользователь может изменить сопоставление для своего собственного имени пользователя, если у него есть право USAGE на сервере.

Параметры

имя_пользователя

Имя пользователя для сопоставления. Значения CURRENT_USER и USER соответствует имени текущего пользователя. PUBLIC используется для сопоставления всех настоящих и будущих имен пользователей в системе.

имя_сервера

Имя сервера, для которого меняется сопоставление пользователей.

OPTIONS ( [ ADD | SET | DROP ] параметр ['значение'] [, ... ] )

Эти формы меняют параметры сопоставления пользователей. Новые параметры переопределяют все ранее указанные параметры. ADD, SET и DROP указывают действие, которое необходимо выполнить. если операция не указана явно, предполагается ADD. Имена параметров должны быть уникальными; параметры также проверяются оберткой сторонних данных сервера.

Примеры

Изменение пароля в сопоставлении пользователя bob на сервере foo:

ALTER USER MAPPING FOR bob SERVER foo OPTIONS (SET password 'public');

Совместимость

ALTER USER MAPPING соответствует стандарту ISO / IEC 9075-9 (SQL/MED). Но существует небольшое синтаксическое различие: в стандарте ключевое слово FOR опускается. Так как и в CREATE USER MAPPING, и в DROP USER MAPPING слово FOR находится в аналогичных позициях, а IBM DB2 (ещё одна популярная реализация SQL/MED) требует его наличия и для ALTER USER MAPPING, QHB в этом аспекте отклоняется от стандарта ради согласованности и совместимости.

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

CREATE USER MAPPING, DROP USER MAPPING


ALTER VIEW

ALTER VIEW - изменить определение представления

Синтаксис

ALTER VIEW [ IF EXISTS ] имя ALTER [ COLUMN ] имя_столбца SET DEFAULT выражение
ALTER VIEW [ IF EXISTS ] имя ALTER [ COLUMN ] имя_столбца DROP DEFAULT
ALTER VIEW [ IF EXISTS ] имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER VIEW [ IF EXISTS ] имя RENAME TO новое_имя
ALTER VIEW [ IF EXISTS ] имя SET SCHEMA новая_схема
ALTER VIEW [ IF EXISTS ] имя SET ( имя_параметра_представления [= значение_параметра_представления] [, ... ] )
ALTER VIEW [ IF EXISTS ] имя RESET ( имя_параметра_представления [, ... ] )

Описание

ALTER VIEW изменяет различные дополнительные свойства представления. (Для изменения запроса, определяющего представление, используйте команду CREATE OR REPLACE VIEW).

Выполнить команду ALTER VIEW может только владелец соответствующего представления. Чтобы изменить схему представления, необходимо иметь право CREATE в новой схеме. Для изменения владельца, текущий пользователь должен быть непосредственным или опосредованным членом новой роли, и эта роль должна иметь право CREATE в схеме представления. (Эти ограничения направлены на то, чтобы при смене владельца не происходило ничего, что нельзя было бы сделать, имея право удалить и снова создать представление. Однако суперпользователь может изменить владельца любого представления).

Параметры

Имя

Имя, которое может быть дополнено схемой, существующего представления.

IF EXISTS

Не считать ошибкой, если представление не существует. В этом случае будет выдано замечание.

SET/DROP DEFAULT

Эти формы устанавливают или удаляют значение по умолчанию для столбца. Значение столбца представления по умолчанию подставляется в команды INSERT или UPDATE, вносящие данные в представление, перед применением любых правил или триггеров для представления. Таким образом, значение по умолчанию представления будут иметь приоритет над любыми значениями по умолчанию в нижележащих отношениях.

новый_владелец

Имя пользователя, который станет новым владельцем представления.

новое_имя

Новое имя представления.

новая_схема

Новая схема представления.

SET ( имя_параметра_представления [= значение_параметра_представления] [, ... ] ) RESET ( имя_параметра_представления [, ... ] )

Устанавливает или сбрасывает параметр представления. В настоящее время поддерживаются следующие параметры:

  • check_option (string)

    Изменяет параметр проверки представления. Допустимые значения: local (локальная) или cascaded (каскадная)

  • security_barrier (boolean)

    Изменяет свойство представления, включающее барьер безопасности. Значение должно быть логическим: true или false.

Примечания

По историческим причинам команду ALTER TABLE можно использовать с представлениями; но формы команды ALTER TABLE, которые разрешены для работы с представлениями, эквивалентны показанным выше.

Примеры

Переименование представления foo в bar:

ALTER VIEW foo RENAME TO bar;

Добавление значения столбца по умолчанию в изменяемое представление:

CREATE TABLE base_table (id int, ts timestamptz);
CREATE VIEW a_view AS SELECT * FROM base_table;
ALTER VIEW a_view ALTER COLUMN ts SET DEFAULT now();
INSERT INTO base_table(id) VALUES(1);  -- в ts окажется значение NULL
INSERT INTO a_view(id) VALUES(2);  -- в ts окажется текущее время

Совместимость

Команда ALTER VIEW реализованная в QHB является расширением стандарта SQL.

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

CREATE VIEW, DROP VIEW


ANALYZE

ANALYZE - сбор статистики о базе данных

Синтаксис

ANALYZE [ ( параметр [, ...] ) ] [ таблица_и_столбцы [, ...] ]
ANALYZE [ VERBOSE ] [ таблица_и_столбцы [, ...] ]

Где параметр может быть:

    VERBOSE [ логическое_значение ]
    SKIP_LOCKED [ логическое_значение ]

Где таблица_и_столбцы состоит из:

    имя_таблицы [ ( имя_столбца [, ...] ) ]

Описание

ANALYZE собирает статистическую информацию о содержании таблиц в базе данных и сохраняет результаты в системном каталоге pg_statistic. Впоследствии планировщик запросов использует эти статистические данные для определения наиболее эффективных планов выполнения запросов.

Без списка таблица_и_столбцы команда ANALYZE обрабатывает все таблицы и материализованные представления в текущей базе данных, на которые текущий пользователь имеет право на анализ. Со списком ANALYZE обрабатывает только те таблицы(ы), которые в нем указаны. Кроме того, можно указать список имен столбцов для таблицы, в этом случае собираются только статистические данные для этих столбцов.

Когда список заключается в скобки, параметры могут быть записаны в любом порядке.

Параметры

VERBOSE

Включает отображение сообщений о ходе выполнения.

SKIP_LOCKED

Указывает, что команда ANALYZE не должна ждать освобождения конфликтующих блокировок при начале работы над отношением: если отношение не может быть немедленно заблокировано без ожидания, отношение пропускается. Обратите внимание, что даже при использовании этого параметра ANALYZE может по-прежнему блокироваться при открытии индексов отношения или при получении выборки строк из партиций, потомков таблиц и некоторых типов сторонних таблиц. Кроме того, при обычном анализе обрабатываются все партиции указанных партиционированных таблиц, но эта опция заставит ANALYZE пропустить все партиции, при наличии конфликтующей блокировки.

логическое_значение

Указывает, должен ли выбранный параметр быть включен или выключен. Для включения параметра можно написать TRUE, ON или 1, а для отключения - FALSE, *OFF *или 0. По умолчанию предполагается значение TRUE.

имя_таблицы

Имя, которое может быть дополнено схемой, конкретной таблицы для анализа. Если этот параметр опущен, то анализируются все обычные таблицы, партиционированные таблицы и материализованные представления в текущей базе данных (но не сторонние таблицы). Если указанная таблица является партиционированной таблицей, то обновляется как статистика наследования партиционированной таблицы в целом, так и статистика отдельных партиций.

имя_столбца

Имя конкретного столбца для анализа. По умолчанию анализ проводится для всех столбцов.

Выводимая информация

При указании VERBOSE, ANALYZE выдает сообщения о ходе выполнения, отмечая, какая таблица в настоящее время обрабатывается. Также печатаются различные статистические данные о таблицах.

Примечания

Для анализа таблицы обычно необходимо быть владельцем таблицы или суперпользователем. Однако владельцам баз данных разрешается анализировать все таблицы в своих базах данных, за исключением общих каталогов. (Ограничение для общих каталогов означает, что действительно глобальную команду ANALYZE может выполнить только суперпользователь). ANALYZE пропустит все таблицы, на которые вызывающий пользователь не имеет разрешения на анализ.

Сторонние таблицы анализируются только при явном указании. Не все обертки сторонних данных поддерживают ANALYZE. Если обертки таблицы не поддерживает ANALYZE команда выводит предупреждение и ничего не делает.

В конфигурации QHB по умолчанию, процесс «автовакуум» (см. раздел Процесс «Автовакуум» ) заботится об автоматическом анализе таблиц, когда они впервые заполняются с данными, и периодически, по мере того, как они меняются. Если функция автоочистки отключена, рекомендуется запускать ANALYZE периодически или сразу после внесения существенных изменений в содержимое таблицы. Точная статистика поможет планировщику выбрать наиболее подходящий план запроса, и тем самым повысить скорость обработки запроса. Общая стратегия для баз данных, где данные в основном читаются, заключается в запуске VACUUM и ANALYZE раз в день во время наименьшей активности. (Этого будет недостаточно, если данные обновляются активно).

ANALYZE требуется только блокировка на чтение в целевой таблице, поэтому команда может выполняться параллельно с другими действиями в таблице.

Статистические данные, собранные методом ANALYZE, обычно включают список некоторых наиболее распространенных значений в каждом столбце и гистограмму, показывающую примерное распределение данных в каждом столбце. Один или оба этих элемента статистики могут быть опущены, если ANALYZE сочтет их неинтересными (например, в столбце с уникальным ключом нет общих значений) или если тип данных столбца не поддерживает соответствующие операторы. Более подробная информация о статистике приведена в главе Регулярные задачи обслуживания базы данных.

Для больших таблиц ANALYZE берет случайную выборку содержимого таблицы, а не рассматривает каждую строку. Это позволяет проанализировать за короткое время даже очень большие таблицы. Обратите внимание, однако, что статистические данные будут приблизительными и могут незначительно меняться при каждом запуске ANALYZE, даже если фактическое содержимое таблицы не изменилось. Это может привести к небольшим изменениям в оценках стоимости запросов, показанных EXPLAIN . В редких случаях этот недетерминизм приведет к изменению выбора планировщиком планов запросов после выполнения ANALYZE. Чтобы избежать этого, увеличьте объем статистики, собранной методом ANALYZE, как описано ниже.

Количеством статистики можно управлять, настраивая конфигурационную переменную default_statistics_target, или устанавливая ориентир статистики на уровне столбцов командой ALTER TABLE ... ALTER COLUMN ... SET STATISTICS (см. ALTER TABLE). Ориентир задает максимальное количество записей в списке наиболее распространенных значений и максимальное количество интервалов в гистограмме. Значение ориентира по умолчанию равно 100, но оно может быть скорректировано вверх или вниз, чтобы компенсировать точность оценок планировщика относительно времени, затраченного на ANALYZE, и объема занимаемого пространства в pg_statistic. В частности, установка значения ориентира статистики равным нулю отключает сбор статистических данных для этого столбца. Это может быть полезно сделать для столбцов, которые никогда не используются в предложениях WHERE, GROUP BY, или ORDER BY , так как планировщик не будет использовать статистику по таким столбцам.

Число строк таблицы, выбираемых для подготовки статистики, определяется наибольшим ориентиром статистики по всем анализируемым столбцам этой таблицы. Увеличение ориентира вызывает пропорциональное увеличение времени и пространства, необходимого для выполнения ANALYZE .

Один из показателей, оцениваемых методом ANALYZE, - это число различных значений, встречающихся в каждом столбце. Поскольку рассматривается только подмножество строк, эта оценка иногда может быть довольно неточной, даже с максимально возможным ориентиром статистики. Если эта неточность приводит к плохим планам запросов, более точное значение можно определить вручную, а затем задать его командой ALTER TABLE ... ALTER COLUMN ... SET (n_distinct = ...) (см. ALTER TABLE).

Если анализируемая таблица имеет один или несколько потомков(дочерних таблиц), ANALYZE будет собирать статистику дважды: один раз только по строкам родительской таблицы и второй раз по строкам родительской таблицы со всеми ее потомками. Этот второй набор статистических данных необходим при планировании запросов, проходящих через все дерево наследования. Процесс автовакуум, однако, при принятии решения о запуске автоматического анализа для этой таблицы, будет рассматривать операции вставки или обновления данных только в самой родительской таблице. Если эта таблица редко обновляется, наследуемая статистика не будет обновляться до тех пор, пока не будет вручную запущена ANALYZE.

Если какая-либо из дочерних таблиц является сторонней таблицей, их обертки сторонних данных не поддерживают ANALYZE, эти дочерние таблицы игнорируются при сборе статистики наследования.

Если анализируемая таблица пуста, ANALYZE не обновлять статистику для этой таблицы; Существующая статистика будет сохранена.

Совместимость

Команда ANALYZE отсутствует в стандарте SQL.

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

VACUUM, vacuumdb, Определение предела стоимости работы процесса vacuum, Процесс «Автовакуум»


BEGIN

BEGIN — начать блок транзакций

Синтаксис

BEGIN [ AUTONOMOUS ] [ WORK | TRANSACTION ] [ режим_транзакции [, ...] ]

Где режим_транзакции может быть следующим:

    ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
    READ WRITE | READ ONLY
    [ NOT ] DEFERRABLE

Описание

BEGIN инициирует блок транзакций, то есть все операторы после команды BEGIN будут выполняться в одной транзакции до тех пор, пока не будет дано явной команды COMMIT или ROLLBACK. По умолчанию (без BEGIN) QHB выполняет транзакции в режиме "autocommit", то есть каждый оператор выполняется в своей собственной транзакции, а фиксация неявно выполняется в конце оператора (если выполнение было успешным, в противном случае выполняется откат).

Операторы выполняются быстрее в блоке транзакций, потому что запуск/фиксация транзакций требует значительной активности процессора и диска. Выполнение нескольких операторов внутри транзакции позволяет обеспечить согласованность при внесении нескольких связанных изменений: другие сеансы не смогут увидеть промежуточные состояния, в которых были сделаны не все связанные обновления.

Если указан уровень изоляции, режим чтения / записи или отложенный режим, новая транзакция имеет те же характеристики, что и после выполнения SET TRANSACTION.

Параметры

WORK
TRANSACTION

Необязательные ключевые слова. Они не имеют никакого эффекта.

См. раздел SET TRANSACTION для получения информации о значении других параметров для данного оператора.

Примечания

START TRANSACTION имеет ту же функциональность, что и BEGIN .

Для завершения блока транзакций используйте COMMIT или ROLLBACK .

При попытке выполнить BEGIN внутри уже начатого блока транзакции будет выдано предупреждение, но на состояние транзакции это не повлияет. Для вложенных подтранзакций, используйте точки сохранения (см. SAVEPOINT ).

По соображениям обратной совместимости, запятые между последовательными transaction_modes может быть опущен.

Примеры

Начало блока транзакции:

BEGIN;

Совместимость

Команда BEGIN является расширением QHB. BEGIN равнозначна стандартной соответствующей SQL команде START TRANSACTION, справочная страница которой содержит дополнительную информацию о совместимости.

Значение DEFERRABLE параметра режим_транзакции является языковым расширением QHB.

По стечению обстоятельств ключевое слово BEGIN имеет другое значение во встраиваемом SQL. Поэтому рекомендуется при портировании приложений баз данных
внимательно сверять семантику транзакций.

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

COMMIT, ROLLBACK, START TRANSACTION, SAVEPOINT


CALL

CALL - вызвать процедуру

Синтаксис

CALL имя ( [ аргумент ] [, ...] )

Описание

CALL вызывает процедуру.

Если процедура имеет какие-либо выходные параметры, то будет возвращена результирующая строка, содержащая значения этих параметров.

Параметры

Имя

Имя, которое может быть дополнено схемой, процедуры.

аргумент

Входной аргумент для вызова процедуры. Смотрите раздел Запуск сервера базы данных для получения полной информации о синтаксисе вызова функций и процедур, включая использование именованных параметров.

Примечания

Чтобы вызывать процедуру, пользователь должен иметь право EXECUTE для неё.

Чтобы вызвать функцию (а не процедуру), используйте SELECT.

Если CALL выполняется в блоке транзакций, то вызываемая процедура не может выполнять операторы управления транзакциями. Инструкции управления транзакциями допускаются только в том случае, если CALL выполняется в собственной транзакции.

PL/pgSQL обрабатывает выходные параметры в командах вызова по-другому; см. раздел Вызов процедуры.

Примеры

CALL do_db_maintenance();

Совместимость

Команда CALL соответствует стандарту SQL.

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

CREATE PROCEDURE


CHECKPOINT

CHECKPOINT - произвести контрольную точку в журнале предзаписи

Синтаксис

CHECKPOINT

Описание

Контрольная точка — это момент в последовательности событий в журнале предзаписи, когда все файлы данных приводятся в актуальное состояние, соответствующее информации в журнале. Все файлы данных сохраняются на диск. Смотрите раздел Конфигурация WAL для получения более подробной информации о том, что происходит во время контрольной точки.

Команда CHECKPOINT приводит к принудительному выполнению контрольной точки в момент вызова, не дожидаясь периодической контрольной точки, запланированной системой (управляется настройками в разделе Checkpoints). Команда CHECKPOINT не предназначена для использования в обычном режиме работы.

Если команда CHECKPOINT будет выполнена во время восстановления, то вместо записи новой контрольной точки будет принудительно введена точка перезапуска (см. раздел Конфигурация WAL).

Выполнять CHECKPOINT могут только суперпользователи.

Совместимость

Команда CHECKPOINT является расширением языка QHB.


CLOSE

CLOSE - закрыть курсор

Синтаксис

CLOSE { имя | ALL }

Описание

CLOSE освобождает ресурсы, связанные с открытым курсором. После закрытия курсора никакие последующие операции на нем не допускаются. Курсор должен быть закрыт, когда он больше не нужен.

Каждый не удерживаемый открытый курсор неявно закрывается, когда транзакция завершается командами COMMIT или ROLLBACK. Удерживаемый курсор неявно закрывается, если транзакция, которая его создала, прерывается командой ROLLBACK. Если создаваемая транзакция успешно фиксируется, удерживаемый курсор остается открытым до вызова команды CLOSE или отключения клиента.

Параметры

Имя

Имя открытого курсора, который будет закрыт.

ALL

Закрыть все открытые курсоры.

Примечания

QHB не имеет явного оператора OPEN cursor; курсор считается открытым, когда он объявлен. Используйте инструкцию DECLARE для объявления курсора.

Вы можете просмотреть все доступные курсоры, запросив системное представление pg_cursors.

Если курсор закрывается после точки сохранения, которая позже откатывается назад, CLOSE не откатывается; то есть курсор остается закрытым.

Примеры

Следующая команда закрывает курсор liahona:

CLOSE liahona;

Совместимость

Команда CLOSE полностью соответствует стандарту SQL. Команда CLOSE ALL является расширением QHB.

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

DECLARE, FETCH, MOVE


CLUSTER

CLUSTER - кластеризовать таблицу согласно индексу

Синтаксис

CLUSTER [VERBOSE] имя_таблицы [ USING имя_индекса ]
CLUSTER [VERBOSE]

Описание

CLUSTER дает команду QHB кластеризировать таблицу, указанную в параметре имя_таблицы основываясь на индексе, указанном в имя_индекса. Индекс должен быть уже определен в таблице.

Когда таблица кластеризуется, она физически переупорядочивается на основе данных индекса. Кластеризация является одноразовой операцией: при последующем обновлении таблицы изменения не кластеризуются. То есть не предпринимается никаких попыток сохранить новые или обновленные строки в соответствии с их порядком индексирования. (Если такое желание возникает, можно периодически повторять кластеризацию, выполняя команду снова. Также, установка у таблицы параметра FILLFACTOR меньше 100%, может помочь в сохранении порядка кластеризации во время обновлений, так как обновленные строки будут помещаться на ту же страницу, если там доступно достаточно места).

Когда таблица кластеризуется, QHB запоминает, по какому индексу она была кластеризована. Форма CLUSTER имя_таблицы повторно кластеризует таблицу, используя тот же индекс, что и раньше. Для установки индекса, который будет использоваться для будущих операций кластеризации, или очистки предыдущего значения можно также применить команду CLUSTER или формы SET WITHOUT CLUSTER команды ALTER TABLE.

CLUSTER без какого-либо параметра повторно кластеризует все ранее кластеризованные таблицы в текущей базе данных, принадлежащей вызывающему пользователю, или все такие таблицы, если они вызываются суперпользователем. Эта форма CLUSTER не может быть выполнена внутри блока транзакций.

Если таблица кластеризуется, то запрашивается блокировка ACCESS EXCLUSIVE. Это препятствует выполнению любых других операции базы данных (как чтение, так и запись) над таблицей, пока CLUSTER не будет завершена.

Параметры

имя_таблицы

Имя, которое может быть дополнено схемой, таблицы.

имя_индекса

Имя индекса.

VERBOSE

Выводит отчёт о процессе кластеризации по мере обработки таблиц.

Примечания

В случаях, когда происходит обращение к случайным единичным строкам таблицы, фактический порядок данных в таблице не имеет значения. Тем не менее, если вы обычно обращаетесь к некоторым данным больше, чем к другим, и есть индекс, который группирует их вместе, вы выиграете от использования CLUSTER. Если вы запрашиваете диапазон индексированных значений из таблицы или одно индексированное значение, имеющее несколько соответствующих строк, CLUSTER может помочь, так как страница таблицы, найденная по индексу для первой искомой строки, скорее всего, будет содержать и все остальные искомые строки. Таким образом, кластеризация помогает оптимизировать обращения к диску и ускорить запросы.

CLUSTER может повторно отсортировать таблицу, используя либо сканирование по указанному индексу, либо (если индекс является b-деревом) последовательное сканирование с последующей сортировкой. Он будет пытаться выбрать метод, который будет быстрее, на основе плановых параметров затрат и доступной статистической информации.

При использовании сканирования индекса создается временная копия таблицы, содержащая данные таблицы в порядке следования индексов. Также создаются временные копии каждого индекса в таблице. Поэтому вам нужно свободное пространство на диске, по крайней мере равное сумме размера таблицы и размеров индекса.

Когда используется последовательное сканирование и сортировка, также создается временный файл сортировки, так что пиковое требование к временному пространству равно удвоенному размеру таблицы плюс размеры индекса. Этот метод часто работает быстрее, чем метод сканирования индекса, но если требование к дисковому пространству неприемлемо, вы можете отключить этот выбор, временно установив enable_sort в OFF.

Перед кластеризацией рекомендуется установить значение maintenance_work_mem достаточно большим (но не больше, чем объем ОЗУ, который можно выделить для операции CLUSTER).

Поскольку планировщик записывает статистику о порядке таблиц, рекомендуется выполнить ANALYZE для новой кластеризованной таблицы. В противном случае планировщик может сделать неверный выбор планов запросов.

Поскольку CLUSTER запоминает, какие индексы кластеризуются, можно кластеризировать таблицы, которые требуется кластеризировать вручную в первый раз, а затем настроить периодический сценарий обслуживания, который выполняет CLUSTER без каких-либо параметров, так что нужные таблицы периодически повторно кластеризуются.

Примеры

Кластеризация таблицы employees согласно её индексу employees_ind:

CLUSTER employees USING employees_ind;

Кластеризация таблицы employees согласно тому же индексу, что был использован ранее:

CLUSTER employees;

Кластеризация всех таблиц в базе данных, что были кластеризованы ранее:

CLUSTER;

Совместимость

Команда CLUSTER отсутствует в стандарте SQL.

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

clusterdb


COMMENT

COMMENT - задать или изменить комментарий объекта

Синтаксис

COMMENT ON
{
  ACCESS METHOD имя_объекта |
  AGGREGATE имя_агрегатной_функции ( сигнатура_агрегатной_функции ) |
  CAST (исходный_тип AS целевой_тип) |
  COLLATION имя_объекта |
  COLUMN имя_отношения.имя_столбца |
  CONSTRAINT имя_ограничения ON имя_таблицы |
  CONSTRAINT имя_ограничения ON DOMAIN имя_домена |
  CONVERSION имя_объекта |
  DATABASE имя_объекта |
  DOMAIN имя_объекта |
  EXTENSION имя_объекта |
  EVENT TRIGGER имя_объекта |
  FOREIGN DATA WRAPPER имя_объекта |
  FOREIGN TABLE имя_объекта |
  FUNCTION имя_функции [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ] |
  INDEX имя_объекта |
  LARGE OBJECT oid_большого_объекта |
  MATERIALIZED VIEW имя_объекта |
  OPERATOR имя_оператора (тип_слева, тип_справа) |
  OPERATOR CLASS имя_объекта USING индексный_метод |
  OPERATOR FAMILY имя_объекта USING индексный_метод |
  POLICY имя_политики ON имя_таблицы |
  [ PROCEDURAL ] LANGUAGE имя_объекта |
  PROCEDURE имя_процедуры [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ] |
  PUBLICATION имя_объекта |
  ROLE имя_объекта |
  ROUTINE имя_подпрограммы [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ] |
  RULE имя_правила ON имя_таблицы |
  SCHEMA имя_объекта |
  SEQUENCE имя_объекта |
  SERVER имя_объекта |
  STATISTICS имя_объекта |
  SUBSCRIPTION имя_объекта |
  TABLE имя_объекта |
  TABLESPACE имя_объекта |
  TEXT SEARCH CONFIGURATION имя_объекта |
  TEXT SEARCH DICTIONARY имя_объекта |
  TEXT SEARCH PARSER имя_объекта |
  TEXT SEARCH TEMPLATE имя_объекта |
  TRANSFORM FOR имя_типа LANGUAGE имя_языка |
  TRIGGER имя_триггера ON имя_таблицы |
  TYPE имя_объекта |
  VIEW имя_объекта
} IS 'текст'

Где сигнатура_агрегатной_функции:

* |
[ режим_аргумента ] [ имя_аргумента ] тип_аргумента [ , ... ] |
[ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [ , ... ] ] ORDER BY [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [ , ... ]

Описание

COMMENT хранит комментарий об объекте базы данных.

Для каждого объекта сохраняется только одна строка комментария, поэтому для изменения комментария введите новую команду комментария для того же объекта. Чтобы удалить комментарий, напишите NULL вместо текстовой строки. Комментарии автоматически удаляются, вместе с объектом.

Для большинства видов объектов только владелец объекта может установить комментарий. У ролей нет владельцев, поэтому команду COMMENT ON ROLE для ролей суперпользователей, могут выполнять только суперпользователи, а для обычных ролей — тем, кто имеет право CREATEROLE. Кроме того, методы доступа также не имеют владельцев; текущий пользователь должен быть суперпользователем, чтобы добавить комментарий для метода доступа. Конечно, суперпользователь может задавать комментарии любым объ.

Комментарии можно просматривать с помощью семейства команд qsql \D. Другие пользовательские интерфейсы для получения комментариев могут быть построены поверх тех же встроенных функций, которые использует qsql, а именно obj_description, col_description, и shobj_description (см. таблицу Comment Information Functions).

Параметры

имя_объекта
имя_отношения.имя_столбца
имя_агрегатной_функции
имя_ограничения
имя_функции
имя_оператора
имя_политики
имя_процедуры
имя_подпрограммы
имя_правила
имя_триггера

Имя объекта, для которого задаётся комментарий. Имена таблиц, агрегатных функций, правил сортировки, перекодировок, доменов, сторонних таблиц, функций, индексов, операторов, классов операторов, семейств операторов, процедур, подпрограмм, последовательностей, статистики, объектов текстового поиска, типов и представлений могут быть дополнены именем схемы. При комментировании колонки, имя_отношения должно ссылаться на таблицу, представление, составной тип или стороннюю таблицу.

имя_таблицы
имя_домена

При создании комментария к ограничению, триггеру, правилу или политике эти параметры задают имя таблицы или домена, в котором этот объект определен.

исходный_тип

Имя исходного типа данных для приведения.

целевой_тип

Имя целевого типа данных для приведения.

режим_аргумента

Режим аргумента функции, процедуры или агрегатной функции: IN, OUT, INOUT или VARIADIC. Если этот параметр опущен, значение по умолчанию равно IN. Обратите внимание, что COMMENT на самом деле не обращает никакого внимания OUT аргументы, так как только входные аргументы необходимы для определения идентичности функции. Так что достаточно перечислить IN, INOUT и VARIADIC аргументы.

имя_аргумента

Имя аргумента функции, процедуры или агрегатной функции. Обратите внимание, что COMMENT фактически не обращает никакого внимания на имена аргументов, так как только типы данных аргумента необходимы для определения идентичности функции.

тип_аргумента

Тип данных аргумента функции, процедуры или агрегатной функцииы.

oid_большого_объекта

OID большого объекта.

тип_слева
тип_справа

Тип (ы) данных аргументов оператора, который может быть дополнен именем схемы. В случае отсутствия аргумента оператора укажите вместо типа NONE.

PROCEDURAL

Это слово не несёт смысловой нагрузки.

имя_типа

Имя типа данных, для которого предназначена трансформация.

имя_языка

Название языка, для которого предназначена трансформация.

текст

Новый комментарий, написанный в виде строкового литерала; или NULL чтобы удалить комментарий.

Примечания

В настоящее время нет механизма безопасности для просмотра комментариев: любой пользователь, подключенный к базе данных, может просматривать все комментарии для объектов в этой базе данных. Для общих объектов, таких как базы данных, роли и табличные пространства, комментарии хранятся глобально, поэтому любой пользователь, подключенный к любой базе данных в кластере, может просматривать все комментарии для общих объектов. Поэтому не помещайте критически важную для безопасности информацию в комментарии.

Примеры

Добавление комментария для таблицы mytable:

COMMENT ON TABLE mytable IS 'Это моя таблица.';

Его удаление:

COMMENT ON TABLE mytable IS NULL;

Ещё несколько примеров:

COMMENT ON ACCESS METHOD rtree IS 'Метод доступа R-Tree';
COMMENT ON AGGREGATE my_aggregate (double precision) IS 'Вычисляет дисперсию выборки';
COMMENT ON CAST (text AS int4) IS 'Выполняет приведение строк к int4';
COMMENT ON COLLATION "fr_CA" IS 'Канадский французский';
COMMENT ON COLUMN my_table.my_column IS 'Порядковый номер сотрудника';
COMMENT ON CONVERSION my_conv IS 'Перекодировка в UTF8';
COMMENT ON CONSTRAINT bar_col_cons ON bar IS 'Ограничение столбца col';
COMMENT ON CONSTRAINT dom_col_constr ON DOMAIN dom IS 'Ограничение col для домена';
COMMENT ON DATABASE my_database IS 'База данных разработчиков';
COMMENT ON DOMAIN my_domain IS 'Домен почтового адреса';
COMMENT ON EXTENSION hstore IS 'Реализует тип данных hstore';
COMMENT ON FOREIGN DATA WRAPPER mywrapper IS 'Моя обертка сторонних данных';
COMMENT ON FOREIGN TABLE my_foreign_table IS 'Информация о сотрудниках в другой БД';
COMMENT ON FUNCTION my_function (timestamp) IS 'Возвращает число римскими цифрами';
COMMENT ON INDEX my_index IS 'Обеспечивает уникальность по коду сотрудника';
COMMENT ON LANGUAGE plpython IS 'Поддержка Python для хранимых процедур';
COMMENT ON LARGE OBJECT 346344 IS 'Документ планирования';
COMMENT ON MATERIALIZED VIEW my_matview IS 'Сводка истории заказов';
COMMENT ON OPERATOR ^ (text, text) IS 'Вычисляет пересечение двух текстов';
COMMENT ON OPERATOR - (NONE, integer) IS 'Унарный минус';
COMMENT ON OPERATOR CLASS int4ops USING btree IS 'Операторы для четырёхбайтовых целых (для B-деревьев)';
COMMENT ON OPERATOR FAMILY integer_ops USING btree IS 'Все целочисленные операторы (для B-деревьев)';
COMMENT ON POLICY my_policy ON mytable IS 'Фильтр строк по пользователям';
COMMENT ON PROCEDURE my_proc (integer, integer) IS 'Строит отчёт';
COMMENT ON ROLE my_role IS 'Административная группа для таблиц бухгалтерии';
COMMENT ON RULE my_rule ON my_table IS 'Протоколирует изменения в записях сотрудников';
COMMENT ON SCHEMA my_schema IS 'Данные отдела';
COMMENT ON SEQUENCE my_sequence IS 'Предназначена для генерации первичных ключей';
COMMENT ON SERVER myserver IS 'Мой сторонний сервер';
COMMENT ON STATISTICS my_statistics IS 'Улучшает оценку числа строк для планировщика';
COMMENT ON TABLE my_schema.my_table IS 'Данные сотрудников';
COMMENT ON TABLESPACE my_tablespace IS 'Табличное пространство для индексов';
COMMENT ON TEXT SEARCH CONFIGURATION my_config IS 'Фильтрация специальных слов';
COMMENT ON TEXT SEARCH DICTIONARY swedish IS 'Стеммер Snowball для шведского языка';
COMMENT ON TEXT SEARCH PARSER my_parser IS 'Разделяет текст на слова';
COMMENT ON TEXT SEARCH TEMPLATE snowball IS 'Стеммер Snowball';
COMMENT ON TRANSFORM FOR hstore LANGUAGE plpythonu IS 'Трансформирует данные из hstore в словарь языка Python';
COMMENT ON TRIGGER my_trigger ON my_table IS 'Обеспечивает ссылочную целостность';
COMMENT ON TYPE complex IS 'Тип данных комплексных чисел';
COMMENT ON VIEW my_view IS 'Представление расходов по отделам';

Совместимость

Команда COMMENT отсутствует в стандарте SQL.


COMMIT

COMMIT - зафиксировать текущую транзакцию

Синтаксис

COMMIT [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ]

Описание

COMMIT фиксирует текущую транзакцию. Все изменения, внесенные транзакцией, становятся видимыми для других и гарантированно сохранятся, если произойдет сбой.

Параметры

WORK
TRANSACTION

Необязательные ключевые слова. Они не оказывают никакого влияния.

AND CHAIN

Если указывается AND CHAIN, то новая транзакция немедленно запускается с теми же характеристиками транзакции (см. раздел SET TRANSACTION), что и только что завершенная. В противном случае новая транзакция не запускается.

Примечания

Используйте команду ROLLBACK для прерывания транзакции.

Выполнение COMMIT, когда он не находится внутри транзакции, не вызовет ошибку, будет выдано только предупреждающее сообщение. Однако COMMIT AND CHAIN вне транзакции вызовет ошибку.

Примеры

Следующая команда фиксирует текущую транзакцию и сохраняет все изменения:

COMMIT;

Совместимость

Команда COMMIT соответствует стандарту SQL. Форма COMMIT TRANSACTION является расширением QHB.

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

BEGIN, ROLLBACK


COMMIT PREPARED

COMMIT PREPARED - зафиксировать транзакцию, которая ранее была подготовлена для двухфазной фиксации

Синтаксис

COMMIT PREPARED id_транзакции

Описание

COMMIT PREPARED фиксирует транзакцию, находящуюся в подготовленном состоянии

Параметры

id_транзакции

Идентификатор транзакции, которая должна быть зафиксирована.

Примечания

Чтобы зафиксировать подготовленную транзакцию, текущий пользователь должен быть либо тем же пользователем, который выполнял транзакцию первоначально, либо суперпользователем. При этом не обязательно работать в том же сеансе, где выполнялась транзакция.

Эта команда не может быть выполнена внутри блока транзакций. Подготовленная транзакция фиксируется немедленно.

Все доступные в настоящее время подготовленные транзакции перечислены в системном представлении pg_prepared_xacts.

Примеры

Фиксация транзакции, имеющей идентификатор foobar:

COMMIT PREPARED 'foobar';

Совместимость

Команда COMMIT PREPARED является расширением QHB. Он предназначена для использования внешними системами управления транзакциями, некоторые из которых охвачены стандартами (например, X/Open XA), но SQL-сторона этих систем не стандартизирована.

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

PREPARE TRANSACTION, ROLLBACK PREPARED


COPY

COPY - копировать данные между файлом и таблицей

Синтаксис

COPY имя_таблицы [ ( имя_столбца [, ...] ) ]
    FROM { 'имя_файла' | PROGRAM 'команда' | STDIN }
    [ [ WITH ] ( параметр [, ...] ) ]
    [ WHERE условие ]

COPY { имя_таблицы [ ( имя_столбца [, ...] ) ] | ( запрос ) }
    TO { 'имя_файла' | PROGRAM 'команда' | STDOUT }
    [ [ WITH ] ( параметр [, ...] ) ]

Где параметр может быть:

    FORMAT имя_формата
    FREEZE [ boolean ]
    DELIMITER 'символ_разделитель'
    NULL 'маркер_NULL'
    HEADER [ boolean ]
    QUOTE 'символ_кавычек'
    ESCAPE 'символ_экранирования'
    FORCE_QUOTE { ( имя_столбца [, ...] ) | * }
    FORCE_NOT_NULL ( имя_столбца [, ...] )
    FORCE_NULL ( имя_столбца [, ...] )
    ENCODING 'имя_кодировки'

Описание

COPY перемещает данные между таблицами QHB и стандартными файлами файловой системы. COPY TO копирует содержимое таблицы в файл, а COPY FROM копирует данные из файла в таблицу (добавляя данные к тому, что уже находится в таблице). COPY TO может также копировать результаты запроса SELECT.

Если указан список столбцов, COPY будет копировать только данные из указанных столбцов в файл или из него. Если в таблице есть столбцы, которых нет в списке столбцов, функция COPY FROM вставит значения по умолчанию для этих столбцов.

COPY с именем файла указывает серверу QHB на прямое чтение или запись в файл. Файл должен быть доступен пользователю QHB (идентификатор пользователя, под которым работает сервер), а имя должно быть указано с точки зрения сервера. Когда указывается PROGRAM, сервер выполняет данную команду и считывает данные со стандартного вывода программы, либо записывает их на стандартный вход программы. Команда должна быть определена с точки зрения сервера и выполняться пользователем QHB. Когда указывается STDIN или STDOUT, данные передаются через соединение между клиентом и сервером.

Параметры

имя_таблицы

Имя, которое может быть дополнено схемой, существующей таблицы.

имя_столбца

Дополнительный список столбцов для копирования. Если список столбцов не указан, то будут скопированы все столбцы таблицы, кроме сгенерированных столбцов.

запрос

Команда SELECT, VALUES, INSERT, UPDATE или DELETE, результаты которой должны быть скопированы. Обратите внимание, что запрос заключается в круглые скобки.

Для запросов INSERT, UPDATE и DELETE должно задаваться предложение RETURNING, а целевое отношение не должно иметь ни условного правила, ни правила ALSO или правила INSTEAD, разворачивающегося в несколько операторов.

имя_файла

Путь к входному или выходному файлу. Путь входного файла может быть абсолютным или относительным путем, но путь выходного файла должен быть абсолютным путем. Пользователям Windows может потребоваться использовать формат E'' и продублировать каждую обратную черту в пути файла.

PROGRAM

Выполняемая команда. COPY FROM читает стандартный вывод команды, а COPY TO записывает в её стандартный ввод

Обратите внимание, что команда вызывается оболочкой, поэтому если вам нужно передать какие-либо аргументы команде оболочки, которые поступают из ненадежного источника, вы должны быть осторожны, и удалить или экранировать любые специальные символы, которые могут иметь особое значение для оболочки. По соображениям безопасности лучше всего использовать фиксированную командную строку или, по крайней мере, избегать передачи в нее любого пользовательского ввода.

STDIN

Указывает, что входные данные поступают из клиентского приложения.

STDOUT

Указывает, что выходные данные передаются в клиентское приложение.

boolean

Указывает, должен ли выбранный параметр быть включен или выключен. Для включения параметра можно написать TRUE, ON или 1, а для отключения — FALSE, OFF или 0. Значение boolean можно опустить, в этом случае подразумевается TRUE.

FORMAT

Выбор формата данных для чтения или записи: text (текстовый), csv (значения, разделённые запятыми, Comma Separated Values) или binary (двоичный). Значение по умолчанию: text.

FREEZE

Запрашивает копирование данных с уже замороженными строками, как это было бы после выполнения команды VACUUM FREEZE. Это позволяет увеличить производительность для начальной загрузки данных. Строки будут заморожены только в том случае, если загружаемая таблица была создана или очищена в текущей подтранзакции, нет открытых курсоров и нет старых снимков, удерживаемых этой транзакцией. В настоящее время невозможно выполнить COPY FREEZE для партиционированной таблицы.

Обратите внимание, что все остальные сеансы сразу же смогут увидеть данные, как только они будут успешно загружены. Это нарушает обычные правила видимости MVCC, и пользователи, включающие этот режим, должны понимать, какие проблемы это может вызвать.

DELIMITER

Указывает символ, который разделяет столбцы в каждой строке (строке) файла. По умолчанию используется символ табуляции в текстовом формате, запятая внутри CSV формата. Это должен быть один однобайтовый символ. Для формата binary этот параметр не допускается.

NULL

Задает строку, представляющую собой нулевое значение. Значение по умолчанию: в текстовом формате \N (обратная косая черта и N) и пустая строка без кавычек в CSV формате. Вы можете использовать пустую строку и текстовом формате в тех случаях, когда вы не хотите различать значения null и пустые строки. Для формата binary этот параметр не допускается.

Замечание
При использовании COPY FROM любой элемент данных, соответствующий этой строке, будет сохранен как нулевое NULL значение, поэтому следует убедиться, что вы используете ту же строку, что и в COPY TO.

HEADER

Указывает, что файл содержит строку заголовка с именами каждого столбца в файле. На выходе первая строка содержит имена столбцов из таблицы, а на входе первая строка игнорируется. Эта опция разрешена только при использовании CSV формата.

QUOTE

Задает символ кавычки, который будет использоваться при вводе значения данных в кавычки. По умолчанию используется двойная кавычка. Это должен быть один однобайтовый символ. Эта опция разрешена только при использовании CSV формата.

ESCAPE

Указывает символ, который должен отображаться перед символом данных, соответствующим QUOTE. Значение по умолчанию совпадает с QUOTE (так что символ кавычки удваивается, если он появляется в данных). Это должен быть один однобайтовый символ. Эта опция разрешена только при использовании CSV формата.

FORCE_QUOTE

Принудительно заключает в кавычки все значения не NULL в указанных столбцах. Выводимое значение NULL никогда не заключается в кавычки. Если указана *, не NULL значения будут заключены в кавычки во всех столбцах. Эта опция разрешена только в COPY TO, и только при использовании CSV формата.

FORCE_NOT_NULL

Не сопоставлять значения указанных столбцов с маркером NULL. По умолчанию, когда маркер пуст, это означает, что пустые значения будут считываться как строки нулевой длины, а не пустые значения NULL, даже если они не заключены в кавычки. Эта опция разрешена только в COPY FROM, и только при использовании CSV формата.

FORCE_NULL

Сопоставить значения указанных столбцов с маркером NULL, даже если она была заключена в кавычки, и в случае совпадения устанавливать значение NULL. По умолчанию, когда маркер пуст, пустая строка в кавычках будет преобразовываться в NULL. Эта опция разрешена только в COPY FROM, и только при использовании CSV формата.

ENCODING

Указывает, что файл имеет кодировку имя_кодировки. Если этот параметр опущен, используется текущая клиентская кодировка. Смотрите Примечания ниже для получения более подробной информации.

WHERE

Необязательный параметр WHERE предложение имеет общую форму

WHERE условие

где *условие * любое выражение, возвращающее результат типа boolean. Любая строка, которая не удовлетворяет этому условию, не будет вставлена в таблицу. Строка удовлетворяет условию, если она возвращает true, при подстановке вместо ссылок на переменные фактических значений из этой строки.

В настоящее время выражения WHERE не могут включать подзапросы, а при вычислении выражений не видны изменения, которые вносит сама команда COPY (это имеет значение, когда в них вызываются функции с характеристикой VOLATILE).

Выводимая информация

После успешного завершения команда COPY возвращает метку команды в виде

COPY число

Где число — количество скопированных записей.

Замечание
qsql будет печатать эту метку команды только в том случае, если выполнялась не команда COPY ... TO STDOUT, или её аналог в qsql, метакоманда \copy ... to stdout. Это сделано для того, чтобы метка команды не смешалась с данными, выведенными перед ней.

Примечания

COPY TO можно использовать только с простыми таблицами, но не с представлениями. Тем не менее, вы можете написать COPY (SELECT * FROM имя_представления) TO ....

COPY FROM может использоваться с простыми, сторонними, партиционированными таблицами или с представлениями, в которых установлены триггеры INSTEAD OF INSERT.

COPY обрабатывает только явно заданную таблицу; не копируются данные в дочерние таблицы или из дочерних таблиц. Так например: COPY таблица TO выводит те же данные, что и запрос SELECT * FROM ONLY table. Для выгрузки всех данных в иерархии наследования можно применить COPY (SELECT * FROM table) TO ....

У вас должно быть право select для таблицы, значения которой считываются COPY TO, и право insert для таблицы, в которую значения вставляются COPY FROM. При этом, если в команде перечисляются избранные столбцы, достаточно иметь права только для них.

Если для таблицы включена защита на уровне строк, то соответствующие политики SELECT будут применяться и к операторам COPY таблица TO. В настоящее время * COPY FROM* не поддерживается для таблиц с защитой на уровне строк. Вместо этого используйте эквивалентные инструкции INSERT.

Файлы, названные в команде COPY, считываются или записываются непосредственно сервером, а не клиентским приложением. Поэтому они должны располагаться на сервере или быть доступными серверу, а не клиенту. Они должны быть доступны на чтение или запись пользователю QHB (идентификатор пользователя, под которым работает сервер), а не клиенту. Аналогично, команда, указанная параметром PROGRAM выполняется непосредственно сервером, а не клиентским приложением, и должна быть доступна на выполнение пользователю QHB. Выполнять COPY с указанием файла или внешней команды разрешено только суперпользователям базы данных или членам встроенных ролей pg_read_server_files, pg_write_server_files или pg_execute_server_program, так как это позволяет читать/записывать любые файлы и запускать любые программы, к которым имеет доступ сервер.

Не путайте COPY с инструкцией qsql [\copy] . Метакоманда \copy вызывает функцию COPY FROM STDIN или COPY TO STDOUT, а затем извлекает/сохраняет данные в файле, доступном клиенту qsql. Таким образом, доступность файла и права доступа зависят от клиента, а не от сервера.

Рекомендуется, чтобы имя файла, используемое в COPY, всегда указывалось в качестве абсолютного пути. Это обязательное условие для команды COPY TO, но для COPY FROM есть возможность чтения из файла, указанного относительным путем. Путь будет интерпретирован относительно рабочего каталога серверного процесса (обычно это каталог данных кластера), а не рабочего каталога клиента.

Выполнение команды с помощью PROGRAM может быть ограничено механизмами контроля доступа операционной системы, такими как SELinux.

COPY FROM вызовет все триггеры и проверочные ограничения для целевой таблицы. Однако правила при загрузке данных не вызываются.

Для столбцов идентификации команда COPY FROM всегда будет записывать значения столбцов, указанные во входных данных, как команда INSERT с указанием OVERRIDING SYSTEM VALUE.

При вводе и выводе данных COPY учитывается DateStyle. Чтобы обеспечить переносимость на другие установки QHB, которые могут использовать нестандартные установки DateStyle, значение DateStyle следует установить равным ISO до вызова COPY TO. Также рекомендуется не выгружать данные с IntervalStyle равным sql_standard, так как сервер с другим значением IntervalStyle, может неправильно воспринимать отрицательные интервалы в таких данных.

Входные данные интерпретируются в соответствии с кодировкой заданной параметром ENCODING или текущей клиентской кодировкой, а выходные данные кодируются в кодировке ENCODING или текущую клиентскую кодировку, даже если данные не проходят через клиент, а считываются или записываются в файл непосредственно сервером.

COPY останавливает работу при первой ошибке. Это не должно приводить к проблемам в случае COPY TO , но после COPY FROM в целевой таблице остаются ранее полученные строки. Эти строки не будут видны или доступны, но они по-прежнему будут занимать место на диске. Если сбой происходит при копировании большого объёма данных, это может приводить к значительным потерям дискового пространства. С помощью команды VACUUM, можно восстановить потерянное пространство.

FORCE_NULL и FORCE_NOT_NULL может применяться одновременно к той же колонке. В результате NULL-значения в кавычках будут преобразованы в NULL, а NULL-значения без кавычек — в пустые строки.

Форматы файлов

Текстовый формат

Когда используется текстовый формат, данные читаются или записываются в виде текстового файла, строка в котором соответствует строке таблицы. Столбцы в строке разделяются символом-разделителем. Значения самих столбцов - текстовые строки, выдаваемые функцией вывода, либо воспринимаемые функцией ввода, соответствующей типу данных столбца. Заданный маркер NULL используется вместо столбцов, со значением NULL. COPY FROM выдает ошибку, если какая-либо строка входного файла содержит больше или меньше столбцов, чем ожидалось.

Конец данных может быть обозначен одной строкой, содержащей только обратную косую черту и точку (\.). Маркер конца данных не является необходимым при чтении из файла, так как его роль вполне выполняет конец файла; он необходим только при копировании данных в клиентские приложения или из клиентских приложений, использующих протокол pre-3.0 client.

Символы обратной косой черты (\) в данных COPY позволяют экранировать символы данных, которые в противном случае могут быть приняты в качестве разделителей строк или столбцов. В частности, следующие символы должны предваряться обратной косой чертой, если они появляются как часть значения столбца: сама обратная косая черта, новая строка, возврат каретки и текущий символ разделителя.

Маркер NULL передаётся команде COPY TO без добавления обратной косой черты; и наоборот, COPY FROM ищет во вводимых данных маркеры NULL до удаления обратных косых. Таким образом, маркер NULL, например такой как \N, отличается от значения \N в данных (оно должно представляться в виде \N).

COPY FROM распознает следующие специальные последовательности:

ПоследовательностьПредставляет
\bBackspace (ASCII 8)
\fПодача формы (ASCII 12))
\nНовая строка (ASCII 10)
\rВозврат каретки (ASCII 13)
\tТабуляция (ASCII 9)
\vВертикальная табуляция (ASCII 11)
\цифрыОбратная косая с последующими 1-3 восьмеричными цифрами представляет символ с заданным числовым кодом
\xцифрыОбратная косая с последующим x и 1-2 шестнадцатеричными цифрами представляет символ с заданным числовым кодом

В настоящее время COPY TO никогда не будет выдавать спецпоследовательности с восьмеричными или шестнадцатеричными кодами, однако использует другие последовательности, перечисленные выше для этих управляющих символов.

Любой другой символ после обратной косой черты, который не упоминается в приведенной выше таблице, будет принят для представления самого себя. Однако остерегайтесь добавлять обратные косые черты без необходимости, так как это может случайно привести к появлению строки, соответствующей маркеру конца данных (\.) или маркер NULL (\N по умолчанию) Эти строки будут восприняты прежде, чем обработаются спецпоследовательности с обратной косой.

Настоятельно рекомендуется, чтобы приложения, генерирующие данные для COPY, преобразовывали символы новые строки и возврата каретки в в последовательности \n и \r, соответственно. В настоящее время можно представить возврат каретки в данных обратной косой чертой + возврат каретки, а также представить новую строку обратной косой чертой + новая строка. Однако эти представления могут быть не приняты в будущих выпусках. Такие символы также подвержены искажениям, если файл с выводом COPY переносится между разными системами (например, с Unix в Windows и наоборот).

COPY TO завершает каждую строку символом новой строки в стиле Unix (\n»). Серверы, работающие на Microsoft Windows вместо этого выводят символы возврат каретки/новая строка (\r\n), но только при выводе COPY в файл на сервере; для обеспечения согласованности между платформами, COPY TO STDOUT всегда передаёт \n независимо от платформы сервера. COPY FROM может обрабатывать строки, заканчивающиеся новой строкой, возвратом каретки или возвратом каретки + новая строка. Чтобы уменьшить риск ошибки из-за отсутствия обратной косой черты перед символами новой строки и возврата каретки, которые были которые должны были быть данными, COPY FROM сигнализирует о проблеме, если концы строк во входных данных различаются.

Формат CSV

Этот формат используется для импорта и экспорта данных, разделенных запятой (CSV), который используется многими другими программами, такими как электронные таблицы. Вместо правил экранирования, используемых текстовым форматом QHB, этот формат создает и распознает общий механизм экранирования CSV.

Значения в каждой записи разделяются символом DELIMITER. Если значение содержит символ разделителя, символ QUOTE, маркер NULL, символ возврата каретки или перевода строки, то всё значение будет дополнено спереди и сзади символами QUOTE, а любое вхождение символа QUOTE или спецсимвола (ESCAPE) в данных предваряется спецсимволом. Вы также можете использовать FORCE_QUOTE для того чтобы принудительно заключать любые значения не NULL в указанных столбцах в кавычки.

В формате CSV отсутствует стандартный способ отличить значение NULL от пустой строки. В QHB команда COPY решает это с помощью кавычек. Значение NULL выводится в виде строки, задаваемой параметром NULL, и не заключается в кавычки, тогда как значение не NULL, со строкой, задаваемой параметром NULL, заключается. Например, с настройками по умолчанию NULL записывается в виде пустой строки без кавычек, в то время как пустое строковое значение данных записывается с двойными кавычками (""). Чтение значений следует аналогичным правилам. Указание FORCE_NOT_NULL позволяет избежать сравнений с NULL во входных данных в заданных столбцах, а FORCE_NULL — преобразовывать в NULL маркеры NULL, даже заключённые в кавычки.

Так как обратная косая черта не является специальным символом в CSV формате, маркер конца данных \., также может быть значением данных. Чтобы избежать любого неправильного толкования, данные \., отображаемое как одиночная запись в строке, автоматически заключаются в кавычки при выводе, а при вводе, этот маркер, заключённый в кавычки, не интерпретируется как маркер конца данных. Если вы загружаете файл, созданный другим приложением, который имеет один столбец без кавычек и может иметь значение \., потребуется дополнительно заключить это значение в кавычки.

Замечание
В CSV формате, все символы являются значимыми. Заключенное в кавычки значение, дополненное пробелами, или любыми другими символами, кроме DELIMITER, будет включать в себя эти символы. Это может привести к ошибкам при импорте данных из системы, дополняющей строки CSV пробельными символами до некоторой фиксированной ширины. В случае возникновения такой ситуации вам может потребоваться предварительная обработка CSV файла для удаления конечного пробела, прежде чем импортировать данные в QHB.

Замечание
Обработчик формата CSV воспринимает и генерирует файлы CSV со значениями в кавычках, которые могут содержать символы возврата каретки и перевода строки. Таким образом, число строк в этих файлах не строго равно числу строк в таблице, как в файлах текстового формата.

Замечание
Многие программы создают странные и иногда неприемлемые CSV-файлы, поэтому формат файла является скорее условным, чем стандартным. Таким образом, вы можете столкнуться с некоторыми файлами, которые не могут быть импортированы с помощью этого механизма, и COPY также может создавать файлы, которые другие программы не могут обрабатывать.

Двоичный формат

При выборе формата binary все данные сохраняются/считываются в двоичном, а не текстовом виде. Этот формат может обрабатываться несколько быстрее, чем текст и CSV форматы, но файл двоичного формата менее переносим в разных машинных архитектурах и версиях QHB. Кроме того, двоичный формат очень зависит для типа данных; например, он не позволит вывести данные из столбца smallint а затем прочитать их в столбец integer, хотя с текстовым форматом это вполне возможно..

Формат binary состоит из заголовка файла, ноль или более записей, содержащих данные строк, и окончание файла. Для заголовков и данных принят сетевой порядок байт.

Заголовок файла

Заголовок файла состоит из 15 байт фиксированных полей, за которыми следует область расширения заголовка переменной длины. Фиксированные поля:

Сигнатура

11-байтовая последовательность PGCOPY\n \ 377\r\n\0 - обратите внимание, что нулевой байт является обязательной частью сигнатуры. (Сигнатура предназначена для облегчения идентификации файлов,которые были испорчены при передаче, не сохраняющей все 8 бит данных. Она изменится при прохождении через фильтры, меняющие концы строк, отбрасывающие нулевые байты или старшие биты, либо добавляющие чётность).

Поле флагов

32-разрядная целочисленная битовая маска для обозначения важных аспектов формата файла. Биты нумеруются от 0 (LSB) до 31 (MSB). Обратите внимание, что это поле хранится в сетевом порядке байтов (наиболее значащий байт первый), как и все целочисленные поля, используемые в формате. Биты 16-31 зарезервированы, чтобы обозначить критичные проблемы формата; обработчик должен прервать чтение, встретив любой неожиданный бит в этом диапазоне. Биты 0-15 зарезервированы, чтобы сигнализировать о проблемах формата обратной совместимости; обработчик может просто игнорировать любые неожиданные биты в этом диапазоне. В настоящее время определен только один битовый флаг, остальные должны быть равны 0:

  • Бит 16

Если 1, то данные включаются в OID; если 0, то нет. Системные столбцы Oid больше не поддерживаются в QHB, но формат все еще содержит этот индикатор.

Длина области расширения заголовка

32-разрядное целое число, длина в байтах остатка заголовка, не включая само это значение. В настоящее время содержит 0, и сразу за ним следует первая запись. Будущие изменения формата могут привести к появлению дополнительных данных в заголовке. Обработчик должен просто пропустить все данные расширения заголовка, с которыми он не знает, что делать.

Предполагается, что область расширения заголовка будет содержать последовательность самоидентифицирующихся фрагментов. Поле флагов не должно содержать указаний о том, что содержится в области расширения. Точное содержимое области расширения может быть определено в будущих версиях.

Эта конструкция позволяет выполнять как обратно-совместимые добавления заголовков (добавлять блоки расширения заголовков или установить младшие биты флагов), так и не обратно-совместимые изменения (устанавливать старшие биты флагов, чтобы сигнализировать о таких изменениях, и при необходимости добавлять вспомогательные данные в область расширения).

Записи

Каждая запись начинается с 16-разрядного целого числа количества полей в записи. (В настоящее время все записи в таблице должны иметь одинаковое количество полей, но это может быть не всегда верно). Затем, для каждого поля в записи указывается 32-битная длина поля, за которой следует это количество байт с данными поля. (Значение длины не включает свой размер, и может быть равно нулю). В качестве особого варианта, -1 обозначает, что в поле содержится NULL. В случае с NULL за длиной не следуют байты данных.

Между полями нет выравнивания или каких-либо других дополнительных данных.

В настоящее время все значения данных в файле двоичного формата содержаться в двоичном формате (формате под кодом 1). Предполагается, в будущем расширении в заголовок будет добавлено поле, позволяющее задавать другие коды форматов для разных столбцов.

Чтобы определить подходящий двоичный формат для фактических данных, обратитесь к исходному коду QHB, в частности, к функциям send и recv для типов данных каждого столбца (обычно эти функции находятся в каталоге src/backend/utils/adt/ в дереве исходного кода).

Если в файл включается OID, поле OID следует немедленно за числом, определяющим количество полей. Это обычное поле, за исключением того, что оно не учитывается в количестве полей. Обратите внимание, что системные столбцы oid не поддерживаются в текущих версиях QHB.

Окончание файла

Трейлер файла состоит из 16-разрядного целого слова, содержащего -1. Это позволяет легко отличить его от счётчика полей в записи.

Обработчик, читающий файл, должен выдать ошибку, если число полей в записи не равно -1 или ожидаемому числу столбцов. Это обеспечивает дополнительную проверку синхронизации данных.

Примеры

В следующем примере таблица передаётся клиенту с разделителем полей «вертикальная черта» (|):

COPY country TO STDOUT (DELIMITER '|');

Копирование данных из файла в таблицу country:

COPY country FROM '/usr1/proj/bray/sql/country_data';

Копирование в файл только данных стран, название которых начинается с 'A':

COPY (SELECT * FROM country WHERE country_name LIKE 'A%') TO '/usr1/proj/bray/sql/a_list_countries.copy';

Для копирования данных в сжатый файл можно направить вывод через внешнюю программу сжатия:

COPY country TO PROGRAM 'gzip > /usr1/proj/bray/sql/country_data.gz';

Пример данных, подходящих для копирования в таблицу из STDIN:

AF      AFGHANISTAN  
AL      ALBANIA  
DZ      ALGERIA  
ZM      ZAMBIA  
ZW      ZIMBABWE  

Обратите внимание, что пробел в каждой строке фактически является символом табуляции.

Ниже приведены те же данные, но выведенные в двоичном формате. Данные показаны после обработки Unix-утилитой od -c. Таблица содержит три столбца; первый имеет тип char(2), второй - text, а третий - integer. Последний столбец во всех строках содержит NULL.

0000000   P   G   C   O   P   Y  \n 377  \r  \n  \0  \0  \0  \0  \0  \0
0000020  \0  \0  \0  \0 003  \0  \0  \0 002   A   F  \0  \0  \0 013   A
0000040   F   G   H   A   N   I   S   T   A   N 377 377 377 377  \0 003
0000060  \0  \0  \0 002   A   L  \0  \0  \0 007   A   L   B   A   N   I
0000100   A 377 377 377 377  \0 003  \0  \0  \0 002   D   Z  \0  \0  \0
0000120 007   A   L   G   E   R   I   A 377 377 377 377  \0 003  \0  \0
0000140  \0 002   Z   M  \0  \0  \0 006   Z   A   M   B   I   A 377 377
0000160 377 377  \0 003  \0  \0  \0 002   Z   W  \0  \0  \0  \b   Z   I
0000200   M   B   A   B   W   E 377 377 377 377 377 377

Совместимость

Команда COPY отсутствует в стандарте SQL.


CREATE ACCESS METHOD

CREATE ACCESS METHOD - создать новый метод доступа

Синтаксис

CREATE ACCESS METHOD имя
    TYPE тип_метода_доступа
    HANDLER функция_обработчик

Описание

CREATE ACCESS METHOD создает новый метод доступа.

Имя метода доступа должно быть уникальным в базе данных.

Только суперпользователи могут определять новые методы доступа.

Параметры

имя

Имя создаваемого метода доступа.

тип_метода_доступа

В этом предложении указывается тип определяемого метода доступа. В настоящее время поддерживается только TABLE и INDEX.

функция_обработчик

В аргументе функция_обработчик указывается Имя, которое может быть дополнено схемой, ранее зарегистрированной функции, представляющей метод доступа. Функция обработчик должна принимать один аргумент типа internal, а тип результата зависит от типа метода доступа; для методов доступа типа TABLE это должен быть table_am_handler, а для INDEX - index_am_handler. Также от типа метода доступа зависит API уровня C, который должна реализовывать эта функция-обработчик. API табличных методов доступа описаны в главе Определение интерфейса метода доступа к таблице, а индексных — в главе Определение интерфейса метода доступа индекса

Примеры

Создание метода доступа индекса heptree с функцией-обработчиком heptree_handler:

CREATE ACCESS METHOD heptree TYPE INDEX HANDLER heptree_handler;

Совместимость

Команда CREATE ACCESS METHOD является расширением QHB.

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

DROP ACCESS METHOD, CREATE OPERATOR CLASS, CREATE OPERATOR FAMILY


CREATE AGGREGATE

CREATE AGGREGATE - создать агрегатную функцию

Синтаксис

CREATE [ OR REPLACE ] AGGREGATE имя ( [ режим_аргумента ] [ имя_аргумента ] тип_данных_аргумента [ , ... ] ) (
    SFUNC = функция_состояния,
    STYPE = тип_данных_состояния
    [ , SSPACE = размер_данных_состояния ]
    [ , FINALFUNC = функция_завершения ]
    [ , FINALFUNC_EXTRA ]
    [ , FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
    [ , COMBINEFUNC = комбинирующая_функция ]
    [ , SERIALFUNC = функция_сериализации ]
    [ , DESERIALFUNC = функция_десериализации ]
    [ , INITCOND = начальное_условие ]
    [ , MSFUNC = функция_состояния_движ ]
    [ , MINVFUNC = обратная_функция_движ ]
    [ , MSTYPE = тип_данных_состояния_движ ]
    [ , MSSPACE = размер_данных_состояния_движ ]
    [ , MFINALFUNC = функция_завершения_движ ]
    [ , MFINALFUNC_EXTRA ]
    [ , MFINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
    [ , MINITCOND = начальное_условие_движ ]
    [ , SORTOP = оператор_сортировки ]
    [ , PARALLEL = { SAFE | RESTRICTED | UNSAFE } ]
)

CREATE [ OR REPLACE ] AGGREGATE имя ( [ [ режим_аргумента ] [ имя_аргумента ] тип_данных_аргумента [ , ... ] ]
                        ORDER BY [ режим_аргумента ] [ имя_аргумента ] тип_данных_аргумента [ , ... ] ) (
    SFUNC = функция_состояния,
    STYPE = тип_данных_состояния
    [ , SSPACE = размер_данных_состояния ]
    [ , FINALFUNC = функция_завершения ]
    [ , FINALFUNC_EXTRA ]
    [ , FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
    [ , INITCOND = начальное_условие ]
    [ , PARALLEL = { SAFE | RESTRICTED | UNSAFE } ]
    [ , HYPOTHETICAL ]
)

или старый синтаксис

CREATE [ OR REPLACE ] AGGREGATE имя (
    BASETYPE = базовый_тип,
    SFUNC = функция_состояния,
    STYPE = тип_данных_состояния
    [ , SSPACE = размер_данных_состояния ]
    [ , FINALFUNC = функция_завершения ]
    [ , FINALFUNC_EXTRA ]
    [ , FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
    [ , COMBINEFUNC = комбинирующая_функция ]
    [ , SERIALFUNC = функция_сериализации ]
    [ , DESERIALFUNC = функция_десериализации ]
    [ , INITCOND = начальное_условие ]
    [ , MSFUNC = функция_состояния_движ ]
    [ , MINVFUNC = обратная_функция_движ ]
    [ , MSTYPE = тип_данных_состояния_движ ]
    [ , MSSPACE = размер_данных_состояния_движ ]
    [ , MFINALFUNC = функция_завершения_движ ]
    [ , MFINALFUNC_EXTRA ]
    [ , MFINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
    [ , MINITCOND = начальное_условие_движ ]
    [ , SORTOP = оператор_сортировки ]

Описание

CREATE AGGREGATE создаёт новую агрегатную функцию. CREATE OR REPLACE AGGREGATE создаёт новую или заменяет определение уже существующей. Некоторые основные и часто используемые агрегатные функции включены в дистрибутив; они описаны в разделе Агрегатные функции. Если вы определяете новые типы или нуждаетесь в агрегатной функции, которая еще не предоставлена, то можно использовать CREATE AGGREGATE для предоставления требуемых объектов.

При замене существующего определения типы аргументов, тип результата и количество аргументов не могут быть изменены. Кроме того, новое определение должно быть такого же вида (обычный, сортирующий или гипотезирующий агрегат), как и старое.

Если задано имя схемы (например, CREATE AGGREGATE myschema.myagg ...) агрегатная функция создается в указанной схеме. В противном случае она создается в текущей схеме.

Агрегатная функция идентифицируется по имени и типам входных данных. Два агрегата в одной схеме могут иметь одно и то же имя, если они работают с разными типами входных данных. Имя и тип(ы) входных данных агрегата также должны отличаться от имени и типа(ов) входных данных простых функций в той же схеме. Это поведение идентично перегрузке обычных имен функций (см. CREATE FUNCTION).

Простая агрегатная функция состоит из одной или двух обычных функций: функции перехода состояния функция_состояния, и необязательная функция окончательного вычисления функция_завершения. Они используются следующим образом:

функция_состояния( внутреннее-состояние, следующие-значения-данных ) ---> следующее-внутреннее-состояние

функция_завершения( внутреннее-состояние ) ---> агрегатное_значение

QHB создает временную переменную типа данных тип_данных_состояния чтобы сохранить текущее внутреннее состояние агрегата. В каждой входной строке вычисляются значения агрегированных аргументов и вызывается функция перехода состояния с текущим значением состояния и новым значением аргумента для вычисления нового значения внутреннего состояния. После обработки всех строк вызывается завершающая функция один раз для вычисления возвращаемого агрегатом значения. Если нет завершающей функции, то возвращается значение конечного состояния.

Агрегатная функция может определить начальное условие, то есть начальное значение для значения внутреннего состояния. Это значение задаётся и сохраняется в базе данных в виде строки типа text, но оно должно быть допустимым внешним представлением константы типа данных переменной состояния. По умолчанию начальным значением состояния считается NULL.

Если функция перехода состояния объявлена "строгой", то она не может быть вызвана с входными данными NULL. С такой функцией перехода агрегатное выполнение ведет себя следующим образом. Строки с входными значениями NULL игнорируются (функция не вызывается, а предыдущее значение состояния сохраняется), и если начальное значение состояния равно NULL, то в первой строке со всеми входными значениями не NULL значение первого аргумента заменяется значением состояния, а функция перехода вызывается в каждой последующей строке со всеми входными значениями не NULL. Это удобно для реализации агрегатов, таких как max. Обратите внимание, что это поведение возможно только тогда, когда тип_данных_состояния совпадает с первым типом_данных_аргумента. Если эти типы отличаются, необходимо указать начальное условие не NULL или использовать нестрогую функцию перехода.

Если функция перехода состояния не является строгой, то она будет вызываться безусловно в каждой входной строке и должна сама обрабатывать вводимые значения и переменную состояния, равные NULL. Это позволяет разработчику агрегатной функции полностью управлять тем, как она воспринимает значения NULL.

Если функция завершения объявлена "строгой", то она не будет вызвана, если значение конечного состояния равно NULL; вместо этого будет автоматически возвращен NULL результат. (Это обычное поведение строгих функций). В любом случае функция завершения имеет возможность возвращать NULL результат. Например, конечная функция завершения для avg возвращает NULL, если определяет, что было обработано ноль строк

Иногда бывает полезно объявить функцию завершения как принимающую не только значение состояния, но и дополнительные параметры, соответствующие входным значениям агрегата. В основном это имеет смысл для полиморфных функций завершения, которым может быть недостаточно знать тип данных только переменной состояния, чтобы вывести тип результата. Эти дополнительные параметры всегда передаются как NULL (так что функция завершения не должна быть строгой, когда применяется FINALFUNC_EXTRA), но в остальном это обычные параметры. Функция завершения может, например, использовать get_fn_expr_argtype, чтобы определить фактический тип аргумента в текущем вызове.

Агрегатная функция может дополнительно поддерживать режим движущегося агрегата, как описано в разделе Режим движущегося агрегата. Для этого необходимо указать следующие параметры: MSFUNC, MINVFUNC, и MSTYPE параметры, и выборочно MSSPACE, MFINALFUNC, MFINALFUNC_EXTRA, MFINALFUNC_MODIFY, и MINITCOND параметры. Кроме MINVFUNC, эти параметры работают как соответствующие параметры простого агрегата без начальной буквы M; они определяют отдельную реализацию агрегата, включающую функцию обратного перехода.

Если в список параметров добавлено указание ORDER BY, создаётся особый типа агрегата, называемый сортирующим агрегатом; с указанием HYPOTHETICAL создаётся гипотезирующий агрегат. Эти агрегаты работают над группами отсортированных значений в зависимости от порядка сортировки, так что спецификация порядка сортировки входных данных является неотъемлемой частью вызова. Кроме того, они могут иметь непосредственные аргументы, которые вычисляются единожды для всей процедуры агрегирования, а не для каждой поступающей строки. Гипотезирующие агрегаты это подкласс сортирующих агрегатов, в котором непосредственные аргументы должны соответствовать столбцам агрегированных аргументов, по количеству и типам данных. Это позволяет добавить значения этих непосредственных аргументов в набор агрегируемых строк в качестве дополнительной "гипотетической" строки.

Агрегатная функция может дополнительно поддерживать частичное агрегирование, как описано в разделе Частичная агрегация. Для этого необходимо задать параметр комбинирующая_функция. Если в качестве типа_данных_состояния выбран internal, обычно также указывают функция_сериализации и функция_десериализации чтобы было возможно параллельное агрегирование. Обратите внимание, что агрегат также должен быть помечен как PARALLEL SAFE для возможности параллельной агрегации.

Агрегаты, работающие подобно MIN и MAX, иногда можно оптимизировать, заменив сканирование всех строк таблицы обращением по индексу. Если агрегат подлежит такой оптимизации, укажите это, определив оператор сортировки. Основное требование состоит в том, что агрегат должен выдавать в результате первый элемент по порядку сортировки, задаваемому оператором, другими словами:

SELECT agg(col) FROM tab;

должно быть эквивалентно:

SELECT col FROM tab ORDER BY col USING sortop LIMIT 1;

Дополнительно предполагается, что агрегат игнорирует значения NULL и возвращает NULL, только если строк со значениями не NULL не нашлось. Обычно оператор < является подходящим оператором сортировки для MIN, а > - для MAX. Обратите внимание, что никакой оптимизации не будет, если указанный оператор не реализует cтратегии “меньше, чем” или “больше, чем” в классе операторов индекса типа B-дерево.

Чтобы иметь возможность создать агрегатную функцию, необходимо иметь право USAGE для типов аргументов, типа(ов) состояния и типа результата, а также право EXECUTE для функций.

Параметры

Имя

Имя, которое может быть дополнено схемой, создаваемой агрегатной функции.

режим_аргумента

Режим аргумента: IN или VARIADIC (Агрегатные функции не поддерживают выходные аргументы (OUT)). Если этот параметр не указан, значение по умолчанию равно IN. Режим VARIADIC может быть указан только последним.

имя_аргумента

Название аргумента. В настоящее время используется для целей документации. Если опущено, соответствующий аргумент будет безымянным.

тип_данных_аргумента

Тип входных данных, с которым работает эта агрегатная функция. Чтобы создать агрегатную функцию без аргументов, напишите * вместо списка определений аргументов. (Примером такого агрегата является count(*)).

базовый_тип

В старом синтаксисе для CREATE AGGREGATE тип входных данных задавался параметром базовый_тип, а не записывался после имени агрегата. Обратите внимание, что этот синтаксис допускает только один входной параметр. Чтобы определить агрегатную функцию без аргументов с помощью этого синтаксиса, в качестве значения базовый_тип нужно указать "ANY" (не *). Создать сортирующий агрегат старый синтаксис не позволял.

функция_состояния

Имя функции перехода состояния, вызываемой для каждой входной строки. Для обычных агрегатных функций с N аргументами, функция_состояния должна принимать N+1 аргумент, первый должен иметь тип тип_данных_состояния, а остальные — типы соответствующих входных данных. Функция должна возвращать значение типа тип_данных_состояния. Эта функция принимает текущее значение состояния и текущее значение входных данных, а возвращает следующее значение состояния.

В сортирующих (и в том числе, гипотезирующих) агрегатах функция перехода состояния получает только текущее значение состояния и агрегируемые аргументы, а не непосредственные аргументы. В остальном это одно и то же.

тип_данных_состояния

Тип данных значения состояния агрегатной функции.

размер_данных_состояния

Приблизительный средний размер (в байтах) значения состояния агрегата. Если этот параметр опущен или равен нулю, используется оценка по умолчанию, определяемая по типу тип_данных_состояния. Планировщик использует это значение для оценки памяти, необходимой для агрегатного запроса с группировкой. Планировщик может применить агрегирование по хешу для такого запроса, только если хеш-таблица, судя по оценке, поместится в work_mem; таким образом, при больших значениях этого параметра агрегирование по хешу будет менее желательным.

функция_завершения

Имя функции завершения, вызываемой для вычисления результата агрегатной функции после обработки всех входных строк. Для нормальной статистической обработки эта функция должна принимать один аргумент типа тип_данных_состояния. Возвращаемый тип данных агрегата определяется как возвращаемый тип этой функции. Если функция_завершения не указана, то значение конечного состояния используется в качестве результата агрегирования, а тип возвращаемого значения - тип_данных_состояния.

В сортирующих (и в том числе, гипотезирующих) агрегатах функция завершения получает не только значение конечного состояния, но и значения всех непосредственных аргументов.

Если команда содержит указание FINALFUNC_EXTRA, то в дополнение к конечному значению состояния и непосредственных аргументам, конечная функция получает дополнительные нулевые значения, соответствующие регулярным (агрегированным) аргументам агрегата. Это в основном полезно для обеспечения правильного определения типа результата агрегата при создании полиморфной агрегатной функции.

FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE }

Этот параметр указывает, является ли функция завершения чистой функцией, которая не изменяет свои аргументы. Это свойство функции передаёт значение READ_ONLY; другие два значения указывают, что она может изменить значение состояния перехода. Подробнее это рассматривается в Примечаниях. По умолчанию подразумевается значение READ_ONLY, за исключением сортирующих агрегатов (для них значение по умолчанию — READ_WRITE).

комбинирующая_функция

Комбинирующая_функция функция может быть дополнительно задана, чтобы разрешить агрегатной функции поддерживать частичную агрегацию. Если задаётся, комбинирующая_функция должна комбинировать два значения типа_данных_состояния, каждое из которых содержит результат агрегации по некоторому подмножеству входных значений, чтобы получить новое значение типа_данных_состояния, представляющее результат агрегирования по обоим множествам данных. Эту функцию можно рассматривать как функцию_состояния, которая вместо обработки отдельной входной строки и включения её данных в текущее агрегируемое состояние включает некоторое агрегированное состояние в текущее.

Указанная комбинирующая_функция должна быть объявлена как принимающая два аргумента с типом тип_данных_состояния и возвращающая значение с типом тип_данных_состояния. Эта функция дополнительно может быть объявлена «строгой». В этом случае функция не будет вызываться, когда одно из входных состояний равно NULL; в качестве корректного результата будет выдано другое состояние.

Для агрегатных функций, у которых тип_данных_состояния - internal, комбинирующая_функция не должна быть «строгой». В этом случае: комбинирующая_функция должна проверять, что NULL состояния обрабатываются правильно и что возвращаемое состояние правильно хранится в контексте памяти агрегирования.

функция_сериализации

Агрегатная функция, у которой тип_данных_состояния — internal может участвовать в параллельном агрегировании только в том случае, если для неё задана функция_сериализации, которая должна сериализовать агрегатное состояние в значение bytea для передачи другому процессу. Эта функция должна принимать один аргумент типа internal и возвращать тип bytea. Также при этом нужно задать соответствующую функцию_десериализации.

функция_десериализации

Десериализует ранее сериализованное агрегатное состояние обратно в тип_данных_состояния. Эта функция должна принимать два аргумента типа bytea и internal, и возвращать результат типа internal. (Примечание: второй аргумент типа internal не используется, но требуется из соображений безопасности)

начальное_условие

Начальное значение переменной состояния. Это должна быть строковая константа в форме, принятой для данного типа данных тип_данных_состояния. Если не указано, то начальным значением состояния будет NULL.

функция_состояния_движ

Имя функции прямого перехода состояния, которая будет вызываться для каждой входной строки в режиме движущегося агрегата. Это такая же функция, как и обычная функция перехода, за исключением того, что её первый аргумент и результат имеют тип тип_данных_состояния_движ, который может отличаться от типа тип_данных_состояния.

обратная_функция_движ

Имя функции обратного перехода состояния, которая будет использоваться в режиме движущегося агрегата. Эта функция имеет те же типы аргументов и результатов, что и функция_состояния_движ, но она используется для удаления значения из текущего состояния агрегата, а не для добавления к нему значения. Функция обратного перехода должна иметь ту же характеристику строгости, что и функция прямого перехода состояния.

тип_данных_состояния_движ

Тип данных для значения состояния агрегата, при использовании режима движущегося агрегата.

размер_данных_состояния_движ

Приблизительный средний размер (в байтах)значения состояния агрегата, при использовании режима движущегося агрегата. Он имеет то же значение, что и размер_данных_состояния.

функция_завершения_движ

Имя функции завершения, вызываемой для вычисления результата агрегата после обработки всех входных строк, при использовании режима движущегося агрегата. Она работает так же, как функция_завершения, за исключением того, что тип его первого аргумента тип_данных_состояния_движ, а дополнительными пустыми аргументами управляет параметр MFINALFUNC_EXTRA. Тип результата, который определяет функция_завершения_движ или тип_данных_состояния_движ, должен совпадать с типом результата обычной реализации агрегата.

MFINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE }

Этот параметр подобен FINALFUNC_MODIFY, но описывает поведение функции завершения для движущегося агрегата.

начальное_условие_движ

Начальное значение переменной состояния в режиме движущегося агрегата. Оно применяется так же, как начальное_условие.

оператор_сортировки

Связанный оператор сортировки для реализации агрегатов, подобных MIN или MAX. Это просто имя оператора (возможно, определяемое схемой). Предполагается, что оператор имеет те же типы входных данных, что и агрегат (который должен быть обычным и иметь один аргумент).

PARALLEL = { SAFE | RESTRICTED | UNSAFE }

Указания PARALLEL SAFE, PARALLEL RESTRICTED, и PARALLEL UNSAFE имеют те же значения, что и в CREATE FUNCTION. Агрегатная функция не будет считаться распараллеливаемой, если она помечена как PARALLEL UNSAFE (что является значением по умолчанию!) или PARALLEL RESTRICTED. Обратите внимание, что планировщик не обращает внимание на допустимость распараллеливания опорных функций агрегата, а учитывает только характеристику самой агрегатной функции.

HYPOTHETICAL

Только для сортирующих агрегатов. Этот флаг указывает, что статистические аргументы должны обрабатываться в соответствии с требованиями для агрегатов с гипотетическими наборами: то есть последние несколько непосредственных аргументов должны соответствовать по типам агрегатным аргументам (WITHIN GROUP). Флаг HYPOTHETICAL не влияет на поведение во время выполнения, учитывается только при разрешении типов данных и правил сортировки для аргументов агрегата во время синтаксического анализа.

Параметры CREATE AGGREGATE могут быть записаны в любом порядке, а не только в порядке, показанном выше.

Примечания

В параметрах, определяющих имена вспомогательных функций, при необходимости можно записать имя схемы, например SFUNC = public.sum. Однако не записывайте там типы аргументов — типы аргументов вспомогательных функций определяются из других параметров.

Обычно предполагается, что функции QHB являются действительно функциями, которые не изменяют свои входные значения. Тем не менее, функциям агрегатного перехода, используемым в контексте агрегатной функции, разрешено действовать хитрее и изменять аргумент переходного состояния на лету. Это может обеспечить существенные преимущества производительности по сравнению с созданием новой копии переходного состояния каждый раз.

Подобным образом, хотя функция завершения агрегата обычно не должна изменять свои входные значения, иногда может быть полезно допустить изменение аргумента со значением переходного состояния. Такое поведение должно быть объявлено с помощью параметра FINALFUNC_MODIFY. Его значение READ_WRITE указывает, что функция завершения модифицирует переходное состояние неопределённым образом. Это значение предотвращает использование агрегата в качестве оконной функции, а также предотвращает объединение переходных состояний при вызове агрегатов с одинаковыми входными данными и функциями перехода. Значение SHAREABLE указывает, что функция перехода не может быть применена после функции завершения, но над значением конечного переходного состояния могут быть выполнены несколько вызовов функции завершения. Это значение предотвращает использование агрегата в качестве оконной функции, но позволяет объединять переходные состояния. (То есть оптимизация в данном случае заключается не в многократном применении одной и той же функции завершения, а в применении различных функции завершения к одному и тому же конечному переходному состоянию. Это разрешено до тех пор, пока ни одна из функций завершения не будет отмечена READ_WRITE).

Если агрегатная функция поддерживает режим движущегося агрегата, это повысит эффективность вычислений, когда агрегат будет использоваться в качестве оконной функции для окна с движущимся началом рамки (то есть когда начало определяется не как UNBOUNDED PRECEDING). По существу, функция прямого перехода добавляет входные значения к состоянию агрегата, когда они появляются в оконной рамке, а функция обратного перехода снова вычитает их, когда они покидают рамку. Поэтому, вычитаются значения в том же порядке, в каком добавлялись. Всякий раз, когда вызывается обратная функция перехода, она, таким образом, получит самое раннее добавленное, но еще не удаленное значение аргумента. Функция обратного перехода может предполагать, что по крайней мере одна строка останется в текущем состоянии после удаления самой старой строки. (В противном случае механизм функции окна просто запускает новую агрегацию, а не использует обратную функцию перехода).

Функция прямого перехода движущегося агрегата не может возвращать NULL в качестве нового значения состояния. Если функция обратного перехода возвращает значение NULL, это показывает, что обратная функция не может произвести обратное вычисление для этих конкретных данных, и поэтому вычисление агрегата следует выполнить заново от начальной позиции текущей рамки. Это соглашение позволяет использовать режим движущегося агрегата в ситуациях, в которых обратный расчёт состояния производить непрактично.

Агрегатную функцию можно использовать с движущимися рамками и без реализации движущегося агрегата, но QHB будет заново агрегировать все данные при каждом перемещении начала рамки. Обратите внимание, что независимо от того, поддерживает ли агрегатная функция режим движущегося агрегата, QHB может обойтись без повторных вычислений при сдвиге конца рамки; это делается путем продолжения добавления новых значений в состояние агрегата. Именно поэтому использование агрегата в качестве оконной функции требует, чтобы функция завершения была только читающей: она не должна повредить значение состояния агрегата, так чтобы агрегация могла быть продолжена даже после получения значения результата агрегирования для одного набора строк в определённой рамке.

Синтаксис сортирующих агрегатных функций позволяет указать VARIADIC и в последнем непосредственном параметре, и в последнем агрегатном (WITHIN GROUP). Тем не менее, текущая реализация ограничивает использование VARIADIC. Во-первых, в сортирующих агрегатных функциях можно использовать только VARIADIC "any", но не другие типы переменных массивов. Во-вторых, если последним непосредственным аргументом является VARIADIC "any", тогда может быть только один агрегированный параметр, и он также должен быть VARIADIC "any". (В представлении, используемом в системных каталогах, эти два параметра объединяются в один VARIADIC "any" пункт, так как в pg_proc нельзя представить функцию с несколькими параметрами VARIADIC). Если агрегат является гипотезирующим агрегатом, то непосредственные аргументы, соответствующие параметру VARIADIC "any", будут гипотетическими; любые предыдущие параметры представляют дополнительные непосредственные аргументы, которые могут не соответствовать агрегатным

В настоящее время сортирующие агрегатные функции не поддерживают режим движущегося агрегата, поскольку они не могут использоваться в качестве оконных функций.

Частичная (в том числе параллельная) агрегация в настоящее время не поддерживается для сортирующих агрегатных функций. Также она никогда не будет применяться для агрегатных вызовов с предложениями DISTINCT или ORDER BY, так как они по природе своей не могут быть реализованы с частичным агрегированием.

Примеры

См. раздел Пользовательские агрегаты.

Совместимость

Команда CREATE AGGREGATE является расширением QHB. Стандарт SQL не предусматривает создание пользовательских агрегатных функций.

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

ALTER AGGREGATE, DROP AGGREGATE


CREATE CAST

CREATE CAST - создать приведение

Синтаксис

CREATE CAST (исходный_тип AS целевой_тип)
    WITH FUNCTION имя_функции [ (тип_аргумента [, ...]) ]
    [ AS ASSIGNMENT | AS IMPLICIT ]

CREATE CAST (исходный_тип AS целевой_тип)
    WITHOUT FUNCTION
    [ AS ASSIGNMENT | AS IMPLICIT ]

CREATE CAST (исходный_тип AS целевой_тип)
    WITH INOUT
    [ AS ASSIGNMENT | AS IMPLICIT ]

Описание

CREATE CAST создает новое приведение. Приведение указывает, как выполнить преобразование из одного типа в другой. Например,

SELECT CAST(42 AS float8);

преобразует целочисленную константу 42 в тип float8 путем вызова ранее указанной функции, в данном случае float8 (int4). (Если подходящее приведение не было определено, преобразование завершается ошибкой.)

Два типа могут быть двоично-сводимыми, что означает, что преобразование может быть выполнено “бесплатно” без вызова какой-либо функции. Для этого требуется, чтобы соответствующие значения имели одинаковое внутреннее представление. Например, типы text и тип varchar являются двоично-сводимыми в обе стороны. Отношение двоичной сводимости не обязательно симметрично. Например, приведение типа xml к типу text может быть выполнено бесплатно в настоящей реализации, но обратное направление требует функции, которая выполняет по крайней мере проверку синтаксиса. (Два типа, двоично-сводимые в обе стороны, также называются двоично-совместимыми).

Приведение можно определить как преобразование ввода/вывода, используя указание WITH INOUT. Приведение преобразования ввода-вывода выполняется путем вызова выходной функции исходного типа данных и передачи результирующей строки во входную функцию целевого типа данных. Во многих распространенных случаях эта функция позволяет избежать необходимости писать отдельную функцию приведения для преобразования. Приведение преобразования ввода-вывода действует так же, как и обычное приведение на основе функций; только реализация отличается.

По умолчанию приведение может быть вызвано только явным запросом приведения, то есть применив конструкцию CAST(x AS имя_типа) или x::имя_типа.

Если приведение помечено AS ASSIGNMENT, его можно вызывать неявно, присваивая значение столбцу с целевым типом данных. Например, если foo.f1 — столбец типа text, то команда:

INSERT INTO foo (f1) VALUES (42);

будет допустимой, если приведение типа integer к text помечено AS ASSIGNMENT, и не будет в противном случае. (Для описания такого типа приведений обычно используют термин приведение присваивания).

Если приведение помечено AS IMPLICIT, тогда оно может быть вызван неявно в любом контексте, будь то присваивание или внутреннее преобразование в выражении. (Для описания такого типа приведений обычно используют термин неявное приведение) Например, рассмотрим этот запрос:

SELECT 2 + 4.0;

При разборе запроса константам сначала назначаются типы integer и numeric. Но в системных каталогах нет оператора integer + numeric, но есть numeric + numeric Поэтому запрос будет выполнен успешно, если существует преобразование типа integer к numeric с пометкой AS IMPLICIT - что на самом деле так и есть. Анализатор запроса применит неявное приведение и запрос будет обработан, как если бы он был записан в виде

SELECT CAST ( 2 AS numeric ) + 4.0;

Системные каталоги также содержат приведение типа numeric к integer. Если бы это приведение тоже было бы помечено AS IMPLICIT (на самом деле это не так) тогда анализатор столкнулся бы с выбором между приведенным выше вариантом и приведением константы numeric к типу integer с последующим применением оператора integer + integer. Не имея никаких знаний о том, какой выбор предпочесть, анализатор объявил бы запрос неоднозначным. Именно потому, что только одно из двух приведений неявно, анализатор приходит к пониманию что предпочитаемым является преобразование выражения numeric-и-integer в numeric; отдельных встроенных сведений об этом нет.

Разумно проявлять консерватизм в отношении того, объявлять ли приведения неявными. Переизбыток неявных способов приведения может привести к тому, что QHB выберет неожиданные интерпретации команд или даже не сможет выполнить команды из-за наличия нескольких возможных интерпретаций. Хорошее эмпирическое правило состоит в том, чтобы сделать приведение неявно вызываемым только для сохраняющих информацию преобразований между типами в одной и той же категории типов. Например, приведение int2 к int4 разумно сделать неявным, но приведение float8 к int4, возможно, лучше сделать только приведением присваивания. Приведения типов разных категорий, например, text к int4, лучше делать только явными.

Замечание
Иногда по соображениям удобства использования или соответствия стандартам необходимо обеспечить несколько неявных приведений для набора типов, что приводит к неоднозначности, которую нельзя избежать, как указано выше. Чтобы анализатор запроса мог обеспечить желаемое поведение в таких случаях, он дополнительно принимает во внимание категории типов и предпочитаемые типы. Подробнее это описано в разделе CREATE TYPE.

Чтобы создать приведение, необходимо быть владельцем одного (исходного или целевого) типа и иметь право USAGE для другого типа. Создавать двоично-сводимое приведение могут только суперпользователи. (Это ограничение введено потому, что преобразование данных с ошибочным двоичным сведением может легко вызывать сбой сервера).

Параметры

исходный_тип

Имя исходного типа данных для приведения.

целевой_тип

Имя целевого типа данных для приведения.

имя_функции[(тип_аргумента [, ...])]

Функция, используемая для выполнения приведения. Имя функции может быть дополнено схемой; Иначе, для поиска функции просматривается путь поиска. Тип данных результата функции должен соответствовать целевому типу приведения. Аргументы функции рассматриваются ниже. Если список аргументов не указан, имя функции должно быть уникальным в своей схеме.

WITHOUT FUNCTION

Указывает, что исходный тип является приводимым к целевому на двоичном уровне, так что функция для приведения не требуется.

WITH INOUT

Указывает, что приведение является приведением преобразования ввода-вывода, выполняемым путем вызова выходной функции исходного типа данных и передачи результирующей строки во входную функцию целевого типа данных.

AS ASSIGNMENT

Указывает, что приведение может быть вызвано неявно в контекстах присвоения.

AS IMPLICIT

Указывает, что приведение может быть вызвано неявно в любом контексте.

Функции, реализующие приведение, могут иметь от одного до трех аргументов. Тип первого аргумента должен быть идентичным или двоично-сводимым к исходному типу приведения. Второй аргумент, если он присутствует, должен быть типом integer; он получает модификатор типа, связанный с типом назначения, или -1 если их вообще нет. Третий аргумент, если он присутствует, должен иметь тип boolean; в нём передаётся true, если приведение является явным приведением, иначе false. (Как ни странно, стандарт SQL требует различного поведения для явных и неявных приведений в некоторых случаях. Этот аргумент предназначен для функций, которые должны реализовывать такие приведения. Однако создавать собственные типы данных, для которых это имело бы значение, не рекомендуется).

Возвращаемый тип функции приведения должен быть идентичным или двоично-сводимым к целевому типу приведения.

Обычно приведение должно иметь различные типы исходных и целевых данных. Однако разрешается объявлять приведение с одинаковыми исходными и целевыми типами, если функция, реализующая преобразование, имеет более одного аргумента. Это используется для представления в системных каталогах функций, сводящих разные длины типов. Реализующая такое приведение функция используется для сведения значение типа к значению с определённым модификатором, заданному его вторым аргументом.

Если приведение имеет различные исходные и целевые типы, а также функцию, принимающую более одного аргумента, оно поддерживает преобразование из одного типа в другой и сведение к нужной длине может выполняться за один шаг. Если же соответствующей записи не находится, приведение к типу, с определённым модификатором, включает два этапа приведения: один для преобразования между типами данных и второй для применения модификатора.

Приведение типа домена или к типу домена в настоящее время не осуществляется. При попытке выполнить такое приведение, вместо этого выполняется приведение, связанное с базовым типом домена.

Примечания

Для удаления приведений, созданных пользователем, применяется DROP CAST.

Помните, что если вы хотите иметь возможность конвертировать типы в обе стороны, вам нужно явно объявить приведение в обе стороны.

Обычно нет необходимости создавать приведения между определяемыми пользователем типами и стандартными строковыми типами (text, varchar и char(n), а также пользовательскими типами, относящимися к категории строковых). QHB предоставляет для этого автоматические преобразования ввода-вывода. Автоматические приведения к строковым типам обрабатываются как приведения присваивания, в то время как автоматические приведения от строковых типов могут быть только явными. Вы можете переопределить это поведение, объявив свое собственное приведение, чтобы заменить автоматическое приведение, но обычно это нужно, только чтобы сделать вызов более удобным, чем стандартное присваивание или явное указание. Другая возможная причина заключается в том, что вы хотите, чтобы преобразование вело себя иначе, чем функция ввода-вывода; но это выглядит достаточно странным, поэтому стоит дважды подумать, является ли это хорошей идеей. (На самом деле у небольшого количества встроенных типов имеются подобные специфические приведения, в основном, из-за требований стандарта SQL).

Несмотря на то, что это не обязательно, рекомендуется продолжать следовать старому соглашению именования функций, реализующих приведение, по целевому типу данных. Многие пользователи привыкли иметь возможность приводить типы данных записывая его в стиле функций, т. е. имя_типа(x). Эта нотация на самом деле ни что иное, как вызов функции реализующей приведение; такой вызов не воспринимается как именно приведение. Если ваши функции преобразования не названы следуя этому соглашению, это может оказаться неожиданным для пользователей. Поскольку QHB позволяет перегружать одно и то же имя функции с различными типами аргументов, ничто не мешает тому, чтобы иметь несколько функций преобразования из разных типов, названных по имени этого целевого типа.

Замечание
На самом деле в предыдущем абзаце содержится некоторое упрощение: есть два случая, в которых конструкция вызова функции будет рассматриваться как запрос приведения, без сопоставления его с фактической функцией. Если вызову функции имя(x) в точности не соответствует существующая функция, но имеется тип данных имя и в pg_cast есть двоично-сводимое приведение типа x к этому типу, такой вызов будет воспринят как приведение. Это исключение введено, чтобы двоично-сводимое приведение могло быть вызвано используя синтаксис функций, несмотря на то, что никакой функции преобразования у него нет. Аналогично, если запись приведения в pg_cast отсутствует, но приведение было бы к или от строкового типа, вызов будет истолкован как приведение преобразования ввода-вывода. Это исключение позволяет вызывать приведения преобразования ввода-вывода используя синтаксис вызова функции.

Замечание
Существует также исключение и из этого исключения: преобразование ввода/вывода из составных типов в строковые не могут быть вызваны, используя синтаксис вызова функции, его необходимо записать как явное приведение (используя CAST или запись ::) Это исключение было добавлено, потому что после введения автоматически предоставляемых приведений преобразования ввода-вывода было обнаружено, что слишком легко случайно вызвать такое приведение, тогда как имелась в виду ссылка на столбец или функцию.

Примеры

Создание приведения присваивания типа bigint к типу int4 с помощью функции int4(bigint):

CREATE CAST (bigint AS int4) WITH FUNCTION int4(bigint) AS ASSIGNMENT;

(Это приведение уже предопределено в системе).

Совместимость

Команда CREATE CAST соответствует стандарту SQL, за исключением того, что в стандарте ничего не говорится о двоично-сводимых типах и дополнительных аргументах реализующих функций. Указание AS IMPLICIT тоже является расширением QHB.

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

CREATE FUNCTION, CREATE TYPE, DROP CAST


CREATE COLLATION

CREATE COLLATION - создать правило сортировки

Синтаксис

CREATE COLLATION [ IF NOT EXISTS ] имя (
    [ LOCALE = локаль, ]
    [ LC_COLLATE = категория_сортировки, ]
    [ LC_CTYPE = категория_типов_символов, ]
    [ PROVIDER = провайдер, ]
    [ DETERMINISTIC = логическое_значение, ]
    [ VERSION = версия ]
)
CREATE COLLATION [ IF NOT EXISTS ] имя FROM существующее_правило

Описание

CREATE COLLATION определяет новое правило сортировки с использованием указанных параметров локали операционной системы или путем копирования существующих правил сортировки.

Чтобы создать правило сортировки, необходимо иметь право CREATE в целевой схеме.

Параметры

IF NOT EXISTS

Не выдавать ошибку, если правило сортировки с тем же именем уже существует. В этом случае выдается соответствующее уведомление. Обратите внимание, что нет никакой гарантии, что существующее правило сортировки как-то соотносятся с тем, которое могло бы быть создано.

Имя

Имя правила сортировки. Имя правила сортировки может быть дополнено схемой. Если это не так, правила сортировки определяются в текущей схеме. Имя правил сортировки должно быть уникальным в этой схеме. (Системные каталоги могут содержать правила сортировки с тем же именем для других кодировок, но они игнорируются, если кодировка базы данных не соответствует).

локаль

Это ярлык для одновременной настройки LC_COLLATE и LC_CTYPE. Если вы зададите этот параметр, вы не сможете указать ни один из этих параметров отдельно.

категория_сортировки

Использовать указанную локаль операционной системы в качестве категории локали LC_COLLATE.

категория_типов_символов

Использовать указанную локаль операционной системы в качестве категории локали LC_CTYPE.

провайдер

Указывает провайдера, который будет использоваться для служб локали, связанных с данным правилом сортировки. Возможные значения: icu, libc. По умолчанию выбирается libc. Доступные варианты зависят от параметров операционной системы и сборки.

DETERMINISTIC

Указывает, должны ли правила сортировки использовать детерминированные сравнения. Значение по умолчанию - TRUE(использовать детерминированные сравнения). При детерминированном сравнении строки, которые не равны по байтам, считаются неравными, даже если они считаются логически равными при сравнении. QHB решает вопрос их равенства, используя байтовое сравнение. При недетерминированном сравнении, правило может стать, например, независящим от ударения или регистра символов. Для этого вам нужно выбрать подходящий вариант LC_COLLATE и сделать это правило сортировки недетерминированным.

Недетерминированные правила сортировки поддерживаются только с провайдером ICU.

версия

Указывает строку версии, сохраняемую с правилом сортировки. Обычно её не следует задавать, что приведет к вычислению версии из фактической версии правил сортировки, предоставленных операционной системой. Эта опция предназначена чтобы через qhb_upgrade можно было скопировать версии из существующей установки.

Что делать при несовпадении версий правил сортировки, описано в ALTER COLLATION.

существующее_правило

Имя копируемого существующего правила сортировки. Новое правило сортировки будет иметь те же свойства, что и существующее, но будет независимым объектом.

Примечания

CREATE COLLATION устанавливает блокировку SHARE ROW EXCLUSIVE в системном каталоге pg_collation. Эта блокировка конфликтует с такой же, поэтому в один момент времени может выполняться только одна команда CREATE COLLATION.

Используйте DROP COLLATION для удаления пользовательских правил сортировки.

Дополнительную информацию о создании правил сортировки см. в разделе Создание новых объектов сортировки.

При использовании провайдера libc для правил сортировки, локаль должна быть применима к текущей кодировке базы данных. См. CREATE DATABASE.

Примеры

Создание правила сортировки из локали операционной системы fr_FR.utf8 (предполагается, что кодировка текущей базы данных — UTF8):

CREATE COLLATION french (locale = 'fr_FR.utf8');

Создание правила сортировки с порядком, принятым в Германии для телефонных книг, с использованием провайдера ICU:

CREATE COLLATION german_phonebook (provider = icu, locale = 'de-u-co-phonebk');

Создание правила сортировки из уже существующего:

CREATE COLLATION german FROM "de_DE";

Иногда удобно использовать в приложениях имена правил сортировки, не зависящие от операционной системы.

Совместимость

В стандарте SQL есть команда CREATE COLLATION, но она ограничена копированием существующих правил сортировки. Синтаксис для создания новых правил сортировки является расширением QHB.

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

ALTER COLLATION, DROP COLLATION


CREATE CONVERSION

CREATE CONVERSION - создать перекодировку

Синтаксис

CREATE [ DEFAULT ] CONVERSION имя
    FOR исходная_кодировка TO целевая_кодировка FROM имя_функции

Описание

CREATE CONVERSION определяет новую перекодировку набора символов. Кроме того, перекодировки отмеченные как DEFAULT могут использоваться для автоматической перекодировки между клиентом и сервером. Для этого необходимо определить две перекодировки - из кодировки A в B и из кодировки B в A.

Чтобы создать перекодировку, необходимо иметь право EXECUTE для реализующей функции и право CREATE в целевой схеме.

Параметры

DEFAULT

Предложение DEFAULT указывает, что эта перекодировка является перекодировкой по умолчанию для заданной исходной кодировки в кодировку назначения. В схеме для пары перекодировок должна быть только одна перекодировка по умолчанию.

Имя

Имя перекодировки. Имя перекодировки может быть дополнено схемой. Если это не так, перекодировка создается в текущей схеме. Имя перекодировки должно быть уникальным в пределах схемы.

исходная_кодировка

Имя исходной кодировки.

целевая_кодировка

Имя целевой кодировки.

имя_функции

Функция, используемая для выполнения перекодировки. Имя функции может быть дополнено схемой. Если это не так, для поиска функции просматривается путь поиска.

Функция должна иметь следующую сигнатуру:

conv_proc(
    integer,  -- идентификатор исходной кодировки
    integer,  -- идентификатор целевой кодировки
    cstring,  -- исходная строка (строка, завершающаяся 0, как в C)
    internal, -- целевая строка (заполняется строкой, завершающейся 0, как в C)
    integer   -- длина исходной строки
) RETURNS void;

Примечания

Используйте команду DROP CONVERSION для удаления пользовательских перекодировок.

Права доступа, необходимые для создания перекодировки, могут быть изменены в будущих версиях.

Примеры

Создание перекодировки из кодировки UTF8 в LATIN1 с использованием функции myfunc:

CREATE CONVERSION myconv FOR 'UTF8' TO 'LATIN1' FROM myfunc;

Совместимость

Команда CREATE CONVERSION является расширением QHB. В стандарте SQL нет инструкции CREATE CONVERSION, но есть инструкция CREATE TRANSLATION, которая очень похожа по назначению и синтаксису.

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

ALTER CONVERSION, CREATE FUNCTION, DROP CONVERSION


CREATE DATABASE

CREATE DATABASE - создание новой базы данных

Синтаксис

CREATE DATABASE имя
    [ [ WITH ] [ OWNER [=] имя_пользователя ]
           [ TEMPLATE [=] шаблон ]
           [ ENCODING [=] кодировка ]
           [ LC_COLLATE [=] категория_сортировки[@провайдер] ]
           [ LC_CTYPE [=] категория_типов_символов ]
           [ TABLESPACE [=] табл_пространство ]
           [ ALLOW_CONNECTIONS [=] разр_подключения ]
           [ CONNECTION LIMIT [=] предел_подключений ]
           [ IS_TEMPLATE [=] это_шаблон ] ]

Описание

CREATE DATABASE создает новую базу данных QHB.

Чтобы создать базу данных, текущий пользователь должен быть суперпользователем или иметь специальное право CREATEDB. Смотрите раздел CREATE ROLE .

По умолчанию новая база данных будет создана путем клонирования стандартной системной базы данных template1. Другой шаблон может быть задан указанием TEMPLATE имя. В частности, путем указания TEMPLATE template0, вы можете создать чистую базу данных, содержащую только стандартные объекты, предопределенные вашей версией QHB. Это полезно, если вы хотите избежать копирования любых локальных объектов установки, которые могли быть добавлены к template1.

Параметры

Имя

Имя создаваемой базы данных.

имя_пользователя

Имя пользователя(роли), которому будет принадлежать новая база данных, или DEFAULT чтобы использовать значение по умолчанию (а именно, пользователь, выполняющий команду). Чтобы создать базу данных, и сделать владельцем другую роль, необходимо быть прямым или косвенным членом этой роли или суперпользователем.

шаблон

Имя шаблона, из которого будет создана новая база данных, или значение DEFAULT чтобы использовать шаблон по умолчанию (template1).

кодировка

Кодировка набора символов для использования в новой базе данных. Укажите строковую константу (например, ’SQL_ASCII’), или целочисленный номер кодировки, или DEFAULT чтобы использовать кодировку по умолчанию (а именно, кодировку шаблона). Наборы символов, поддерживаемые сервером QHB, описаны в разделе Управление правилами сортировки. Смотрите ниже дополнительные ограничения.

категория_сортировки[@провайдер]

Порядок сортировки (LC_COLLATE), который будет использоваться в новой базе данных. Это влияет на порядок сортировки, применяемый к строкам, например в запросах с ORDER BY, а также порядок, используемый в индексах текстовых столбцов. По умолчанию используется порядок сортировки шаблона базы данных. Смотрите ниже дополнительные ограничения.

категория_типов_символов

Классификация символов (LC_CTYPE) которая будет использоваться в новой базе данных. Это влияет на классификацию символов, например, строчные, заглавные, цифры и т. п. По умолчанию используется классификация символов шаблона базы данных. Смотрите ниже дополнительные ограничения.

табл_пространство

Имя табличного пространства, которое будет связано с новой базой данных, или значение DEFAULT, чтобы использовать табличное пространство шаблона базы данных. Это табличное пространство будет табличным пространством по умолчанию, используемым для объектов, созданных в этой базе данных. Дополнительную информацию смотрите в разделе CREATE TABLESPACE.

разр_подключения

Если FALSE, то никто не может подключиться к этой базе данных. По умолчанию установлено значение TRUE, разрешающее подключения (за исключением случаев, ограниченных другими механизмами, такими как GRANT/REVOKE CONNECT).

предел_подключений

Сколько одновременных подключений может быть сделано к этой базе данных. -1 (по умолчанию) означает отсутствие ограничений.

это_шаблон

Если TRUE, то эта база данных может быть клонирована любым пользователем с правами CREATEDB; если значение FALSE (по умолчанию), то клонировать его могут только суперпользователи или владелец базы данных.

Дополнительные параметры могут быть записаны в любом порядке, а не только в порядке, показанном выше.

Примечания

Команда CREATE DATABASE не может быть выполнена внутри блока транзакций.

Ошибки вида "не удалось инициализировать каталог базы данных", скорее всего, связаны с недостаточными разрешениями на каталог данных, заполнением диска или другими проблемами в файловой системе.

Используйте команду DROP DATABASE для удаления базы данных.

Программа createdb является программой-оболочкой этой команды, предусмотренной для удобства.

Параметры конфигурации уровня базы данных (заданные через ALTER DATABASE) не копируются из шаблона базы данных.

Хотя можно скопировать базу данных, не только template1, указав ее имя в качестве шаблона, это не предназначено (пока) для использования в качестве универсального средства вроде «COPY DATABASE». Основное ограничение заключается в том, что во время ее копирования, никто не должен быть подключен к базе данных указанной в качестве шаблона. CREATE DATABASE завершится ошибкой, если при запуске команды есть другие подключения к этой базе; в противном случае новые соединения с базой данных шаблона будут заблокированы до завершения процесса CREATE DATABASE. Дополнительную информацию смотрите в разделе Базы данных шаблонов.

Кодировка набора символов, заданная для новой базы данных, должна быть совместима с выбранными параметрами локали (LC_COLLATE и LC_CTYPE). Если выбрана локаль С (или POSIX), то все кодировки разрешены, но для других настроек локали есть только одна кодировка, которая будет работать должным образом. (В Windows, однако, кодировка UTF-8 может использоваться с любой локалью). CREATE DATABASE данных позволяет суперпользователям указывать кодировку SQL_ASCII независимо от настроек локали, но этот выбор не рекомендуется и может привести к неправильному использованию функций символьной строки, если в базе данных хранятся данные, не совместимые с кодировкой локали.

Параметры кодировки и локали должны соответствовать параметрам шаблона базы данных , за исключением случаев, когда template0 используется в качестве шаблона. Это связано с тем, что другие базы данных могут содержать данные, не соответствующие указанной кодировке, или могут содержать индексы, порядок сортировки которых зависит от LC_COLLATE и LC_CTYPE. Копирование таких данных приведет к повреждению базы данных в соответствии с новыми настройками. template0 однако, как известно, не содержит никаких данных или индексов, которые могли бы быть затронуты.

Ограничение CONNECTION LIMIT применяется только приблизительно; если два новых сеанса начинаются примерно в то же время, когда для базы данных остается только одно «свободное место», возможно, что оба завершатся неудачей. Кроме того, ограничение не применяется к суперпользователям или фоновым рабочим процессам.

Примеры

Создание базы данных:

CREATE DATABASE lusiadas;

Создание базы данных sales, принадлежащей пользователю salesapp, с табличным пространством по умолчанию salesspace:

CREATE DATABASE sales OWNER salesapp TABLESPACE salesspace;

Создание базы данных music с другой локалью:

CREATE DATABASE music
    LC_COLLATE 'sv_SE.utf8' LC_CTYPE 'sv_SE.utf8'
    TEMPLATE template0;

В этом примере предложение TEMPLATE template0 необходимо, только если указанная локаль отличается от локали в template1. (В противном случае явное указание локали является избыточным).

Создание базы данных music2 с другой локалью и другой кодировкой символов:

CREATE DATABASE music2
    LC_COLLATE 'sv_SE.iso885915' LC_CTYPE 'sv_SE.iso885915'
    ENCODING LATIN9
    TEMPLATE template0;

Свойства кодировки должны соответствовать локали, иначе возникнет ошибка.

Обратите внимание, что имена локалей зависят от операционной системы, так что показанные выше команды могут не везде работать одинаково.

Совместимость

Команда CREATE DATABASE отсутствует в стандарте SQL. Базы данных эквивалентны каталогам, создание которых определяется реализацией.

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

ALTER DATABASE, DROP DATABASE


CREATE DOMAIN

CREATE DOMAIN - создать домен

Синтаксис

CREATE DOMAIN имя [ AS ] тип_данных
    [ COLLATE правило_сортировки ]
    [ DEFAULT выражение ]
    [ ограничение [ ... ] ]

Где ограничение  может быть:

[ CONSTRAINT имя_ограничения ]
{ NOT NULL | NULL | CHECK (выражение) }

Описание

CREATE DOMAIN создает новый домен. Домен по существу является типом данных с дополнительными ограничениями (ограничениями на допустимый набор значений). Пользователь, определяющий домен, становится его владельцем.

Если задано имя схемы (например, CREATE DOMAIN myschema.mydomain ...), домен создается в указанной схеме. В противном случае он создается в текущей схеме. Имя домена должно быть уникальным среди имен типов и доменов, существующих в его схеме.

Домены полезны для абстрагирования и вынесения общих характеристик разных полей в единое место для упрощения сопровождения. Например, несколько таблиц могут содержать столбцы адресов электронной почты, для проверки синтаксиса которых требуется одно и то же проверочное ограничение CHECK. Определите домен, а не устанавливайте ограничение каждой таблицы по отдельности.

Чтобы иметь возможность создать домен, текущий пользователь должен иметь право USAGE для нижележащего типа.

Параметры

Имя

Имя, которое может быть дополнено схемой, создаваемого домена.

тип_данных

Нижележащий тип данных домена. Может включать определение массива с этим типом.

правило_сортировки

Необязательные правила сортировки для домена. Если параметры сортировки не указаны, используются правила сортировки по умолчанию для нижележащего типа данных. Указать COLLATE можно, только если нижележащий тип данных является сортируемым.

DEFAULT выражение

Предложение DEFAULT задает значение по умолчанию для столбцов, типом данных которых является этот домен. Значением является любое выражение без переменной (но подзапросы не разрешены). Тип данных выражения по умолчанию должен соответствовать типу данных домена. Если значение по умолчанию не указано, то значением по умолчанию является значение null.

Выражение по умолчанию будет использоваться в любой операции вставки, которая не задает значение для столбца. Если для конкретного столбца определено значение по умолчанию, оно переопределяет все значения по умолчанию, связанные с доменом. В свою очередь, домен по умолчанию переопределяет любое значение по умолчанию, связанное с нижележащим типом данных.

CONSTRAINT имя_ограничения

Имя ограничения. Если не указано, система создает имя.

NOT NULL

Значения этого домена не могут быть пустыми NULL (но см. Примечания ниже).

NULL

Значения этого домена могут быть равны NULL. Это значение по умолчанию.

Это предложение предназначено только для обеспечения совместимости с нестандартными базами данных SQL. Его использование не рекомендуется в новых приложениях.

CHECK (выражение)

Предложения CHECK определяет ограничения целостности или проверки, которым должны удовлетворять значения домена. Каждое ограничение должно быть выражением, дающим логический результат Boolean. Проверяемое значение в этом выражении обозначается ключевым словом VALUE. Выражения, выдающие значение *TRUE или UNKNOWN, успешно выполняются. Если выражение выдаёт FALSE, появляется сообщение об ошибке и значение не может быть преобразовано в тип домена.

В настоящий момент, CHECK выражения не могут содержать вложенные запросы и ссылаться на другие переменные, кроме VALUE.

Когда домен имеет несколько CHECK ограничений, они будут проверены в алфавитном порядке по названию.

Примечания

Ограничения домена, в частности NOT NULL, проверяются при преобразовании значения в тип домена. Это из столбца, который номинально относится к типу домена, все же можно прочитать как NULL, несмотря на то, что существует такое ограничение. Например, это может произойти в запросе внешнего соединения, если столбец домена находится на стороне nullable внешнего соединения. Более тонкий пример:

INSERT INTO tab (domcol) VALUES ((SELECT domcol FROM tab WHERE false));

Пустой скалярный SELECT создаст NULL значение, которое считается доменным типом, поэтому к нему не применяется дополнительная проверка ограничений, и вставка будет выполнена успешно.

Очень трудно избежать таких проблем, из-за общего предположения SQL, что NULL значение является допустимым значением каждого типа данных. Поэтому рекомендуется разработать ограничения домена таким образом, чтобы разрешить значение NULL, а затем применить NOT NULL ограничения для столбцов типа домена по мере необходимости, а не непосредственно для типа домена.

QHB предполагает, что CHECK условия ограничений неизменны, то есть они всегда будут давать один и тот же результат для одного и того же входного значения. Это предположение оправдывает что ограничения CHECK проверяется только при первом преобразовании значения в тип домена, а не при каждом обращении к нему. (По сути таким же образом обрабатываются ограничения CHECK для таблиц, как описано в разделе Контрольные ограничения).

Примером распространенного способа нарушения является ссылка на определяемую пользователем функцию в ограничении CHECK, а затем изменение поведения этой функции. QHB не запрещает этого, но и не заметит, если есть сохраненные значения типа домена, которые теперь нарушают ограничение CHECK. Это приведет к сбою последующего дампа базы данных и перезагрузки. Рекомендуемый способ обработки такого изменения состоит в том, чтобы удалить ограничение (используя ALTER DOMAIN ), настроить определение функции и повторно добавить ограничение, тем самым перепроверив его относительно сохраненных данных.

Примеры

В этом примере создаётся тип данных us_postal_code (почтовый индекс США), который затем используется в определении таблицы. Для проверки значения на соответствие формату почтовых индексов США применяется проверка с регулярными выражениями:

CREATE DOMAIN us_postal_code AS TEXT
CHECK(
   VALUE ~ '^\d{5}$'
OR VALUE ~ '^\d{5}-\d{4}$'
);

CREATE TABLE us_snail_addy (
  address_id SERIAL PRIMARY KEY,
  street1 TEXT NOT NULL,
  street2 TEXT,
  street3 TEXT,
  city TEXT NOT NULL,
  postal us_postal_code NOT NULL
);

Совместимость

Команда CREATE DOMAIN соответствует стандарту SQL.

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

ALTER DOMAIN, DROP DOMAIN


CREATE EVENT TRIGGER

CREATE EVENT TRIGGER - создать событийный триггер

Синтаксис

CREATE EVENT TRIGGER имя
    ON событие
    [ WHEN переменная_фильтра IN (filter_value [, ... ]) [ AND ... ] ]
    EXECUTE { FUNCTION | PROCEDURE } имя_функции()

Описание

CREATE EVENT TRIGGER создает новый событийный триггер. Всякий раз, когда назначенное событие происходит и удовлетворяется, связанное с триггером условие WHEN (если такое имеется), функция триггера будет выполнена. Общие сведения о событийных триггерах см. в главе Триггеры событий. Пользователь, создающий событийный триггер, становится его владельцем.

Параметры

Имя

Имя, назначаемое новому триггер. Это имя должно быть уникальным в пределах базы данных.

событие

Имя события, которое вызывает срабатывание триггера и вызов функции. Дополнительную информацию об именах событий смотрите в разделе Поведение триггера событий.

переменная_фильтра

Имя переменной, используемой для фильтрации событий. Это позволяет ограничить запуск триггера подмножеством случаев, в которых он поддерживается. В настоящее время поддерживается только значение параметра переменная_фильтраTAG.

значение фильтра

Список значений для связанного параметра переменная_фильтра, для которых должен срабатывать триггер. Для переменной TAG это список меток команд (например, 'DROP FUNCTION').

имя_функции

Заданная пользователем функция, которая объявляется без аргументов и возвращающая тип event_trigger.

В синтаксисе: CREATE EVENT TRIGGER ключевые слова FUNCTION и PROCEDURE
эквивалентны, но указанная функция должна в любом случае быть функцией, а не процедурой. Использование ключевого слова PROCEDURE здесь поддерживается по историческим причинам и считается устаревшим.

Примечания

Только суперпользователи могут создавать событийные триггеры.

Событийные триггеры отключены в однопользовательском режиме (см. раздел Процесс qhb). Если ошибочный событийный триггер заблокировал базу данных так, что вы даже не можете удалить триггер, перезагрузите сервер в однопользовательском режиме, и вы сможете это сделать.

Примеры

CREATE OR REPLACE FUNCTION abort_any_command()
  RETURNS event_trigger
 LANGUAGE plpgsql
  AS $$
BEGIN
  RAISE EXCEPTION 'command % is disabled', tg_tag;
END;
$$;

CREATE EVENT TRIGGER abort_ddl ON ddl_command_start
   EXECUTE FUNCTION abort_any_command();

Совместимость

Команда CREATE EVENT TRIGGER отсутствует в стандарте SQL.

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

ALTER EVENT TRIGGER, DROP EVENT TRIGGER, CREATE FUNCTION


CREATE EXTENSION

CREATE EXTENSION - установить расширение

Синтаксис

CREATE EXTENSION [ IF NOT EXISTS ] имя_расширения
    [ WITH ] [ SCHEMA имя_схемы ]
             [ VERSION версия ]
             [ FROM старая_версия ]
             [ CASCADE ]

Описание

CREATE EXTENSION загружает новое расширение в текущую базу данных. В базе данных не должно быть загружено расширения с тем же именем.

Загрузка расширения по существу сводится к запуску скрипта расширения. Скрипт обычно создает новые объекты SQL, такие как функции, типы данных, операторы и методы поддержки индексов. CREATE EXTENSION дополнительно записывает идентификаторы всех созданных объектов, так что впоследствии их можно удалить, выполнив команду DROP EXTENSION.

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

Параметры

IF NOT EXISTS

Не выдавать ошибку, если расширение с тем же именем уже существует. В этом случае выдается соответствующее уведомление. Обратите внимание, что нет никакой гарантии, что существующее расширение как-то соотносится с тем, которое могло бы быть создано из текущего доступного скрипта.

имя_расширения

Имя устанавливаемого расширения. QHB создаст расширение, используя сведения из файла SHAREDIR/extension/имя_расширения.control.

имя схемы

Имя схемы, в которой будут устанавливаться объекты расширения, учитывая, что расширение позволяет перемещать его содержимое. Именованная схема уже должна существовать. Если этот параметр не указан, а в управляющем файле расширения также не указана схема, то используется текущая схема создания объекта по умолчанию.

Если в управляющем файле расширения задаётся параметр schema, заданную схему нельзя переопределить предложением SCHEMA. Обычно при указании предложения SCHEMA возникает ошибка, если эта схема конфликтует с параметром schema данного расширения. Однако, если также задано CASCADE , то в случае конфликта имя_схемы игнорируется. Заданное имя_схемы будет использоваться для установки любых необходимых расширений, если в их управляющем файле не указана schema .

Помните, что само расширение не считается частью какой-либо схемы: расширения имеют неполные имена, которые должны быть уникальными для всей базы данных. Но объекты, принадлежащие расширению, могут находиться внутри схем.

версия

Версия расширения. Её можно записать в виде идентификатора или строкового значения. Версия по умолчанию указана в управляющем файле расширения.

старая версия

Указание FROM старая_версия может быть добавлено, тогда и только тогда, когда устанавливаемое расширение заменяет модуль «старого стиля», представляющий собой просто набор объектов, не упакованный в расширение. Этот параметр заставляет CREATE EXTENSION запускать альтернативный скрипт установки, который собирает существующие объекты в расширение, а не создает новые объекты. Будьте осторожны, так как SCHEMA при этом определяет схему, содержащую эти существующие объекты.

Значение, задаваемое в качестве старой_версии, определяется автором расширения и может меняться, если в расширение нужно преобразовать не одну версию модуля в старом стиле. Для стандартных дополнительных модулей, поставляемых с QHB, при преобразовании модуля в расширение старая_версия должна содержать значение unpackaged.

CASCADE

Автоматически устанавливать все расширения, от которых зависит это расширение и которые еще не установлены. Их зависимости также устанавливаются автоматически, рекурсивно. Предложение SCHEMA, если указано, применяется ко всем расширениями, которые устанавливаются таким образом. Другие параметры инструкции не применяются к автоматически устанавливаемым расширениями; в частности, всегда выбираются их версии по умолчанию.

Примечания

Прежде чем использовать CREATE EXTENSION для загрузки расширения в базу данных, необходимо установить файлы его поддержки. Информацию об установке расширений, поставляемых с QHB, можно найти в разделе Расширения QHB.

Расширения, доступные в настоящее время для загрузки, можно найти из системных представлениях pg_available_extensions или pg_available_extension_versions.

Дополнительные сведения о создании новых расширений см. Упаковка связанных объектов в расширение.

Примеры

Установка расширения hstore в текущую базу данных:

CREATE EXTENSION hstore;

Преобразование установленного до версии 9.1 модуля hstore в расширение:

CREATE EXTENSION hstore SCHEMA public FROM unpackaged;

Будьте внимательны — здесь нужно указать схему, в которую ранее были установлены существующие объекты hstore.

Совместимость

CREATE EXTENSION является расширением QHB.

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

ALTER EXTENSION, DROP EXTENSION


CREATE FOREIGN DATA WRAPPER

CREATE FOREIGN DATA WRAPPER - создать новую обертку сторонних данных

Синтаксис

CREATE FOREIGN DATA WRAPPER имя
    [ HANDLER функция_обработчик | NO HANDLER ]
    [ VALIDATOR функция_проверки | NO VALIDATOR ]
    [ OPTIONS ( параметр 'значение' [, ... ] ) ]

Описание

CREATE FOREIGN DATA WRAPPER создает новую обертку сторонних данных. Пользователь, определяющий обертку сторонних данных, становится ее владельцем.

Имя обертки сторонних данных должно быть уникальным в пределах базы данных.

Только суперпользователи могут создавать обертки сторонних данных.

Параметры

Имя

Имя создаваемой обертки сторонних данных.

HANDLER функция_обработчик

В аргументе функция_обработчика указывается имя ранее зарегистрированной функции, которая будет вызвана для получения функций реализующих обращения к сторонним таблицам таблиц. Функция обработчика должна быть без аргументов, и ее возвращаемый тип должен быть fdw_handler.

Можно создать обертку сторонних данных без функции обработчика, но сторонние таблицы, использующие такую обертку, будут только объявлены, но не доступны.

VALIDATOR функция_проверки

функция_проверки это имя ранее зарегистрированной функции, которая будет вызвана для проверки общих параметров, передаваемых обертке сторонних данных, а также параметров для сторонних серверов, сопоставлений пользователей и сторонних таблиц, доступных через эту обертку сторонних данных. Если нет функции проверки или указано NO VALIDATOR, параметры не будут проверяться во время создания объектов. (Обертки сторонних данных, возможно, будут игнорировать или отклонять недопустимые спецификации параметров во время выполнения, в зависимости от реализации). Функция проверки должна принимать два аргумента: первый типа text[] (в нём содержится массив параметров, хранящихся в системном каталоге), а второй типа oid (в нём указывается OID системного каталога с этими параметрами). Возвращаемое значение игнорируется; функция должна сообщить о недопустимых параметрах с помощью системной функции ereport(ERROR).

OPTIONS ( параметр 'значение' [, ... ] )

Это предложение задает параметры для новой обертки сторонних данных. Имена параметров и значения являются специфичными для каждой обертки сторонних данных и проверяются с помощью функции проверки. Имена параметров должны быть уникальными.

Примечания

Функциональность работы со сторонними данными QHB все еще находится в стадии активного развития. Оптимизация запросов примитивна (и по большей части это тоже делает обертка). Таким образом, имеется поле для дальнейшего повышения производительности.

Примеры

Создание бесполезной обертки сторонних данных dummy:

CREATE FOREIGN DATA WRAPPER dummy;

Создание обертки сторонних данных file с функцией-обработчиком file_fdw_handler:

CREATE FOREIGN DATA WRAPPER file HANDLER file_fdw_handler;

Создание обертки сторонних данных mywrapper с параметрами:

CREATE FOREIGN DATA WRAPPER mywrapper
    OPTIONS (debug 'true');

Совместимость

CREATE FOREIGN DATA WRAPPER соответствует стандарту ISO / IEC 9075-9 (SQL/MED), за исключением того, что предложения HANDLER и VALIDATOR являются расширением, а стандартные предложения LIBRARY и LANGUAGE не реализованы в QHB.

Обратите внимание, однако, что функциональность SQL/MED в целом еще не соответствует.

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

ALTER FOREIGN DATA WRAPPER, DROP FOREIGN DATA WRAPPER, CREATE SERVER, CREATE USER MAPPING, CREATE FOREIGN TABLE


CREATE FOREIGN TABLE

CREATE FOREIGN TABLE - создать стороннюю таблицу

Синтаксис

CREATE FOREIGN TABLE [ IF NOT EXISTS ] имя_таблицы ( [
  { имя_столбца тип_данных [ OPTIONS ( параметр 'значение' [, ... ] ) ] [ COLLATE правило_сортировки ] [ ограничение_столбца [ ... ] ]
    | ограничение_таблицы }
    [, ... ]
] )
[ INHERITS ( таблица_родитель [, ... ] ) ]
  SERVER имя_сервера
[ OPTIONS ( параметр 'значение' [, ... ] ) ]

CREATE FOREIGN TABLE [ IF NOT EXISTS ] имя_таблицы
  PARTITION OF таблица_родитель [ (
  { имя_столбца [ WITH OPTIONS ] [ ограничение_столбца [ ... ] ]
    | ограничение_таблицы }
    [, ... ]
) ] указание_границ_партиции
  SERVER имя_сервера
[ OPTIONS ( параметр 'значение' [, ... ] ) ]

Где ограничение_столбца может быть:

[ CONSTRAINT имя_ограничения ]
{ NOT NULL |
  NULL |
  CHECK ( выражение ) [ NO INHERIT ] |
  DEFAULT выражение_по_умолчанию |
  GENERATED ALWAYS AS ( генерирующее_выражение ) STORED }

Где ограничение_таблицы может быть:

[ CONSTRAINT имя_ограничения ]
CHECK ( выражение ) [ NO INHERIT ]

Описание

CREATE FOREIGN TABLE создает новую стороннюю таблицу в текущей базе данных. Таблица будет принадлежать пользователю, выполнившему эту команду.

Если задано имя схемы (например, CREATE FOREIGN TABLE myschema.mytable ...), таблица создается в указанной схеме. В противном случае она создается в текущей схеме. Имя сторонней таблицы должно отличаться от имени любой другой сторонней таблицы, таблицы, последовательности, индекса, представления или материализованного представления в той же схеме.

CREATE FOREIGN TABLE также автоматически создает составной тип данных, соответствующий одной строке сторонней таблицы. Таким образом, сторонние таблицы не могут иметь то же имя, что и любой существующий тип данных в той же схеме.

Если указано предложение PARTITION OF, таблица создается в виде партиции parent_table с заданными границами.

Чтобы создать стороннюю таблицу, необходимо иметь право USAGE для стороннего сервера, а также право USAGE для всех типов столбцов, содержащихся в таблице.

Параметры

IF NOT EXISTS

Не считать ошибкой, если отношение с таким именем уже существует. В этом случае выдается соответствующее уведомление. Обратите внимание, что нет никакой гарантии, что существующее отношение как-то соотносится с тем, которое могло бы быть создано.

имя_таблицы

Имя, которое может быть дополнено схемой, создаваемой таблицы.

имя_столбца

Имя столбца, который будет создан в новой таблице.

тип_данных

Тип данных столбца. Может включать определение массива с этим типом. Дополнительную информацию о типах данных, поддерживаемых QHB, смотрите в главе Типы данных.

COLLATE правило_сортировки

Предложение COLLATE назначает правило сортировки для столбца (который должен иметь сопоставимый тип данных). Если параметр не указан, используются правила сортировки по умолчанию для типа данных столбца.

INHERITS ( таблица_родитель [, ... ] )

Необязательное предложение INHERITS задает список таблиц, из которых новая сторонняя таблица автоматически наследует все столбцы. Родительские таблицы могут быть простыми таблицами или сторонними таблицами. Смотрите аналогичную форму CREATE TABLE для получения более подробной информации.

PARTITION OF таблица_родитель FOR VALUES указание_границ_партиции*

Эта форма может быть использована для создания сторонней таблицы в качестве партиции указанной родительской таблицы с заданными граничными значениями. Смотрите аналогичную форму CREATE TABLE для получения более подробной информации. Обратите внимание, что в настоящее время не разрешается создавать стороннюю таблицу в качестве партиции родительской таблицы, если в этой таблице есть уникальные индексы (UNIQUE). (См. также раздел ALTER TABLE ATTACH PARTITION).

CONSTRAINT имя_ограничения

Необязательное имя столбца или для ограничения таблицы. Если ограничение нарушается, имя ограничения присутствует в сообщениях об ошибках, поэтому имена ограничений, такие как столбец должен быть положительным могут использоваться для передачи полезной информации о ограничениях клиентским приложениям. (Имена ограничений, включающие пробелы, необходимо заключать в двойные кавычки). Если имя ограничения не указано, система генерирует имя автоматически.

NOT NULL

Столбец не может содержать значения NULL.

NULL

Столбец может содержать значения NULL. Это значение по умолчанию.

Этот пункт предусмотрен только для обеспечения совместимости с нестандартными базами данных SQL. Его использование не рекомендуется в новых приложениях.

CHECK ( выражение ) [ NO INHERIT ]

Предложение CHECK задает выражение, производящее логический boolean результат, которому должна удовлетворять каждая строка во сторонней таблице; то есть выражение должно выдавать TRUE или UNKNOWN, а не FALSE, для всех строк в сторонней таблице. Проверочное ограничение, указанное в качестве ограничения столбца, должно ссылаться только на значение этого столбца, в то время как выражение, указанное в ограничении таблицы, может ссылаться на несколько столбцов.

В настоящий момент, выражения CHECK не могут содержать вложенные запросы и ссылаться на переменные, отличные от столбцов текущей строки. Также допустима ссылка на системный столбец tableoid, но не на другие системные столбцы..

Ограничение, с пометкой NO INHERIT не будет наследоваться дочерними таблицами.

DEFAULT выражение_по_умолчанию

Предложение DEFAULT задает значение по умолчанию для столбца, в определении которого оно присутствует. Значением является любое выражение без переменных (подзапросы и перекрестные ссылки на другие столбцы текущей таблицы не допускаются). Тип данных выражения по умолчанию должен соответствовать типу данных столбца.

Выражение по умолчанию будет использоваться в любой операции вставки, в которой не задано значение для столбца. Если для столбца не задано значение по умолчанию, то значение по умолчанию равно NULL.

GENERATED ALWAYS AS ( генерирующее_выражение ) STORED

Это предложение создает столбец как генерируемый. В такой столбец нельзя записать данные, а при чтении его возвращается результат указанного выражения

Ключевое слово STORED отмечает, что столбец будет вычисляться при записи. (Вычисленное значение будет передаваться обертке сторонних данных для сохранения, и должно будет возвращено оберткой при чтении).

Генерирующее выражение может ссылаться на другие столбцы в таблице, но не на другие генерируемые столбцы. Все функции и операторы в нём должны быть постоянными. Ссылки на другие таблицы не допускаются.

имя_сервера

Имя существующего стороннего сервера, используемого для сторонней таблицы. Дополнительные сведения об определении сервера см. CREATE SERVER .

OPTIONS ( параметр 'значение' [, ...] )

Параметры, которые будут связаны с новой сторонней таблицей или одним из ее столбцов. Разрешенные имена параметров и их значений являются специфичными для каждой обертки сторонних данных, и проверяются с помощью функции проверки обертки сторонних данных. Имена параметров не должны повторяться (хотя параметр таблицы и параметр столбца, могут иметь одно и то же имя).

Примечания

Ограничения сторонних таблицы (такие как CHECK или NOT NULL) не контролируются ядром системы QHB, и большинство оберток сторонних данных также не пытаются их контролировать; то есть система просто предполагает, что ограничение выполняется. Контролировать такое ограничение не имело бы большого смысла, поскольку оно будет применяться только к строкам, вставленным или обновленным через стороннюю таблицу, а не к строкам, измененным другими средствами, например непосредственно на удаленном сервере. Вместо этого ограничение, связанное со сторонней таблицей, должно представлять собой ограничение, применяемое удаленным сервером.

Некоторые специальные обертки сторонних данных могут быть единственным механизмом доступа к данным, к которым они обращаются, и в этом случае может быть целесообразно, чтобы обертка сторонних данных сама выполняла контроль применения ограничений. Но не следует полагать, что какая-либо о бёртка ведёт себя так, если об этом не сказано явно в её документации.

Хотя QHB не пытается контролировать ограничения для сторонних таблиц, она предполагает, что они выполняются для целей оптимизации запросов. Если есть строки, видимые в сторонней таблице, которые не удовлетворяют объявленному ограничению, запросы к таблице могут могут выдавать некорректные результаты. Ответственность за то, чтобы выполнялись условия ограничения, несет пользователь.

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

Хотя строки могут быть перемещены из локальных партиций в партицию сторонней таблицы (при условии, что обертка сторонних данных поддерживает маршрутизацию кортежей), они не могут быть перемещены из партиции сторонней таблицы в другую партицию.

Примеры

Создание сторонней таблицы films, которая будет доступна через сервер film_server:

CREATE FOREIGN TABLE films (
    code        char(5) NOT NULL,
    title       varchar(40) NOT NULL,
    did         integer NOT NULL,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute
)
SERVER film_server;

Создание сторонней таблицы measurement_y2016m07, которая будет доступна через сервер server_07, в виде партиции таблицы measurement, партиционированной по диапазонам:

CREATE FOREIGN TABLE measurement_y2016m07
    PARTITION OF measurement FOR VALUES FROM ('2016-07-01') TO ('2016-08-01')
    SERVER server_07;

Совместимость

Команда CREATE FOREIGN TABLE в значительной степени соответствует стандарту SQL; однако, так же, как и CREATE TABLE, она допускает ограничения NULL и сторонние таблицы без столбцов. Возможность указать значения столбца по умолчанию также является расширением QHB. Наследование таблиц в форме, определенной QHB, не соответствует стандарту.

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

ALTER FOREIGN TABLE, DROP FOREIGN TABLE, CREATE TABLE, CREATE SERVER, IMPORT FOREIGN SCHEMA


CREATE FUNCTION

CREATE FUNCTION - создать функцию

Синтаксис

CREATE [ OR REPLACE ] FUNCTION
    имя ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [ { DEFAULT | = } выражение_по_умолчанию ] [, ...] ] )
    [ RETURNS тип_результата
      | RETURNS TABLE ( имя_столбца тип_столбца [, ...] ) ]
  { LANGUAGE имя_языка
    | TRANSFORM { FOR TYPE имя_типа } [, ... ]
    | WINDOW
    | IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF
    | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
    | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
    | PARALLEL { UNSAFE | RESTRICTED | SAFE }
    | COST стоимость_выполнения
    | ROWS строк_в_результате
    | SUPPORT вспомогательная_функция
    | SET параметр_конфигурации { TO значение | = значение | FROM CURRENT }
    | AS 'определение'
    | AS 'объектный_файл', 'объектный_символ'
  } ...

Описание

CREATE FUNCTION создает новую функцию. CREATE OR REPLACE FUNCTION будет либо создавать новую функцию, либо заменять определение существующей. Чтобы определить функцию, необходимо иметь право USAGE для соответствующего языка.

Если указано имя схемы, то функция создается в указанной схеме. В противном случае он создается в текущей схеме. Имя новой функции не должно совпадать ни с одной существующей функцией или процедурой с теми же типами входных аргументов в этой же схеме. Однако функции и процедуры с различными типов аргументов могут иметь одно имя (это называется перегрузкой ).

Чтобы заменить текущее определение существующей функции, используйте CREATE OR REPLACE FUNCTION. Но учтите, что команда не позволяет изменить имя или аргументы функции (если вы попытаетесь, вы фактически создадите новую, независимую функцию). Кроме того, CREATE OR REPLACE FUNCTION не позволит изменить тип возвращаемого значения существующей функции. Для этого необходимо удалить и создать функцию снова. (Это означает, что если функция имеет выходные параметры (OUT), то изменить типы параметров OUT можно, только удалив функцию).

Когда CREATE OR REPLACE FUNCTION используется для замены существующей функции, права доступа функции не изменяются. Всем остальным свойствам функции присваиваются значения указанные, в команде или значения по умолчанию. Чтобы заменить функцию, необходимо быть её владельцем (или быть членом роли-владельца).

Если вы удаляете и снова создаете функцию, новая функция будет другой сущностью; вам придется также удалить существующие правила, представления, триггеры и т. д., все что относится к старой функции. Поэтому чтобы изменить определение функции, не нарушая объекты, ссылающиеся на эту функцию. используйте команду CREATE OR REPLACE FUNCTION. Кроме того, многие дополнительные свойства существующей функции можно изменить с помощью ALTER FUNCTION.

Пользователь, создавший функцию, становится ее владельцем.

Чтобы создать функцию, необходимо иметь право USAGE для типов её аргументов и возвращаемого типа.

Параметры

Имя

Имя, которое может быть дополнено схемой, создаваемой функции.

режим_аргумента

Режим аргумента: IN (входной), OUT (выходной), INOUT (входной и выходной) или VARIADIC (переменный). Если этот параметр опущен, значение по умолчанию равно IN. За единственным аргументом VARIADIC могут следовать только аргументы OUT. Также, аргументы OUT и INOUT нельзя использовать с предложением RETURNS TABLE.

имя_аргумента

Название аргумента. Некоторые языки (включая SQL и PL/pgSQL) позволяют использовать это имя в теле функции. Для других языков имя входного аргумента является просто дополнительным описанием, если говорить о самой функции; но вы можете использовать имена входных аргументов при вызове функции для улучшения читаемости (см. раздел Вызов функции). В любом случае имя выходного аргумента является значимым, поскольку оно определяет имя столбца в типе результата. (Если вы опустите имя для выходного аргумента, система выберет имя столбца по умолчанию).

тип_аргумента

Тип (ы) данных аргументов функции (возможно, дополненный схемой), если таковые имеются. Типы аргументов могут быть базовыми, составными или доменными типами, а также могут ссылаться на тип столбца таблицы.

В зависимости от языка реализации также может быть разрешено указывать "псевдотипы", такие как cstring. Псевдотипы указывают, что фактический тип аргумента либо указан не полностью, либо находится вне набора обычных типов данных SQL.

Ссылка на тип столбца записывается в виде имя_таблицы.имя_столбца%TYPE. Использование такой записи иногда может помочь сделать функцию независимой от изменений в определении таблицы.

выражение_по_умолчанию

Выражение, которое будет использоваться в качестве значения по умолчанию, если параметр не указан. Результат выражения должен сводиться к типу соответствующего параметра. Только входные данные (включая INOUT) параметры могут иметь значение по умолчанию. Все входные параметры, следующие за параметром со значением по умолчанию, также должны иметь значения по умолчанию.

тип_результата

Возвращаемый тип данных (возможно, дополненный схемой). Тип возвращаемого значения может быть базовым, составным или доменным, а также может ссылаться на тип столбца таблицы. В зависимости от языка реализации также может быть разрешено указывать "псевдотипы", такие как cstring. Если функция не должна возвращать значение, укажите void в качестве возвращаемого типа.

В случае наличия параметров OUT или INOUT, предложение RETURNS можно опустить. Если он присутствует, то должен быть согласован с типом результата, подразумеваемым выходными параметрами: в качестве возвращаемого типа указывается RECORD, если выходных параметров несколько, либо тип единственного выходного параметра.

Указание SETOF показывает, что функция возвращает множество, а не единственный элемент.

Ссылка на тип столбца записывается в виде имя_таблицы.имя_столбца%TYPE.

имя_столбца

Имя выходного столбца в записи RETURNS TABLE. Это фактически еще один способ объявления именованного выходного параметра (OUT), но RETURNS TABLE также подразумевает и RETURNS SETOF.

тип_столбца

Тип данных выходного столбца в записи RETURNS TABLE.

имя_языка

Имя языка, на котором реализована функция. Это может быть sql, c, internal, или имя определяемого пользователем процедурного языка, например plpgsql. Заключать имя в одинарные кавычки не рекомендуется и требует соответствующего регистра.

TRANSFORM { FOR TYPE имя_типа } [, ... ] }

Устанавливает список трансформаций, должны применяться при вызове функции. Трансформации выполняют преобразования между типами SQL и языковыми типами данных; см. CREATE TRANSFORM. Преобразования встроенных типов обычно жёстко предопределены в реализациях процедурных языков, так что их здесь указывать не нужно. Если реализация процедурного языка не знает, как обрабатывать тип, и трансформация не предоставляется, будет выполнено преобразование типов данных по умолчанию, но это зависит от реализации.

WINDOW

WINDOW указывает, что функция является оконной функцией, а не простой функцией. В настоящее время имеет смысл только для функций, написанных на языке C. Указание WINDOW не может быть изменено при изменении существующего определения функции.

IMMUTABLE
STABLE
VOLATILE

Эти атрибуты информируют оптимизатор запросов о поведении функции. Одновременно можно указать не более одного атрибута. Если ни один из них не указан, по умолчанию предполагается VOLATILE.

IMMUTABLE(постоянная) указывает, что функция не может изменять базу данных и всегда возвращает один и тот же результат при заданных значениях аргумента; то есть она не выполняет поиск в базе данных или иным образом не использует информацию, представленную непосредственно в ее списке аргументов. Если эта опция задана, то любой вызов функции со всеми постоянными аргументами может быть немедленно заменен значением функции.

STABLE(стабильная) указывает, что функция не может изменять базу данных и что в рамках одного сканирования таблицы она будет последовательно возвращать один и тот же результат для одних и тех же значений аргумента, но что его результат может изменяться в разных инструкциях SQL. Это подходящий выбор для функций, результаты которых зависят от содержимого базы данных и настраиваемых параметров(таких как текущий часовой пояс) и т. д. (Но этот вариант не подходит для триггеров AFTER, желающих прочитать строки, изменённые текущей командой). Также обратите внимание, что функций семейства current_timestamp считается стабильными, так как их результаты не изменяются в рамках транзакции.

VOLATILE(изменчивая) указывает, что значение функции может изменяться даже в пределах одного сканирования таблицы, поэтому ее вызовы не могут быть оптимизированы. Относительно немногие функции базы данных являются изменчивыми в этом смысле; например: random(), currval() и timeofday(). Но обратите внимание, что любая функция, которая имеет побочные эффекты, должна быть классифицирована как VOLATILE, даже если ее результат вполне предсказуем, чтобы предотвратить оптимизацию вызовов; примером является setval().

Дополнительные сведения см. в разделе Категории волатильности функций.

LEAKPROOF

LEAKPROOF(герметичная) указывает, что функция не имеет никаких побочных эффектов. Она не раскрывает никакой информации о своих аргументах, кроме своего возвращаемого значения. Например, функция, которая выдает сообщение об ошибке для некоторых значений аргументов, или которая включает значения аргументов в сообщения об ошибке, не является герметичной. Это влияет на то, как система выполняет запросы к представлениям, созданным с барьером безопасности security_barrier, или таблицам с включенной защитой на уровне строк. Система будет принудительно применять условия из политик защиты и представлений с барьерами безопасности перед любыми условиями, которые пользователь задает в запросе, и в которых задействуются негерметичные функции, чтобы предотвратить непреднамеренное раскрытие данных. Функции и операторы, помеченные как герметичные, считаются надежными и могут выполняться до выполнения условий из политик защиты и представлений с барьерами безопасности. Кроме того, функции, которые не имеют аргументов, или которым не передаются какие-либо аргументы из представления с барьерами безопасности, или таблицы, не требуется помечать как герметичные, чтобы они выполнялись до условий, связанных с безопасностью. См. CREATE VIEW и Система правил QHB.

Этот параметр может быть установлен только суперпользователем.

CALLED ON NULL INPUT
RETURNS NULL ON NULL INPUT
STRICT

CALLED ON NULL INPUT (по умолчанию) указывает, что функция будет вызываться как обычно, когда некоторые из ее аргументов равны NULL. В этом случае ответственность за проверку значений NULL и соответствующую их обработку, если это необходимо, несет автор функции.

RETURNS NULL ON NULL INPUT или STRICT указывает, что функция всегда возвращает значение NULL, когда любой из ее аргументов равен NULL. Если этот параметр указан, функция не выполняется при наличии NULL аргументов; вместо этого автоматически принимается результат NULL.

[EXTERNAL] SECURITY INVOKER
[EXTERNAL] SECURITY DEFINER

Характеристика SECURITY INVOKER (безопасность вызывающего) указывает, что функция должна выполняться с правами вызывающего ее пользователя. Это значение по умолчанию. Вариант SECURITY DEFINER (безопасность определившего) указывает, что функция должна выполняться с правами пользователя, которому она принадлежит(владельца).

Ключевое слово EXTERNAL (внешняя) допускается для соответствия стандарту SQL, но является необязательным, так как, в отличие от SQL, эта характеристика распространяется на все функции, а не только внешние.

PARALLEL

Указание PARALLEL UNSAFE означает, что функция не может быть выполнена в параллельном режиме, и наличие такой функции в инструкции SQL приводит к последовательному плану выполнения. Это значение по умолчанию. Указание PARALLEL RESTRICTED означает, что функция может выполняться в параллельном режиме, но только в ведущем процессе группы. PARALLEL SAFE указывает, что функция безопасна для работы в параллельном режиме без ограничений.

Функции должны быть помечены как небезопасные для параллельного выполнения (PARALLEL UNSAFE), если они изменяют состояние базы данных, или если они вносят изменения в транзакцию, например, используя подтранзакции, или если они обращаются к последовательностям или пытаются сохранять параметры (например, используя setval). Функции должны быть помечены как ограниченно параллельные(PARALLEL RESTRICTED), если они обращаются к временным таблицам, состоянию клиентского подключения, курсорам, подготовленным операторам или разнообразному состоянию обслуживающего процесса, которые система не может синхронизировать в параллельном режиме (например, setseed может выполнять только ведущий процесс группы, так как изменения, внесённые другим процессом, не передаются ведущему). В общем случае, если функция помечена как безопасная(PARALLEL SAFE), тогда как она является ограниченной или небезопасной, либо если она помечена как ограниченно безопасная, не являясь безопасной, она может выдавать ошибки или давать неправильные результаты при использовании в параллельном запросе. Функции на языке C теоретически могут демонстрировать совершенно неопределенное поведение при неправильной маркировке, поскольку система не может защитить себя от произвольного кода на C, но в большинстве случаев результат будет не хуже, чем для любой другой функции. Если вы сомневаетесь, функции следует помечать как UNSAFE, что является значением по умолчанию.

COST стоимость_выполнения*

Положительное число, задающее примерную стоимость выполнения функции, в единицах cpu_operator_cost. Если функция возвращает множество, то это стоимость за возвращенную строку. Если стоимость не указана, то принимается 1 единица для функций языка C и внутренних функций, и 100 единиц для функций на всех других языках. Большие значения заставляют планировщик пытаться избегать оценки функции чаще, чем это необходимо.

ROWS строк_в_результате*

Положительное число, задающее примерное количество строк, которое планировщик будет ожидать от функции на выходе. Это указание допустимо, только в том случае, если функция объявлена возвращающей множество. Предполагаемое по умолчанию значение — 1000 строк.

SUPPORT вспомогательная_функция*

Имя, которое может быть дополнено схемой, вспомогательной функции для планировщика, используемой для этой функции. Дополнительную информацию смотрите в разделе Информация по оптимизации функций. Текущий пользователь должен быть суперпользователем, чтобы использовать эту опцию.

параметр_конфигурации
значение

Предложение SET определяет, что при вызове функции указанный параметр конфигурации должен принять заданное значение, а затем восстановить своё предыдущее значение при завершении функции. Предложение SET FROM CURRENT сохраняет в качестве значения, которое будет применено при входе в функцию, значение, действующее при выполнении CREATE FUNCTION.

Если в определение функции добавлено SET, то действие команды SET LOCAL, выполняемой внутри функции для того же параметра, ограничивается функцией: предыдущее значение параметра конфигурации восстанавливается по завершении функции. Однако, обычная команда SET (без LOCAL) переопределяет значение SET, как и предыдущую команду SET LOCAL: эффекты команды сохраняется после завершения функции, если текущая транзакция не будет откачена.

Дополнительную информацию о разрешенных именах и значениях параметров смотрите в разделе SET и главе Конфигурация сервера.

определение

Строковая константа, определяющая функцию; значение зависит от языка. Это может быть имя внутренней функции, путь к объектному файлу, команда SQL или код функции на процедурном языке.

Часто бывает полезно заключать определение функции в доллары (см. раздел Строковые константы в долларовых кавычках ), а не в традиционные апострофы. Если не использовать доллары? любые одиночные кавычки или обратные косые черты в определении функции должны быть экранированы путем их удвоения.

объектный_файл, объектный_символ*

Это форма предложения AS используется для динамически загружаемых функций языка C, когда имя функции в исходном коде языка C не совпадает с именем функции SQL. Строка объектный_файл является именем файла разделяемой библиотеки, содержащего скомпилированную функцию C, и интерпретируется как параметр команды LOAD. Строка объектный_символ задаёт символ скомпонованной функции, то есть имя функции в исходном коде языка C. Если символ ссылки опущен, предполагается, что он совпадает с именем определяемой функции SQL. В C имена всех функций должны быть разными, поэтому вы должны давать перегруженным функциям C разные имена (например, включать в имена C обозначения типов аргументов).

При повторных вызовах CREATE FUNCTION ссылается на один и тот же объектный файл, который загружается только один раз за сеанс. Чтобы выгрузить и перезагрузить файл (возможно, во время разработки), запустите новый сеанс.

Дополнительную информацию о функциях записи см. в разделе Пользовательские функции.

Перегрузка

QHB допускает перегрузку функций; то есть одно и то же имя может использоваться для нескольких различных функций, если они имеют различные типы входных аргументов. Независимо от того, используете ли вы это, эта возможность требует предосторожности при вызове функций в базах данных, где одни пользователи не доверяют другим пользователям см. Перегрузка функций.

Две функции считаются одинаковыми, если они имеют одинаковые имена и типы входных аргументов, параметры OUT игнорируются. Так например эти декларации конфликтуют:

CREATE FUNCTION foo(int) ...
CREATE FUNCTION foo(int, out text) ...

Функции, которые имеют разные списки типов аргументов, не будут считаться конфликтующими во время создания, но предоставленные для них значения по умолчанию могут вызвать конфликт в момент использования. Например, рассмотрим

CREATE FUNCTION foo(int) ...
CREATE FUNCTION foo(int, int default 42) ...

Вызов foo(10) завершится ошибкой из-за неоднозначности в выборе вызываемой функции.

Примечания

В объявлении аргументов функции и возвращаемого значения допускается полный синтаксис описания типа SQL. Однако, заключенные в скобки модификаторы типа (например, поле точности для типа numeric) команда CREATE FUNCTION не учитывает. Так например: CREATE FUNCTION foo (varchar(10)) ... это то же самое что и CREATE FUNCTION foo (varchar) ....

При замене существующей функции с помощью CREATE OR REPLACE FUNCTION существуют ограничения на изменение имен параметров. Вы не можете изменить имя, уже присвоенное какому-либо входному параметру (хотя вы можете добавить имена к параметрам, которые ранее не имели имени). Если существует несколько выходных параметров, вы не можете изменить имена выходных параметров, поскольку это приведет к изменению имен столбцов анонимного составного типа, описывающего результат функции. Эти ограничения применяются для обеспечения того, чтобы вызовы функции не прекращали работу после ее замене.

Если функция объявлена как STRICT с аргументом VARIADIC, при оценивании строгости проверяется, что весь переменный массив в целом не NULL. Функция будет по-прежнему вызываться, если массив содержит NULL элементы.

Примеры

Ниже приведено несколько простых вводных примеров. За дополнительными сведениями и примерами обратитесь к разделу Написание триггерных функций в C.

CREATE FUNCTION add(integer, integer) RETURNS integer
    AS 'select $1 + $2;'
    LANGUAGE SQL
    IMMUTABLE
    RETURNS NULL ON NULL INPUT;

Функция увеличения целого числа на 1, использующая именованный аргумент, на языке PL/pgSQL:

CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $$
        BEGIN
                RETURN i + 1;
        END;
$$ LANGUAGE plpgsql;

Функция, возвращающая запись с несколькими выходными параметрами:

CREATE FUNCTION dup(in int, out f1 int, out f2 text)
    AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
    LANGUAGE SQL;

SELECT * FROM dup(42);

То же самое можно сделать более развёрнуто, явно объявив составной тип:

CREATE TYPE dup_result AS (f1 int, f2 text);

CREATE FUNCTION dup(int) RETURNS dup_result
    AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
    LANGUAGE SQL;

SELECT * FROM dup(42);

Ещё один способ вернуть несколько столбцов — применить функцию TABLE:

CREATE FUNCTION dup(int) RETURNS TABLE(f1 int, f2 text)
    AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
    LANGUAGE SQL;

SELECT * FROM dup(42);

Однако пример с TABLE отличается от предыдущих, так как в нём функция на самом деле возвращает не одну, а набор записей.

Разработка защищённых функций SECURITY DEFINER

Так как функция SECURITY DEFINER выполняется с правами пользователя, владеющего ей, необходимо позаботиться о том, чтобы функция не могла быть использована не по назначению. Для обеспечения безопасности, в пути search_path должно быть установлено, исключение любых схемы, доступных для записи ненадежными пользователями. Это предотвращает создание злоумышленниками объектов (например, таблиц, функций и операторов), маскирующих объекты, предназначенные для использования функцией. Особенно важной в этом отношении является схема временной таблицы, которая по умолчанию ищется первой и обычно доступна для записи любым пользователям. Соответствующую защиту можно организовать, поместив временную схему в конец списка поиска. Чтобы сделать это, следует сделать pg_temp последней записью в search_path. Эта функция иллюстрирует безопасное использование:

CREATE FUNCTION check_password(uname TEXT, pass TEXT)
RETURNS BOOLEAN AS $$
DECLARE passed BOOLEAN;
BEGIN
        SELECT  (pwd = $2) INTO passed
        FROM    pwds
        WHERE   username = $1;

        RETURN passed;
END;
$$  LANGUAGE plpgsql
    SECURITY DEFINER
    -- Установить безопасный путь поиска: сначала доверенная схема(ы), затем 'pg_temp'.
    SET search_path = admin, pg_temp;

Эта функция должна обращаться к таблице admin.pwds, но без предложения SET или с предложением SET, включающим только admin, её можно «обмануть», создав временную таблицу pwds.

Еще один момент, который следует иметь в виду, - это то, что по умолчанию право выполнения для создаваемых функций имеет роль PUBLIC (см. дополнительную информацию в разделе Права). Однако часто требуется разрешить доступ к функциям, работающим в контексте определившего, только некоторым пользователям. Для этого необходимо отозвать стандартные права PUBLIC, а затем предоставить права выполнения выборочно. Чтобы избежать появления окна, в котором новая функция доступна для всех, создайте ее и установите права доступа в рамках одной транзакции. Например:

BEGIN;
CREATE FUNCTION check_password(uname TEXT, pass TEXT) ... SECURITY DEFINER;
REVOKE ALL ON FUNCTION check_password(uname TEXT, pass TEXT) FROM PUBLIC;
GRANT EXECUTE ON FUNCTION check_password(uname TEXT, pass TEXT) TO admins;
COMMIT;

Совместимость

В стандарте SQL команда CREATE FUNCTION определена. Реализация в QHB аналогична, но совместима не полностью. К отличиям относятся непереносимые атрибуты, а также поддержка различных языков.

Для обеспечения совместимости с некоторыми другими системами баз данных, режим_аргумента можно записать после имя_аргумента или перед ним. Но только первый способ соответствует стандартам.

Для определения значений параметров по умолчанию, стандарт SQL поддерживает только синтаксис с помощью ключевого слова DEFAULT. Синтаксис со знаком = используется в T-SQL и Firebird.

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

ALTER FUNCTION, DROP FUNCTION, GRANT, LOAD, REVOKE


CREATE GROUP

CREATE GROUP - создать роль в базе данных

Синтаксис

CREATE GROUP имя [ [ WITH ] параметр [ ... ] ]

Где параметр:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | [ ENCRYPTED ] PASSWORD 'пароль'
    | VALID UNTIL 'дата_время'
    | IN ROLE имя_роли [, ...]
    | IN GROUP имя_роли [, ...]
    | ROLE имя_роли [, ...]
    | ADMIN имя_роли [, ...]
    | USER имя_роли [, ...]
    | SYSID uid

Описание

CREATE GROUP теперь является синонимом команды CREATE ROLE.

Совместимость

Команда CREATE GROUP отсутствует в стандарте SQL.

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

CREATE ROLE


CREATE INDEX

CREATE INDEX - создать индекс

Синтаксис

CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] имя ] ON [ ONLY ] имя_таблицы [ USING метод ]
    ( { имя_столбца | ( выражение ) } [ COLLATE правило_сортировки ] [ класс_операторов ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
    [ INCLUDE ( имя_столбца [, ...] ) ]
    [ WITH ( параметр_хранения = значение [, ... ] ) ]
    [ TABLESPACE табл_пространство ]
    [ WHERE предикат ]

Описание

CREATE INDEX создает индекс по указанному столбцу(ам) заданного отношения, которое может быть таблицей или материализованным представлением. Индексы в основном используются для повышения производительности базы данных (хотя неправильное использование может привести к снижению производительности).

Ключевые поля для индекса указываются в виде имен столбцов или же в виде выражений, заключенных в круглых скобках. Если метод индекса поддерживает составные индексы, можно указать несколько полей.

Поле индекса может быть выражением, вычисленным из значений одного или нескольких столбцов строки таблицы. Эта функция может быть использована для быстрого доступа к данным на основе некоторого преобразования входных данных. Например, индекс, построенный по выражению upper(col) позволит использовать поиск по индексу в предложении WHERE upper(col) = 'JIM'.

QHB предоставляет следующие методы индексов B-дерево, хеш, GiST, SP-GiST, GIN и BRIN. Пользователи также могут определять свои собственные методы индексирования, но это довольно сложно.

Когда в команде присутствует предложение WHERE предложение создается частичный индекс. Частичный индекс-это индекс, содержащий записи только для части таблицы, обычно более полезной для индексации, чем остальная часть таблицы. Например, если у вас есть таблица, которая содержит выставленные и неоплаченные счета за заказы, и неоплаченные заказы занимают небольшую часть общей таблицы, но более часто запрашиваются, вы можете улучшить производительность, создав индекс только для этой части. Еще одним возможным использованием является указание WHERE с UNIQUE чтобы обеспечить уникальность по подмножеству таблицы. Дополнительную информацию см. в разделе Частичные индексы.

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

Все функции и операторы, используемые в определении индекса, должны быть "постоянными"(IMMUTABLE), то есть их результаты должны зависеть только от их аргументов и никогда не зависеть от какого-либо внешнего влияния (такого как содержимое другой таблицы или текущее время). Это ограничение гарантирует, что поведение индекса четко определено. Чтобы использовать определяемую пользователем функцию в выражении индекса или WHERE предложение, не забудьте отметить функцию как постоянную IMMUTABLE при ее создании.

Параметры

UNIQUE

Указывает что система должна проверять наличие повторяющихся значений в таблице при создании индекса (если данные уже существуют) и при каждом добавлении данных. Попытки вставить или обновить данные, которые приведут к дублированию записей, приведут к ошибке.

Дополнительные ограничения применяются при применении уникальных индексов к партиционированным таблицам; см. CREATE TABLE.

CONCURRENTLY

Если используется этот параметр, QHB будет строить индекс без установления каких-либо блокировок, которые бы предотвращали параллельные вставки, изменения или удаление записей в таблице; в то время как стандартная операция построения индекса блокирует запись (но не чтение) в таблице, до своего завершения. Существует несколько особенностей, которые следует учитывать при использовании этого параметра — см. Неблокирующее построение индексов.

IF NOT EXISTS

Не считать ошибкой, если индекс с таким именем уже существует. В этом случае выдается соответствующее уведомление. Обратите внимание, что нет никакой гарантии, что существующий индекс как-то соотносится с тем, который мог бы быть создан. Если указано IF NOT EXISTS, то имя индекса является обязательным.

INCLUDE

Необязательное предложение INCLUDE указывает список столбцов, которые будут включены в индекс в качестве неключевых столбцов. Неключевой столбец не будет использоваться в условии поиска для сканирования по индексу, и он игнорируется при анализе ограничения уникальности или исключения, применяемого индексом. Однако при сканировании только индекса может возвращаться содержимое неключевых столбцов без необходимости обращения к таблице, поскольку они доступны непосредственно из записи индекса. Таким образом, добавление неключевых столбцов позволяет сканирование только индекса и может использоваться в тех запросах, где иначе оно было бы неприменим.

В отношении добавления неключевых столбцов в индекс, разумно проявлять консерватизм, особенно да широких столбцов. Если кортеж индекса превышает максимальный размер, разрешенный для типа индекса, вставка данных завершится ошибкой. В любом случае, неключевые столбцы дублируют данные из таблицы и раздувают размер индекса, что потенциально замедляет поиск.

Столбцы, перечисленные в предложении INCLUDE не нуждаются в соответствующих классах операторов; предложение может включать столбцы, типы данных которых не имеют классов операторов, определенных для данного метода доступа.

Выражения во включаемых столбцах не поддерживаются, так как они не могут использоваться при сканировании индекса.

В настоящее время эту возможность поддерживают только методы доступа индексов B-дерево и GiST. В B-дереве и индексах GiST значения столбцов, перечисленных в предложение INCLUDE включаются в кортежи на уровне листьев, которые соответствуют кортежам кучи, но не включены в записи индекса верхнего уровня, используемые для навигации по деревьям.

Имя

Имя создаваемого индекса. Имя схемы здесь не может быть включено; индекс всегда создается в той же схеме, что и его родительская таблица. Если имя опущено, QHB выбирает подходящее имя на основе имени родительской таблицы и индексированных имен столбцов.

ONLY

Указывает, что индексы не должны рекурсивно создаваться на партициях, если таблица партиционирована. По умолчанию используется рекурсивно.

имя_таблицы

Имя, которое может быть дополнено схемой, индексируемой таблицы.

метод

Имя используемого метода индекса. Возможные варианты: btree, hash, gist, spgist, gin и brin. По умолчанию используется метод btree.

имя_столбца

Имя столбца таблицы.

выражение

Выражение, основанное на одном или нескольких столбцах таблицы. Выражение обычно должно быть записано в скобках, как показано в синтаксисе. Однако круглые скобки могут быть опущены, если выражение записано в виде вызова функции.

правило_сортировки

Имя правила сортировки, используемого для индекса. По умолчанию индекс использует правило сортировки, объявленное для столбца, подлежащего индексированию, или полученное для результата выражения индекса. Индексы с нестандартными правилами сортировки могут быть полезны для запросов, содержащих выражения, использующие такие правила.

класс_операторов

Имя класса оператора. Смотрите дополнительную информацию ниже.

ASC

Задает порядок сортировки по возрастанию (по умолчанию).

DESC

Задает порядок сортировки по убыванию.

NULLS FIRST

Указывает, что значения NULL после сортировки оказываются перед остальными. Это значение по умолчанию, когда задано DESC.

NULLS LAST

Указывает, что значения NULL после сортировки оказываются после остальных. Это значение по умолчанию, когда задано ASC.

параметр_хранения

Имя параметра хранения, зависящего от метода индекса. Дополнительные сведения см. в разделе Параметры хранения индекса.

табл_пространство

Табличное пространство, в котором будет создан индекс. Если этот параметр не указан, выполняется обращение к default_tablespace или temp_tablespaces для индексов временных таблиц.

предикат

Выражение ограничения для частичного индекса.

Параметры хранения индекса

Необязательное предложение WITH задает параметры хранения для индекса. Каждый метод индекса имеет свой собственный набор допустимых параметров хранения. Методы индекса B-tree, hash, GiST и SP-GiST принимают этот параметр:

fillfactor

Фактор заполнения для индекса определят в процентах, насколько плотно метод индекса будет пытаться заполнить страницы индекса. Для B-деревьев концевые страницы заполняются до этого процента во время первоначального построения индекса, а также при расширении индекса вправо (добавление новых наибольших значений ключей). Если впоследствии страницы будут полностью заполнены, они будут разделены, что приведет к постепенному снижению эффективности индекса. B-деревья используют значение fillfactor = 90 по умолчанию, но можно выбрать любое целочисленное значение от 10 до 100. Если таблица статична, то fillfactor = 100 помогает уменьшить физический размер таблицы, но для интенсивно изменяемых таблиц лучше использовать меньшее значение фактора заполнения, чтобы минимизировать необходимость разбиения страниц. С другими методами индекса фактор заполнения действует по-другому, но примерно в том же ключе; значение фактора заполнения по умолчанию для разных методов разное.

B-деревья дополнительно учитывают этот параметр:

vacuum_cleanup_index_scale_factor

Обратитесь к разделу vacuum_cleanup_index_scale_factor.

Индексы GiST дополнительно принимают этот параметр:

buffering

Определяет, используется ли для построения индекса метод буферизации, описанный в в разделе Индексы GiST. Реализация. Со значением OFF она отключена, с ON — включена, а с AUTO - вначале отключена, но включается на лету, как только размер индекса достигает effective_cache_size. Значение по умолчанию: AUTO.

Индексы GIN принимают другие параметры:

fastupdate

Этот параметр управляет использованием механизма быстрого обновления, описанного в разделе Быстрое обновление GIN. Это логический параметр: ON включает быстрое обновление, OFF отключает его. Значение по умолчанию - ON. (Альтернативные варианты написания ON и OFF допускаются, как описано в разделе Настройка параметров). Значение по умолчанию: ON.

Замечание
Выключение fastupdate в ALTER INDEX предотвращает помещение добавляемых в дальнейшем строк в список записей, ожидающих индексации, но записи, добавленные в этот список ранее, в нём остаются. Чтобы очистить очередь операций, надо затем выполнить VACUUM для этой таблицы или вызвать функцию gin_clean_pending_list.

gin_pending_list_limit

Пользовательский параметр gin_pending_list_limit. Это значение указывается в килобайтах.

Индексы BRIN принимают другие параметры:

pages_per_range

Определяет количество блоков таблицы, которые составляют один диапазон блоков для каждой записи индекса BRIN (см. Индексы BRIN для получения более подробной информации). Значение по умолчанию: 128.

autosummarize

Определяет, нужно ли вычислять сводное значение для зоны предыдущей страницы, когда происходит добавление на следующей странице.

Неблокирующее построение индексов

Создание индекса может помешать обычное работе базы данных. Обычно QHB блокирует для записи таблицу, которая будет индексирована, и выполняет построение индекса за одно сканирование таблицы. Другие транзакции по-прежнему могут читать из таблицы, но при попытке вставки, обновления или удаления. строки в таблице они будут блокироваться до завершения построения индекса. Это может иметь серьезные последствия, если система является производственной базой данных в реальном времени. Индексация очень больших таблиц может занять много часов, и даже для небольших таблиц построение индекса может блокировать записи на время, которое неприемлемо для производственной системы.

QHB поддерживает построение индексов без блокировки записи. Этот метод вызывается путем указания CONCURRENTLY команды CREATE INDEX. Если используется этот параметр, QHB должен выполнить два сканирования таблицы и, кроме того, он должен ожидать завершения всех существующих транзакций, которые потенциально могут изменить или использовать индекс. Таким образом, этот метод требует проделать в сумме больше действий, чем стандартное построение индекса, и занимает значительно больше времени. Однако, поскольку он позволяет продолжить обычную работу во время построения индекса, этот метод полезен для добавления новых индексов в производственной среде. Конечно, дополнительная нагрузка на процессор и подсистему ввода/вывода, вызванная созданием индекса, может замедлить другие операции.

При неблокирующем построении индекса он попадает в системный каталог в одной транзакции, а затем два сканирования таблиц происходят в двух других транзакциях. Перед каждым сканированием таблицы процедура построения индекса должна ожидать завершения существующих транзакций, которые модифицируют таблицу. После второго сканирования, процедуре также необходимо дождаться завершения всех транзакций, которые получили снимок таблицы (см. главу Параллельный контроль), перед вторым сканированием. Затем, наконец, индекс может быть помечен как готовый к использованию, и команда CREATE INDEX завершается. Однако даже в этом случае индекс может не сразу применяться для запросов: в худшем случае он не может применяться до тех пор, пока существуют транзакции, начатые до начала построения индекса.

Если при сканировании таблицы возникает проблема, например взаимоблокировка или нарушение уникальности в уникальном индексе, команда CREATE INDEX завершится ошибкой, но оставит ” не рабочий " индекс. Этот индекс будет игнорироваться при запросах, поскольку он может быть неполным; однако он все равно будет потреблять ресурсы при обновлениях. Команда qsql \d сообщит о таком индексе, пометив его как NOT VALID:

qhb=# \d tab
       Table "public.tab"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 col    | integer |           |          |
Indexes:
    "idx" btree (col) INVALID

Рекомендуемый метод восстановления в таких случаях заключается в том, чтобы удалить индекс и попытаться снова выполнить CREATE INDEX CONCURRENTLY. (Другая возможность заключается в том, чтобы перестроить индекс с помощью команды REINDEX INDEX CONCURRENTLY).

Ещё одна сложность, с которой можно столкнуться при неблокирующем построении уникального индекса заключается в том, что ограничение уникальности уже применяется к другим транзакциям, когда начинается второе сканирование таблицы. Это означает, что нарушения ограничений могут быть зарегистрированы в других запросах до того, как индекс станет доступным для использования, или даже в тех случаях, когда построение индекса в конечном итоге завершится неудачей. Кроме того, если во время второго сканирования происходит сбой, то “нерабочий” индекс продолжает применять свое ограничение уникальности впоследствии.

Метод неблокирующего построения поддерживает также индексы выражений и частичные индексы. Ошибки, возникающие при вычислении этих выражений, могут привести к поведению, описанному выше для случаев
с нарушением ограничений уникальности.

Обычное построение индекса допускает одновременное построение других индексов для таблицы обычным методом, но неблокирующее построение для конкретной таблицы в один момент времени допускается только одно. В любом случае никакие другие изменения схемы таблицы не допускаются во время построения индекса. Другое отличие состоит в том, что обычная команда CREATE INDEX может быть выполнена в блоке транзакций, но CREATE INDEX CONCURRENTLY - нет.

Метод неблокирующего построения для индексов в партиционированных таблицах в настоящее время не поддерживаются. Однако вы можете использовать этот метод для каждой партиции отдельно, а затем, создать партиционированный индекс в обычном режиме, чтобы сократить время, в течение которого запись в партиционированную таблицу будет заблокирована. В этом случае построение партиционированного индекса будет заключаться только в изменении метаданных.

Примечания

Смотрите главу Индексы для получения информации о том, когда можно использовать индексы, когда они не используются и в каких конкретных ситуациях они могут быть полезны.

В настоящее время только методы B-tree, GiST, GIN и BRIN index поддерживают составные индексы. По умолчанию можно указать до 32 полей. (Это ограничение может быть изменено при создании или пересборке QHB). В настоящее время только B-tree поддерживает уникальные индексы.

Для каждого столбца индекса можно указать класс операторов. Класс операторов определяет операторы, которые будут использоваться индексом для этого столбца. Например, B-дерево для четырехбайтовых целых чисел будет использовать класс int4_ops; этот класс операторов включает функции сравнения для четырехбайтовых целых чисел. На практике класс операторов по умолчанию для типа данных столбца обычно является достаточным. Основной смысл наличия классов операторов заключается в том, что для некоторых типов данных может существовать осмысленного порядка сортировки. Например, мы можем захотеть отсортировать комплексные числа как по абсолютному значению, так и по вещественной части. Мы могли бы сделать это, определив два класса операторов для типа данных и затем выбрав подходящий класс при создании индекса. Более подробная информация о классах операторов находится в разделах Классы операторов и семейства операторов и Интерфейсные расширения для индексов.

Когда команда CREATE INDEX вызывается для партиционированной таблицы, поведение по умолчанию заключается в том что её действие распространяется рекурсивно на все партиции, чтобы убедиться, что все они имеют соответствующие индексы. Сначала каждая партиция проверяется на наличие равнозначного индекса, и если да, то этот индекс будет присоединен в качестве индекса партиции к создаваемому индексу, который станет таким образом родительским индексом. Если соответствующий индекс не существует, он будет создан и автоматически и присоединен; имя индекса для каждой партиции выбирается так же, как и при выполнении этой команды без имени индекса. С указанием ONLY рекурсия не производится и индекс помечается как нерабочий. (Команда ALTER INDEX ... ATTACH PARTITION пометит его как рабочий, когда он будет представлен во всех партициях). Обратите внимание, что для любой партиция, которая будет создана в будущем с помощью CREATE TABLE ... PARTITION OF, будет автоматически создан соответствующий индекс, независимо от того, заданно ли ONLY.

Для методов индекса, поддерживающих сканирование по порядку (в настоящее время только B-tree), необязательные предложения ASC, DESC, NULLS FIRST или NULLS LAST можно указать, чтобы изменить порядок сортировки индекса. Поскольку упорядоченный индекс можно сканировать как вперед, так и назад, обычно не рекомендуется создавать индекс по убыванию (DESC) для одного столбца - это порядок сортировки, который доступен с обычным индексом. Эти параметры имеют смысл при создании составных индексов так, что они будут соответствовать порядку сортировки, в запросе со смешанным порядком сортировки, например SELECT ... ORDER BY x ASC, y DESC. Параметры NULLS полезны, когда требуется реализовать поведение «NULL внизу», изменив стандартное «NULL вверху», в запросах, зависящих от индексов, чтобы избежать дополнительной сортировки.

Для большинства методов индексов скорость создания индекса зависит от параметра maintenance_work_mem. Большие значения параметра сократят время, необходимое для создания индекса, (если только заданное значение не превышает объём действительно доступной памяти, что влечёт за собой использование подкачки).

QHB может создавать индексы, используя несколько процессоров, чтобы быстрее обрабатывать строки таблицы. Эта функция называется параллельным построением индекса . Для методов индекса, поддерживающих параллельное построение индексов (в настоящее время только B-tree), maintenance_work_mem задает максимальный объем памяти, который может использоваться каждой операцией построения индекса в целом, независимо от количества запущенных рабочих процессов.
Целесообразность использования параллельных процессов и их оптимальное количество обычно автоматически определяется моделью стоимости.

Параллельное построение индексов может выиграть от увеличения maintenance_work_mem там, где для аналогичного последовательного построения индекса выигрыша не будет или он будет минимальным. Обратите внимание, что maintenance_work_mem может влиять на количество запрашиваемых рабочих процессов, так как параллельные рабочие процессы должны иметь не менее a 32MB диз общего бюджета maintenance_work_mem. Кроме того, 32MB должно остаться для ведущего процесса. Увеличение max_parallel_maintenance_workers может позволить использовать больше исполнителей, что сократит время, необходимое для создания индекса, если только создание индекса уже не упирается в скорость ввода/вывода. Конечно, для этого должно быть достаточно процессорных ресурсов, которые иначе бы простаивали.

Если в ALTER TABLE задаётся значение parallel_workers это напрямую определяет, сколько параллельных рабочих процессов будет запрашивать команда CREATE INDEX для таблицы. При этом полностью игнорируется модель стоимости, и maintenance_work_mem не влияет на определение количества параллельных исполнителей. Если параметр parallel_workers установлен равным 0 в ALTER TABLE, это отключит параллельное построение индексов для этой таблицы полностью.

Совет
Имеет смысл сбросить настройки parallel_workers после выполнения построения индекса. Это позволит избежать нежелательные изменения планов запросов, так как parallel_workers влияет на все!!! параллельные сканирования таблиц.

Хотя CREATE INDEX с указанием CONCURRENTLY поддерживает параллельное построение без специальных ограничений, только первое сканирование таблицы фактически выполняется параллельно.

Используйте DROP INDEX для удаления индекса.

Предыдущие выпуски системы также имели метод индекса R-tree. Этот метод был удален, потому что он не имел существенных преимуществ по сравнению с методом GiST. Указание USING rtree в CREATE INDEX будет интерпретироваться как USING GiST, чтобы упростить преобразование старых баз данных в GiST.

Примеры

Создание уникального индекса-B-дерева по столбцу title в таблице films:

CREATE UNIQUE INDEX title_idx ON films (title);

Создание уникального индекса-B-дерева по столбцу title, а также включённым столбцам director и rating в таблице films:

CREATE UNIQUE INDEX title_idx ON films (title) INCLUDE (director, rating);

Создание индекса-B-дерева с отключённым механизмом исключения дубликатов:

CREATE INDEX title_idx ON films (title) WITH (deduplicate_items = off);

Создание индекса по выражению lower(title), позволяющего эффективно выполнять регистронезависимый поиск:

CREATE INDEX ON films ((lower(title)));

(В этом примере мы решили опустить имя индекса, чтобы имя выбрала система, например films_lower_idx.)

Создание индекса с нестандартным правилом сортировки:

CREATE INDEX title_idx_german ON films (title COLLATE "de_DE");

Создание индекса с нестандартным порядком значений NULL:

CREATE INDEX title_idx_nulls_low ON films (title NULLS FIRST);

Создание индекса с нестандартным фактором заполнения:

CREATE UNIQUE INDEX title_idx ON films (title) WITH (fillfactor = 70);

Создание индекса GIN с отключённым механизмом быстрого обновления:

CREATE INDEX gin_idx ON documents_table USING GIN (locations) WITH (fastupdate = off);

Создание индекса по столбцу code в таблице films и размещение его в табличном пространстве indexspace:

CREATE INDEX code_idx ON films (code) TABLESPACE indexspace;

Создание индекса GiST по координатам точек, позволяющего эффективно использовать операторы box с результатом функции преобразования:

CREATE INDEX pointloc
    ON points USING gist (box(location,location));
SELECT * FROM points
    WHERE box(location,location) && '(0,0),(1,1)'::box;

Создание индекса без блокировки записи в таблицу:

CREATE INDEX CONCURRENTLY sales_quantity_index ON sales_table (quantity);

Совместимость

Команда CREATE INDEX является расширением QHB. В стандарте SQL нет положений для индексов.

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

ALTER INDEX, DROP INDEX, REINDEX


CREATE LANGUAGE

CREATE LANGUAGE - создать новый процедурный язык

Синтаксис

CREATE [ OR REPLACE ] [ PROCEDURAL ] LANGUAGE имя
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE имя
    HANDLER обработчик_вызова [ INLINE обработчик_внедрённого_кода ] [ VALIDATOR функция_проверки ]

Описание

CREATE LANGUAGE регистрирует новый процедурный язык в базе данных QHB. Впоследствии на этом новом языке могут быть определены функции и процедуры.

Замечание
Большинство процедурных языков были переделаны в "расширения" и поэтому должны устанавливаться посредством CREATE EXTENSION. Если в вашей базе данных есть «чистое» определение языка, возможно, полученное в результате обновления, его можно преобразовать в расширение, выполнив CREATE EXTENSION имя_языка FROM unpackaged.

CREATE LANGUAGE связывает имя языка с функциями-обработчиками, которые отвечают за выполнение функций, написанных на этом языке. Дополнительную информацию о языковых обработчиках смотрите в главе Процедурные языки.

Существует две формы команды CREATE LANGUAGE. В первой форме пользователь указывает только имя нужного языка, и сервер QHB обращается к системному каталогу pg_pltemplate, чтобы определить правильные параметры. Во второй форме пользователь указывает параметры языка вместе с именем языка. Вторая форма может быть использована для создания языка, который не определен в pg_pltemplate, но такой подход считается устаревшим.

Когда сервер находит запись в поле каталога pg_pltemplate для данного имени языка он будет использовать данные каталога, даже если команда содержит параметры языка. Это поведение упрощает загрузку старых файлов дампа памяти, которые, вероятно, содержат устаревшую информацию о функциях поддержки языка.

Обычно пользователь должен иметь право суперпользователя QHB для регистрации нового языка. Однако владелец базы данных может зарегистрировать новый язык в этой базе данных, если этот язык указан в списке каталога pg_pltemplate и помечен как доступный для создания владельцами баз данных (tmpldbacreate содержит true). По умолчанию доверенные языки могут быть созданы владельцами баз данных, но это может быть скорректировано суперпользователями путем изменения содержимого базы данных pg_pltemplate. Создатель языка становится его владельцем и впоследствии может удалить его, переименовать или назначить новому владельцу.

CREATE OR REPLACE LANGUAGE приведет либо к созданию нового языка, либо к замене существующего определения. Если язык уже существует, его параметры обновляются в соответствии со значениями, указанными в команде или взятыми из pg_pltemplate, при этом владелец языка и права доступа, и все существующие функции, написанные на этом языке, считаются все еще действительными. Помимо обычных требований к правам для создания языка, пользователь должен быть суперпользователем или владельцем существующего языка. Вариант с REPLACE в основном предназначен для случаев, когда язык существует. Если язык присутствует в каталоге pg_pltemplate, то REPLACE фактически ничего не изменяет в существующем определении, кроме исключительного случая, когда запись в pg_pltemplate была изменена после создания языка.

Параметры

TRUSTED

TRUSTED(доверенный) указывает, что язык не предоставляет доступ к данным, к которым он не имел бы доступа без него. Если это ключевое слово опущено при регистрации языка, только суперпользователи QHB смогут использовать этот язык для создания новых функций.

PROCEDURAL

Это слово не несёт смысловой нагрузки.

Имя

Название нового процедурного языка. Имя должно быть уникальным среди всех языков в базе данных.

Для обратной совместимости имя может быть заключено в одинарные кавычки.

HANDLER обработчик_вызова

обработчик_вызова это имя ранее зарегистрированной функции,которая будет вызвана для выполнения функций на этом процедурном языке. Обработчик вызовов для процедурного языка должен быть написан на компилируемом языке, таком как C, с соглашениями о вызовах версии 1 и зарегистрирован в QHB как функция, не принимающая Аргументы и возвращающая фиктивный language_handler тип, который просто используется для идентификации функции в качестве обработчика вызовов.

INLINE обработчик_внедрённого_кода

обработчик_внедрённого_кода это имя ранее зарегистрированной функции, которая будет вызвана для выполнения анонимного блока кода (команды DO) на этом языке. Если функция обработчика_внедрённого_кода не указана, язык не будет поддерживать анонимные блоки кода. Функция обработчика должна принимать один аргумент типа internal, который будет внутренним представлением команды DO, и он, как правило, возвращает тип void. Возвращаемое значение обработчика игнорируется.

VALIDATOR функция_проверки

функция_проверки это имя ранее зарегистрированной функции, которая будет вызываться при создании новой функции на языке для проверки это функции. Если функция проверки не указана, то новая функция не будет проверяться при создании. Функция проверки должна принимать один аргумент типа oid с идентификатором создаваемой функции и обычно возвращает void.

Функция проверки обычно проверяет синтаксическую корректность тела функции, но она также может анализировать другие свойства функции, например, поддержку определённых типов аргументов этим языком. Чтобы сигнализировать об ошибке, функция проверки должна использовать функцию ereport(). Возвращаемое значение функции игнорируется.

Параметр TRUSTED и имена вспомогательных функций игнорируются, если на сервере для указанного языка имеется запись в pg_pltemplate.

Примечания

Используйте DROP LANGUAGE для удаления процедурных языков.

Информация о текущих установленных языках содержится в системном каталоге pg_language. Кроме того, команда qsql \dL показывает список установленных языков.

Чтобы создавать функции на процедурном языке, пользователь должен иметь право USAGE для языка. По умолчанию, для доверенных языков право USAGE предоставляется роли PUBLIC (т.е. для всех). Что может быть отменено при желании.

Процедурные языки являются локальными для баз данных. Тем не менее, язык может быть установлен в базу данных template1, что приведет к тому, что язык будет автоматически доступен во всех впоследствии созданных базах данных.

Обработчик вызова, обработчик встроенного кода (если есть) и функция проверки (если есть) уже должны существовать, если на сервере нет записи для этого языка в pg_pltemplate. Но если запись есть, функции могут не существовать; они будут автоматически определены, если их нет в базе данных. (Если разделяемая библиотека, реализующая язык, не найдется в установленной системе это может привести к сбою в CREATE LANGUAGE,).

Для поддержки загрузки старых файлов дампа, CREATE LANGUAGE принимает функции с объявленным типом результата opaque, но при этом выдаётся предупреждение и тип результата меняется на language_handler.

Примеры

Предпочтительный способ создания любого из стандартных процедурных языков-прост:

CREATE LANGUAGE plperl;

Для языка, не представленного в каталоге pg_pltemplate, необходимо выполнить следующую последовательность действий:

CREATE FUNCTION plsample_call_handler() RETURNS language_handler
    AS '$libdir/plsample'
    LANGUAGE C;
CREATE LANGUAGE plsample
    HANDLER plsample_call_handler;

Совместимость

Команда CREATE LANGUAGE является расширением QHB.

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

ALTER LANGUAGE, CREATE FUNCTION, DROP LANGUAGE, GRANT, REVOKE


CREATE MATERIALIZED VIEW

CREATE MATERIALIZED VIEW - создать материализованное представление

Синтаксис

CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] имя_таблицы
    [ (имя_столбца [, ...] ) ]
    [ USING метод ]
    [ WITH ( параметр_хранения [= значение] [, ... ] ) ]
    [ TABLESPACE табл_пространство ]
    AS запрос
    [ WITH [ NO ] DATA ]

Описание

CREATE MATERIALIZED VIEW определяет материализованное представление запроса. Запрос выполняется и используется для заполнения представления во время выполнения команды (если только не указано WITH NO DATA). Обновить представление позже можно, выполнив REFRESH MATERIALIZED VIEW.

CREATE MATERIALIZED VIEW подобна CREATE TABLE AS, за исключением того, что она запоминает запрос, используемый для инициализации представления, чтобы его можно было обновить позже по требованию. Материализованное представление во многом сходно с таблицей, но не во всём; например, не поддерживаются временные материализованные представления.

Параметры

IF NOT EXISTS

Не выдавать ошибку, если материализованное представление с тем же именем уже существует. В этом случае выдается соответствующее уведомление. Обратите внимание, что нет никакой гарантии, что существующее материализованное представление как-то соотносится с тем, которое могло бы быть создано.

имя_таблицы

Имя, которое может быть дополнено схемой, создаваемого материализованного представления.

имя_столбца

Имя столбца в новом материализованном представлении. Если имена столбцов не указаны, они берутся из выходных имен столбцов запроса.

USING метод

Это необязательное предложение определяет метод доступа к таблице, используемый для хранения содержимого для нового материализованного представления; этот метод должен быть типа TABLE. Дополнительную информацию смотрите в главе Определение интерфейса метода доступа к таблице. Если этот параметр не указан, то для нового материализованного представления выбирается метод доступа к таблице по умолчанию. Дополнительную информацию смотрите в разделе default_table_access_method.

WITH ( параметр_хранения [= значение] [, ... ] )

В этом предложении указываются необязательные параметры хранения для нового материализованного представления; дополнительные сведения см. в разделе Параметры хранения. Все параметры, которые поддерживает CREATE TABLE, поддерживает и CREATE MATERIALIZED VIEW. Дополнительную информацию смотрите в разделе CREATE TABLE.

TABLESPACE табл_пространство

табл_пространство это имя табличного пространства, в котором будет создано новое материализованное представление. Если не указано, ds,выбирается default_tablespace.

запрос

Команда SELECT , TABLE или VALUES. Этот запрос будет выполняться в рамках операции с ограничениями безопасности; в частности, вызов функций, которые сами создают временные таблицы, завершится ошибкой.

WITH [ NO ] DATA

Это предложение указывает, следует ли заполнять материализованное представление во время его создания. Если материализованное представление не наполняется, оно помечается как нечитаемое, так что к нему нельзя будет обращаться до выполнения REFRESH MATERIALIZED VIEW.

Совместимость

Команда CREATE MATERIALIZED VIEW является расширением QHB.

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

ALTER MATERIALIZED VIEW, CREATE TABLE AS, CREATE VIEW, DROP MATERIALIZED VIEW, REFRESH MATERIALIZED VIEW


CREATE OPERATOR

CREATE OPERATOR - создать оператор

Синтаксис

CREATE OPERATOR имя (
    {FUNCTION|PROCEDURE} = имя_функции
    [, LEFTARG = тип_слева ] [, RIGHTARG = тип_справа ]
    [, COMMUTATOR = коммут_оператор ] [, NEGATOR = обратный_оператор ]
    [, RESTRICT = процедура_ограничения ] [, JOIN = процедура_соединения ]
    [, HASHES ] [, MERGES ]
)

Описание

CREATE OPERATOR создает новый оператор. Пользователь, создавший оператор, становится его владельцем. Если задано имя схемы, то оператор создается в указанной схеме. В противном случае он создается в текущей схеме.

Имя оператора представляет собой последовательность из нескольких символов (не более чем NAMEDATALEN-1, по умолчанию 63) из следующего списка:

+ - * / < > = ~ ! @ # % ^ & | ` ?

Есть несколько ограничений на выбор имени:

  • -- и /* не могут присутствовать в имени оператора, так как они приняты в качестве начала комментария.

  • Многосимвольное имя оператора не может заканчиваться на + или -, если только имя также не содержит хотя бы один из этих символов:

   ~ ! @ \# % ^ &  ‘ ?

Например, @- является допустимым именем оператора, но *- не является. Это ограничение позволяет QHB анализировать SQL-совместимые команды, не требуя пробелов между токенами.

  • Использование => в качестве имени оператора считается устаревшим и может быть вовсе запрещено в будущих выпусках.

Оператор != отображается в <> при вводе, так что эти два имени всегда равнозначны.

Необходимо определить либо LEFTARG, либо RIGHTARG, а для бинарных операторов оба аргумента. Для правых унарных операторов, должно быть определено только LEFTARG, в то время как для левых унарных операторов - только RIGHTARG.

Функция имя_функции должна быть предварительно определена с помощью CREATE FUNCTION и должна быть определена для принятия правильного числа аргументов (одного или двух) из указанных типов.

В синтаксисе CREATE OPERATOR ключевые слова FUNCTION и PROCEDURE равнозначны, но указанная функция должна в любом случае быть функцией, а не процедурой. Использование ключевого слова PROCEDURE здесь поддерживается по историческим причинам и считается устаревшим.

В других предложениях указываются необязательные параметры оптимизации оператора. Их значение подробно описано в разделе Информация по оптимизации оператора .

Чтобы создать оператор, необходимо иметь право USAGE для типов аргументов и результата, а также право EXECUTE для нижележащей функции. Если указывается коммутативный или обратный оператор, нужно быть его владельцем.

Параметры

Имя

Имя определяемого оператора. Допустимые символы см. выше. Имя может быть дополнено схемой, например так: CREATE OPERATOR myschema.+ (...). Если схема не указана, то оператор создается в текущей схеме. Два оператора в одной схеме могут иметь одно и то же имя, если они работают с разными типами данных. Это называется перегрузкой .

имя_функции

Функция, используемая для реализации этого оператора.

тип_слева

Тип данных левого операнда оператора, если таковой имеется. Этот параметр опускается для левых унарных операторов.

тип_справа

Тип данных правого операнда оператора, если таковой имеется. Этот параметр будет опущен для правых унарных операторов.

коммут_оператор

Оператор, коммутирующий для данного.

обратный_оператор

Оператор, обратный для данного.

процедура_ограничения

Функция оценки селективности ограничения для этого оператора.

процедура_соединения

Функция оценки селективности соединения для этого оператора.

HASHES

Указывает, что этот оператор может поддерживать хэш-соединение.

MERGES

Указывает, что этот оператор может поддерживать соединение слиянием.

Чтобы задать имя оператора с указанием схемы в коммут_оператор или другом дополнительном аргументе, применяется синтаксис OPERATOR(), например:

COMMUTATOR = OPERATOR(myschema.===) ,
.

Указать лексический приоритет оператора в команде CREATE OPERATOR невозможно, поскольку поведение приоритета синтаксического анализатора жестко связано. См. раздел Приоритет оператора.

Устаревшие опции SORT1, SORT2, LTCMP, и GTCMP ранее использовались для указания имен операторов сортировки, с оператором, применяемым при соединении слиянием. В этом больше нет необходимости, так как сведения о связанных операторах можно найти, обратившись вместо этого к семействам операторов B-tree. Если в команде отсутствует явное указание MERGES, все эти параметры игнорируются.

Используйте DROP OPERATOR для удаления определяемых пользователем операторов из базы данныха, а для изменения их свойств - ALTER OPERATOR.

Примеры

Следующая команда определяет новый оператор, проверяющий равенство площадей, для типа box:

CREATE OPERATOR === (
    LEFTARG = box,
    RIGHTARG = box,
    FUNCTION = area_equal_function,
    COMMUTATOR = ===,
    NEGATOR = !==,
    RESTRICT = area_restriction_function,
    JOIN = area_join_function,
    HASHES, MERGES
);

Совместимость

Команда CREATE OPERATOR является расширением QHB. В стандарте SQL нет определения для пользовательских операторов.

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

ALTER OPERATOR, CREATE OPERATOR CLASS, DROP OPERATOR


CREATE OPERATOR CLASS

CREATE OPERATOR CLASS - создать класс операторов

Синтаксис

CREATE OPERATOR CLASS имя [ DEFAULT ] FOR TYPE тип_данных
  USING индексный_метод [ FAMILY имя_семейства ] AS
  {  OPERATOR номер_стратегии имя_оператора [ ( тип_операнда, тип_операнда ) ] [ FOR SEARCH | FOR ORDER BY семейство_сортировки ]
   | FUNCTION номер_опорной_функции [ ( тип_операнда [ , тип_операнда ] ) ] имя_функции ( тип_аргумента [, ...] )
   | STORAGE тип_хранения
  } [, ... ]

Описание

CREATE OPERATOR CLASS создает новый класс операторов. Класс операторов определяет, как конкретный тип данных может использоваться с индексом. Класс операторов указывает, что некоторые операторы будут заполнять определенные роли или “стратегии” для этого типа данных и этого индексного метода. Класс операторов также определяет опорные функции, которые будут использоваться индексным методом при выборе класса операторов для столбца индекса. Все операторы и функции, используемые классом операторов, должны быть определены до того, как класс операторов может быть создан.

Если задано имя схемы, то класс операторов создается в указанной схеме. В противном случае он создается в текущей схеме. Два класса операторов в одной схеме могут иметь одно и то же имя только в том случае, если они предназначены для разных индексных методов.

Пользователь, определяющий класс операторов, становится его владельцем. В настоящее время создавать классы операторов могут только суперпользователи. (Это ограничение сделано потому, что ошибочное определение класса операторов может может вызвать нарушения или даже сбой в работе сервера).

CREATE OPERATOR CLASS настоящее время не проверяет, включает ли определение класса оператора все операторы и функции, требуемые индексным методом, и образуют ли операторы и функции целостный набор. Ответственность за правильность определения класса операторов лежит на пользователе.

Связанные классы операторов можно сгруппировать в семейства операторов. Чтобы добавить новый класс оператора в существующее семейство, укажите параметр FAMILY в CREATE OPERATOR CLASS. Без этого параметра новый класс помещается в семейство, имеющее то же имя, что и класс (если такое семейство не существует, оно создаётся).

Дополнительную информацию см. в разделе Интерфейсные расширения для индексов.

Параметры

Имя

Имя создаваемого класса операторов. Имя может быть дополнено схемой.

DEFAULT

Если присутствует это указание, класс операторов становится классом по умолчанию для своего типа данных. По умолчанию для конкретного типа данных и индексного метода может использоваться не более одного класса операторов.

тип_данных

Тип данных столбца, для которого предназначен этот класс операторов.

индексный метод

Имя индексного метода, для которого предназначен этот класс операторов.

имя_семейства

Имя существующего семейства операторов в которое будет добавлен этот класс. Если не указано, используется семейство с именем, совпадающим с классом оператора (если такое семейство не существует, оно создаётся).

номер_стратегии

Номер стратегии индексного метода для оператора, связанного с классом оператора.

имя_оператора

Имя, которое может быть дополнено схемой, оператора, связанного с данным классом оператора.

тип_операнда

В предложении OPERATOR это тип данных операнда, либо ключевое слово NONE, характеризующее левый унарный или правый унарный оператор. Типы данных операнда могут быть опущены, когда они совпадают с типом данных класса оператора.

В предложении FUNCTION это тип данных операнда, для котрого предназначена функция для поддержки, если он отличается от типа(ов) входных данных функции (для функций сравнения B-дерева и хэш-функций) или типа данных класса (для функций поддержки сортировки B-дерева и всех функций в классах операторов GiST, SP-GiST, GIN и BRIN). Обычно предполагаемые по умолчанию типы оказываются верными, так что тип_операнда указывать в FUNCTION не нужно, кроме функций сортировки B-дерева, предназначенных для сравнений разных типов данных.

семейство_сортировки

Имя, которое может быть дополнено схемой, существующего семейства операторов btree, описывающего порядок сортировки, связанный с оператором сортировки.

Если не указано ни FOR SEARCH (для поиска), ни FOR ORDER BY (для сортировки), подразумевается FOR SEARCH.

номер_опорной_функции

Номер опорной функции индексного метода для функции, связанной с классом операторов.

имя_функции

Имя, которое может быть дополнено схемой, функции, которая является опорной функцией индексного метода для класса операторов.

тип_аргумента

Тип(ы) данных параметра функции.

тип_хранения

Тип данных, фактически сохраненных в индексе. Обычно это то же самое, что и тип данных столбца, но некоторые методы индекса (в настоящее время GiST, GIN и BRIN) могут работать с отличающимся типом. Если тип_данных столбца задан как anyarray, тип_хранения может быть объявлен как anyelement, чтобы показать, что записи в индексе являются членами типа элемента, принадлежащего к фактическому типу массива, для которого создаётся конкретный индекс

Предложения OPERATOR, FUNCTION и STORAGE могут появляться в любом порядке.

Примечания

Поскольку механизм индексирования не проверяет разрешения на доступ к функциям перед их использованием, включение функции или оператора в класс операторов равносильно предоставлению общего разрешения на их выполнение. Обычно это не проблема для таких функций, которые бывают полезны в классе операторов.

Операторы не должны определяться функциями SQL. Функция SQL, скорее всего, будет встроена в вызывающий запрос, что помешает оптимизатору распознать, что запрос соответствует индексу.

Примеры

Команда в следующем примере определяет класс операторов индекса GiST для типа данных _int4 (массива из int4).

CREATE OPERATOR CLASS gist__int_ops
    DEFAULT FOR TYPE _int4 USING gist AS
        OPERATOR        3       &&,
        OPERATOR        6       = (anyarray, anyarray),
        OPERATOR        7       @>,
        OPERATOR        8       <@,
        OPERATOR        20      @@ (_int4, query_int),
        FUNCTION        1       g_int_consistent (internal, _int4, smallint, oid, internal),
        FUNCTION        2       g_int_union (internal, internal),
        FUNCTION        3       g_int_compress (internal),
        FUNCTION        4       g_int_decompress (internal),
        FUNCTION        5       g_int_penalty (internal, internal, internal),
        FUNCTION        6       g_int_picksplit (internal, internal),
        FUNCTION        7       g_int_same (_int4, _int4, internal);

Совместимость

Команда CREATE OPERATOR CLASS является расширением QHB. В стандарте SQL нет инструкции CREATE OPERATOR CLASS.

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

ALTER OPERATOR CLASS, DROP OPERATOR CLASS, CREATE OPERATOR FAMILY, ALTER OPERATOR FAMILY


CREATE OPERATOR FAMILY

CREATE OPERATOR FAMILY - создать семейство операторов

Синтаксис

CREATE OPERATOR FAMILY имя USING индексный_метод

Описание

CREATE OPERATOR FAMILY создает новое семейство операторов. Семейство операторов определяет набор связанных классов операторов и, возможно, некоторые дополнительные операторы и вспомогательные функции, совместимые с этими классами операторов, но не являющиеся существенными для функционирования любого отдельного индекса. (Операторы и функции, которые необходимы для индексов, должны быть сгруппированы в пределах соответствующего класса операторов, а не быть слабо связанными в семействе операторов. Как правило, операторы с одним типом данных привязаны к классам операторов, в то время как операторы с перекрестными типами данных могут быть слабо связаны в семействе операторов, содержащем классы операторов для обоих типов данных).

Новое семейство операторов изначально пусто. Оно должен быть заполнено командами CREATE OPERATOR CLASS, которые добавят в него классы операторов, и, возможно, командами ALTER OPERATOR FAMILY, которые добавят «слабосвязанные» операторы и соответствующие вспомогательные функции.

Если задано имя схемы, то семейство операторов создается в указанной схеме. В противном случае оно создается в текущей схеме. Два семейства операторов в одной схеме могут иметь одно и то же имя только в том случае, если они предназначены для разных методов индексирования.

В настоящее время создавать семейства операторов могут только суперпользователи. (Это ограничение введено потому, что ошибочное определение семейства может вызвать нарушения или даже сбой в работе сервера).

Дополнительную информацию см. в разделе Интерфейсные расширения для индексов.

Параметры

Имя

Имя семейства операторов, которое будет создано. Имя может быть дополнено схемой.

индексный метод

Имя индексного метода, для которого предназначено это семейство операторов.

Совместимость

Команда CREATE OPERATOR FAMILY является расширением QHB. В стандарте SQL нет инструкции CREATE OPERATOR FAMILY.

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

ALTER OPERATOR FAMILY, DROP OPERATOR FAMILY, CREATE OPERATOR CLASS, ALTER OPERATOR CLASS, DROP OPERATOR CLASS


CREATE POLICY

CREATE POLICY - создать новую политику защиты на уровне строк для таблицы

Синтаксис

CREATE POLICY имя ON имя_таблицы
    [ AS { PERMISSIVE | RESTRICTIVE } ]
    [ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ]
    [ TO { имя_роли | PUBLIC | CURRENT_USER | SESSION_USER } [, ...] ]
    [ USING ( выражение_USING ) ]
    [ WITH CHECK ( выражение_CHECK ) ]

Описание

Команда CREATE POLICY определяет новую политику защиты на уровне строк для таблицы. Обратите внимание, что для таблицы должна быть включена защита на уровне строк (используя ALTER TABLE ... ENABLE ROW LEVEL SECURITY) для применения созданных политик.

Политика предоставляет разрешение на выбор, вставку, обновление или удаление строк, удовлетворяющих соответствующему выражению политики. Существующие строки таблицы сравниваются с выражением, указанным в в USING, в то время как новые строки, которые будут созданы с помощью INSERT или UPDATE проверяются на соответствие выражению, указанному в WITH CHECK. Когда выражение USING выражение возвращает true для данной строки, эта строка видна пользователю, а если возвращается false или null, строка не видна. Когда выражение WITH CHECK возвращает значение true для строки, эта строка вставляется или обновляется, а если возвращается значение false или null, то возникает ошибка.

Для инструкций INSERT и UPDATE, выражения WITH CHECK применяются после того, как срабатывают триггеры BEFORE, и прежде чем любые фактические изменения данных будут сделаны. Таким образом триггер BEFORE ROW может изменять вставляемые данные, влияя на результат проверки политики защиты. Выражения WITH CHECK применяются перед любыми другими ограничениями.

Имена политик указаны на уровне таблицы. Поэтому одно имя политики может использоваться для нескольких разных таблиц и в каждой дать отдельное, подходящее этой таблице определение политики.

Политики могут применяться для определенных команд или для определенных ролей. По умолчанию для вновь созданных политик они применяются для всех команд и ролей, если не указано иное. К одной команде может применяться несколько политик; дополнительные сведения см. ниже. В таблице 256 показано, как различные типы политик применяются к определенным командам.

Для политик, которые могут иметь и выражения USING, и выражения WITH CHECK (ALL и UPDATE), в случае отсутствия выражения WITH CHECK выражение USING будет использоваться для определения того, какие строки будут видимыми (обычное назначение USING) и какие новые строки будут разрешено для добавить (назначение WITH CHECK)

Если для таблицы включена защита на уровне строк, но применимые политики отсутствуют, то предполагается политика “по умолчанию запретить”, чтобы никакие строки не были видны или доступны для обновления.

Параметры

Имя

Имя создаваемой политики. Это должно отличаться от имени любой другой политики для таблицы.

имя_таблицы

Имя, которое может быть дополнено схемой, таблицы, к которой применяется политика.

PERMISSIVE

Указывает, что политика должна быть создана как разрешительная политика. Все разрешительные политики, применимые к данному запросу, будут объединены вместе с помощью логического оператора “или”. Создавая разрешительные политики, администраторы могут расширять множество записей, к которым можно обращаться. Политики являются разрешительными по умолчанию.

RESTRICTIVE

Указывает, что политика должна быть создана как ограничительная политика. Все ограничительные политики, применимые к данному запросу, будут объединены вместе с помощью логического оператора “и”. Создавая ограничительные политики, администраторы могут сократить множество записей, к которым можно обращаться, так как для каждой записи должны удовлетворяться все ограничительные политики.

Обратите внимание, что для предоставления доступа к записям необходима хотя бы одна разрешительная политика, и только в дополнение к ней могут быть определены имеющие смысл ограничительные политики, ограничивающие доступ. Если существуют только ограничительные политики, то никакие записи не будут доступны. При наличии сочетания разрешительных и ограничительных политик запись доступна только в том случае,
если удовлетворяется минимум одна из разрешительных политик и все ограничительные.

команда

Команда, к которой применяется политика. Допустимые варианты: ALL, SELECT, INSERT, UPDATE и DELETE. ALL (все) подразумевается по умолчанию. Особенности их применения описаны ниже.

имя_роли

Роль(ы), к которой (которым) будет применяться политика. Значение по умолчанию: PUBLIC, то есть политика применяется ко всем ролям.

выражение_USING

Произвольное условное выражение SQL (возвращающее boolean). Условное выражение не может содержать никаких агрегатных или оконных функций. Это выражение будет добавлено в запросы, обращающиеся к данной таблице, если включена защита на уровне строк. Строки, для которых выражение возвращает true, будут видны. Любые строки, для которых выражение возвращает значение false или null, не будут видны пользователю (в запросе SELECT) и не будут доступны для изменения (запросами UPDATE или DELETE ). Такая строка просто пропускается, ошибка при этом не выдаётся.

выражение_CHECK

Произвольное условное выражение SQL (возвращающее boolean). Условное выражение не может содержать никаких агрегатных или оконных функций. Это выражение будет использоваться в запросах INSERT и UPDATE к таблице, если включена защита на уровне строк, так что в них принимаются только те строки, для которых оно выдаёт true. Если это выражение выдаёт false или NULL для любой из добавляемых записей или записей, получаемых при изменении, выдаётся ошибка. Обратите внимание, что ограничение_проверки вычисляется для предлагаемого нового содержимого строки, а не для существующих данных.

Политики по командам

ALL

Указание ALL для политики означает, что она будет применяться ко всем командам, независимо от типа команды. Если существует политика ALL и другие более детализированные политики, то будут применяться и политика ALL и более детализированные политики. Вдобавок, политики ALL будут применяться как к стороне выборки, так и к стороне изменения данных в запросе, если определено только выражение USING.

Как пример, когда выполняется UPDATE, политика ALL будет фильтровать и строки, которые сможет прочитать UPDATE для изменения (применяя выражение USING), и окончательные изменённые строки, проверяя, можно ли записать их в таблицу (применяя выражение WITH CHECK, если оно определено, или USING в противном случае). Если команда INSERT или UPDATE пытается добавить строки в таблицу, не удовлетворяющие выражению WITH CHECK политики ALL, вся команда будет прервана.

SELECT

Указание SELECT для политики означает, что она будет применяться к запросам SELECT всякий раз, когда при обращении к отношению, для которого определена политика, задействуется право SELECT. Результатом является то, что запрос SELECT выдаст только те записи из отношения, которые удовлетворят политике SELECT, и запрос, использующий право SELECT, например, запрос UPDATE, увидит только записи, разрешённые политикой SELECT. Для политики SELECT не может задаваться выражение WITH CHECK, так как оно действует только когда записи читаются из отношения.

INSERT

Указание INSERT для политики означает, что она будет применяться к команд INSERT. Попытка вставки строк, которые не удовлетворят этой политике, приведет к ошибке нарушения политики, и вся команда INSERT будет прервана. Для политики INSERT не может задаваться выражение USING, так как она действует только когда в отношение добавляются записи.

Обратите внимание, что INSERT с указанием ON CONFLICT DO UPDATE проверяет выражения WITH CHECK политик INSERT только для строк, добавляемых в отношение по пути INSERT.

UPDATE

Указание UPDATE для политики означает, что она будет применяться к командам UPDATE, SELECT FOR UPDATE и SELECT FOR SHARE, а также к дополнительным предложениям ON CONFLICT DO UPDATE команд INSERT. Так как UPDATE подразумевает извлечение существующей записи и замену ее новой измененной записью, политики UPDATE принимают оба выражение и USING и WITH CHECK. Выражение USING определяет, какие записи команда UPDATE будет видеть, для последующего изменения, в то время как выражение WITH CHECK определяет, какие измененные строки могут быть сохранены в отношении.

Любые строки, обновленные значения которые не будут удовлетворять выражению WITH CHECK, вызовут ошибку, и вся команда будет прервана. Если указывается только предложение USING, его выражение будет применяться и в качестве USING, и в качестве выражения WITH CHECK.

Как правило команда UPDATE также должна считывать данные из столбцов подлежащего изменению отношения (например, в предложении WHERE или RETURNING либо в выражении в правой части предложения SET). В этом случае, также требуется иметь права SELECT в изменяемом отношении, и в дополнение к политикам UPDATE будут применяться соответствующие политики SELECT или ALL. Таким образом, пользователю должны разрешать изменение строк политики UPDATE или ALL, а также должны разрешать доступ к изменяемым строкам политики SELECT или ALL.

Когда команда INSERT указана с вспомогательным предложение ON CONFLICT DO UPDATE, если выбирается путь UPDATE, строка, которая будет обновлена, сначала проверяется по выражениям USING всех политик UPDATE, а затем новая обновленная строка проверяется по выражениям WITH CHECK. Обратите внимание, однако, что в отличие от отдельной команды UPDATE, если существующая строка не удовлетворяет выражениям USING, будет отброшена ошибка (путь UPDATE никогда не пропускается неявно).

DELETE

Указание DELETE для политики означает, что она будет применяться к команде DELETE. Только строки, которые позволит эта политика, будут видны команде DELETE. При этом строки могут быть видны через SELECT, но удалить их будет нельзя, если они не удовлетворяют выражению USING политики DELETE.

В большинстве случаев команда DELETE также должна считывать данные из столбцов в отношении, из которого осуществляется удаление (например, в предложении WHERE или RETURNING). В этом случае, также требуются права SELECT на отношения, и в дополнение к политикам DELETE будут применяться соответствующие политики SELECT или ALL. Таким образом, пользователь должен иметь доступ к удаляемым строке(строкам), через политики SELECT или ALL в дополнение к тому, что удаление этих строк ему должны разрешить политики DELETE или ALL.

Для политики DELETE не может задаваться выражение WITH CHECK, так как она применяется только тогда, когда записи удаляются из отношения, а в этом случае новые строки, подлежащие проверке, отсутствуют.

Таблица 256. Политики, применяемые по типу команды

КомандаПолитика SELECT/ALL Выражение USINGПолитика INSERT/ALL Выражение WITH CHECKПолитика UPDATE/ALL Выражение USINGПолитика UPDATE/ALL Выражение WITH CHECKПолитика DELETE/ALL
SELECTСуществующая строка----
SELECT FOR UPDATE/SHAREСуществующая строка-Существующая строка--
INSERT-Новая строка---
INSERT ... RETURNINGНовая строка [a]Новая строка---
UPDATEСуществующие и новые строки [a]-Существующая строкаНовая строка-
DELETEСуществующая строка [a]---Существующая строка
ON CONFLICT DO UPDATEСуществующие и новые строки-Существующая строкаНовая строка-

Если для существующей или новой строки требуется доступ на чтение (например, предложение WHERE или RETURNING, обращающееся к столбцам отношения)

Применение нескольких политик

Если к одной команде применяются несколько политик различных типов команд (политики SELECT и UPDATE применяются к команде UPDATE), пользователь должен иметь оба типа разрешений (например, разрешение на выбор строк из отношения, а также разрешение на их обновление). Таким образом, выражения для одного типа политики комбинируются с выражениями для другого типа политики с помощью операции И.

Если к одной команде применяется несколько политик одного и того же типа команд, то должна быть хотя бы одна разрешительная (PERMISSIVE) политика предоставления доступа к отношению, а также должны удовлетворяться все ограничительные (RESTRICTIVE) политики. Таким образом, выражения всех политик PERMISSIVE объединяются с помощью операции ИЛИ, выражения всех политик RESTRICTIVE объединяются операцией И, а полученные результаты объединяются операцией И. Если политики PERMISSIVE отсутствуют, доступ запрещается.

Обратите внимание, что для целей объединения нескольких политик, политики ALL применяются как политики каждого применимого в данном случае типа.

Например, в команде UPDATE, требующей разрешений и для SELECT, и для UPDATE, в случае существования нескольких применимых политик каждого типа они будут объединяться следующим образом:

выражение from RESTRICTIVE SELECT/ALL policy 1
AND
выражение from RESTRICTIVE SELECT/ALL policy 2
AND
...
AND
(
  выражение from PERMISSIVE SELECT/ALL policy 1
  OR
  выражение from PERMISSIVE SELECT/ALL policy 2
  OR
  ...
)
AND
выражение from RESTRICTIVE UPDATE/ALL policy 1
AND
выражение from RESTRICTIVE UPDATE/ALL policy 2
AND
...
AND
(
  выражение from PERMISSIVE UPDATE/ALL policy 1
  OR
  выражение from PERMISSIVE UPDATE/ALL policy 2
  OR
  ...
)

Примечания

Текущий пользователь должен быть владельцем таблицы, чтобы создавать или изменять политики для нее.

Хотя политики будут применяться явно для запросов к таблицам в базе данных, они не применяются, когда система выполняет внутренние проверки целостности ссылок или проверяет ограничения. Это означает, что существуют косвенные способы определить, что данное значение существует. Примером этого является попытка вставить повторяющееся значение в столбец, образующий первичный ключ или имеющий ограничение уникальности. Если вставка завершается неудачно, то пользователь может сделать вывод, что значение уже существует. (В этом примере предполагается, что пользователю разрешено политикой вставлять записи, которые он не может видеть). Другой пример - это когда пользователю разрешено вставлять записи в таблицу, которая ссылается на другую, иным образом не видимую. Существование значения может быть определено пользователем, который вставляет значения в подчинённую таблицу, при этом успешный результат операции будет признаком того, что значение существует в главной таблице. Эти проблемы могут быть решены путем тщательной разработки политик, чтобы запретить пользователям вставлять, удалять или обновлять записи, которые могут указывать на значение, не видимые иным образом, либо используя генерируемые значения (например, суррогатные ключи).

Как правило, система будет применять условия фильтрации, введенные с помощью политик безопасности до условий в запросах пользователя, чтобы предотвратить нежелательную утечку защищаемых данных через пользовательские функции, которые могут быть недоверенными. Однако функции и операторы, помеченные системой (или системным администратором) как LEAKPROOF могут вычисляться до условий политики, так как они считаются доверенными.

Поскольку выражения политики добавляются в запрос пользователя, они будут выполняться с правами пользователя, выполняющего запрос. Таким образом, пользователи, на которых распространяется заданная политика, должны иметь доступ ко всем таблицам или функциям, на которые ссылается выражение, или они просто получат ошибку "отказано в доступе" при попытке обращения к целевой таблицу, (если для неё включена защита на уровне строк). Однако это не меняет способ работы представлений. Как и с обычными запросами и представлениями, проверки разрешений и политики для таблиц, на которые ссылается представление, и при этом будут действовать политики, распространяющиеся на этого владельца.

Дополнительное описание и практические примеры можно найти в разделе Политики безопасности строк.

Совместимость

Команда CREATE POLICY является расширением QHB.

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

ALTER POLICY, DROP POLICY, ALTER TABLE


CREATE PROCEDURE

CREATE PROCEDURE - создать процедуру

Синтаксис

CREATE [ OR REPLACE ] PROCEDURE
    имя ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [ { DEFAULT | = } выражение_по_умолчанию ] [, ...] ] )
  { LANGUAGE имя_языка
    | TRANSFORM { FOR TYPE имя_типа } [, ... ]
    | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
    | SET параметр_конфигурации { TO значение | = значение | FROM CURRENT }
    | AS 'определение'
    | AS 'объектный_файл', 'объектный_символ'
  } ...

Описание

CREATE PROCEDURE создает новую процедуру. CREATE OR REPLACE PROCEDURE будет либо создавать новую процедуру, либо заменять существующее определение. Чтобы иметь возможность определить процедуру, пользователь должен иметь право USAGE для соответствующего языка.

Если указано имя схемы, то процедура создается в указанной схеме. В противном случае он создается в текущей схеме. Имя новой процедуры не должно совпадать ни с одной существующей процедурой или функцией с теми же типами входных аргументов в той же схеме. Однако процедуры и функции с различными типами аргументов могут иметь одинаковое имя (это называется перегрузкой ).

Чтобы заменить текущее определение существующей процедуры, используйте CREATE OR REPLACE PROCEDURE. Таким образом невозможно изменить имя или типы аргументов процедуры (если вы попытаетесь, то фактически создадите новую, отличную процедуру).

Если CREATE OR REPLACE PROCEDURE используется для замены существующей процедуры, владелец и права доступа к этой процедуре не меняются. Всем остальным свойствам процедуры присваиваются значения, указанные явно или по умолчанию. Чтобы заменить процедуру, необходимо быть её владельцем (или быть членом роли-владельца).

Пользователь, создающий процедуру, становится ее владельцем.

Чтобы создать процедуру, необходимо иметь право USAGE для типов её аргументов.

Параметры

Имя

Имя, которое может быть дополнено схемой, создаваемой процедуры.

режим_аргумента

Режим аргумента: IN, INOUT, или VARIADIC. Если этот параметр опущен, значение по умолчанию равно IN. (OUT аргументы в настоящее время не поддерживаются для процедур. Можно воспользоваться INOUT вместо OUT).

имя_аргумента

Название аргумента.

тип_аргумента

Тип (ы) данных аргументов процедуры (при необходимости дополненные схемой), если таковые имеются. Типы аргументов могут быть базовыми, составными или доменными типами, а также могут ссылаться на тип столбца таблицы.

В зависимости от языка реализации также может быть разрешено указывать "псевдотипы", такие как cstring. Псевдотипы указывают, что фактический тип аргумента либо указан не полностью, либо находится вне набора обычных типов данных SQL.

Ссылка на тип столбца записывается в виде имя_таблицы.имя_столбца%TYPE. Использование этой функции иногда может помочь сделать процедуру независимой от изменений в определении таблицы.

выражение_по_умолчанию

Выражение, которое будет использоваться в качестве значения по умолчанию, если параметр не указан. Выражение должно быть приведено к типу аргумента параметра. Все входные параметры, следующие за параметром со значением по умолчанию, также должны иметь значения по умолчанию.

имя_языка

Имя языка, на котором реализована процедура. Это может быть sql, c, internal, или имя определяемого пользователем процедурного языка, например plpgsql. Стиль написания этого имени в апострофах считается устаревшим и требует точного совпадения регистра.

TRANSFORM { FOR TYPE имя_типа } [, ... ] }

Устанавливает список трансформаций, должны применяться при вызове процедуры. Трансформации выполняют преобразования между типами SQL и языковыми типами данных; см. CREATE TRANSFORM. Преобразования встроенных типов обычно жёстко предопределены в реализациях процедурных языков, так что их здесь указывать не нужно. Если реализация процедурного языка не знает, как обрабатывать тип, и трансформация не предоставляется, будет выполнено преобразование типов данных по умолчанию, но это зависит от реализации.

[EXTERNAL] SECURITY INVOKER
[EXTERNAL] SECURITY DEFINER

Характеристика SECURITY INVOKER (безопасность вызывающего) указывает, что процедура должна выполняться с правами вызывающего ее пользователя. Это значение по умолчанию. Вариант SECURITY DEFINER (безопасность определившего) указывает, что процедура должна выполняться с правами пользователя, которому она принадлежит(владельца).

Ключевое слово EXTERNAL (внешняя) допускается для соответствия стандарту SQL, но является необязательным, так как, в отличие от SQL, эта характеристика распространяется на все процедуры, а не только внешние.

В процедуре с характеристикой SECURITY DEFINER не могут выполняться операторы управления транзакциями (например, COMMIT и ROLLBACK в некоторых языках).

параметр_конфигурации
значение

Предложение SET определяет, что при вызове процедуры указанный параметр конфигурации должен принять заданное значение, а затем восстановить своё предыдущее значение при завершении процедуры. Предложение SET FROM CURRENT сохраняет в качестве значения, которое будет применено при входе в процедуру, значение, действующее при выполнении CREATE PROCEDURE.

Если в определение процедуры добавлено SET, то действие команды SET LOCAL, выполняемой внутри процедуры для того же параметра, ограничивается процедурой: предыдущее значение параметра конфигурации восстанавливается по завершении процедуры. Однако, обычная команда SET (без LOCAL) переопределяет значение SET, как и предыдущую команду SET LOCAL: эффекты команды сохраняется после завершения процедуры, если текущая транзакция не будет откачена.

Если к определению процедуры добавлено SET, то в этой процедуре не могут выполняться операторы управления транзакциями (например, COMMIT и ROLLBACK в некоторых языках).

Дополнительную информацию о разрешенных именах и значениях параметров смотрите в разделе SET и главе Конфигурация сервера.

определение

Строковая константа, определяющая процедуру; значение зависит от языка. Это может быть имя внутренней процедуры, путь к объектному файлу, команда SQL или код на процедурном языке.

Часто бывает полезно заключать определение процедуру в доллары (см. раздел Строковые константы в долларовых кавычках), а не в традиционные апострофы. Если не использовать доллары, любые одиночные кавычки или обратные косые черты в определении процедуры должны быть экранированы путем их удвоения.

объектный_файл, объектный_символ*

Это форма предложения AS используется для динамически загружаемых процедур на языке C, когда имя процедуры в исходном коде языка C не совпадает с именем процедуры SQL. Строка объектный_файл является именем файла разделяемой библиотеки, содержащего скомпилированную процедуру наC, и интерпретируется как параметр команды LOAD. Строка объектный_символ задаёт символ скомпонованной процедуры, то есть имя процедуры в исходном коде языка C. Если символ ссылки опущен, предполагается, что он совпадает с именем определяемой процедуры SQL.

При повторных вызовах CREATE PROCEDURE ссылается на один и тот же объектный файл, который загружается только один раз за сеанс. Чтобы выгрузить и перезагрузить файл (возможно, во время разработки), запустите новый сеанс.

Примечания

Дополнительные сведения о создании функций, которые также применяются к процедурам, см. разделе CREATE FUNCTION.

Чтобы выполнить процедуру, воспользуйтесь командой CALL.

Примеры

CREATE PROCEDURE insert_data(a integer, b integer)
LANGUAGE SQL
AS $$
INSERT INTO tbl VALUES (a);
INSERT INTO tbl VALUES (b);
$$;

CALL insert_data(1, 2);

Совместимость

Команда CREATE PROCEDURE определена в стандарте SQL. Реализация QHB близка к стандартизированной, но совместима с ней не полностью. Дополнительные сведения см. в разделе CREATE FUNCTION .

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

ALTER PROCEDURE, DROP PROCEDURE, CALL, CREATE FUNCTION


CREATE PUBLICATION

CREATE PUBLICATION - создать публикацию

Синтаксис

CREATE PUBLICATION имя
    [ FOR TABLE [ ONLY ] имя_таблицы [ * ] [, ...]
      | FOR ALL TABLES ]
    [ WITH ( параметр_публикации [= значение] [, ... ] ) ]

Описание

CREATE PUBLICATION добавляет новую публикацию в текущую базу данных. Имя публикации должно отличаться от имени других существующих публикации в текущей базе данных.

Публикация-это, по существу, группа таблиц, изменения данных которых должны быть реплицированы с помощью логической репликации. Дополнительные сведения о том, как публикации вписываются в параметры логической репликации.

Параметры

Имя

Имя новой публикации.

FOR TABLE

Указывает список таблиц для добавления в публикацию. Если перед именем таблицы указано ONLY, в публикацию добавляется только заданная таблица. Без ONLY добавляется и заданная таблица, и все её потомки (если таковые есть). После имени таблицы можно добавить необязательное указание *, чтобы явно указать, что включены таблицы-потомки.

Только постоянные базовые таблицы могут быть частью публикации. Временные, нежурналируемые, сторонние и партиционированные таблицы, а также материализованные и обычные представления не могут быть частью публикации. Чтобы реплицировать партиционированную таблицу, добавьте в публикацию ее отдельные партиции.

FOR ALL TABLES

Отмечает публикацию как публикацию, которая реплицирует изменения для всех таблиц в базе данных, включая таблицы, созданные в будущем.

WITH ( параметр_публикации [= значение] [, ... ] )

В этом предложении указываются необязательные параметры для публикации. Поддерживаются следующие параметры:

  • publish (string)

Этот параметр определяет, какие операции DML будут опубликованы новой публикацией для подписчиков. В качестве его значения через запятую задаётся список операций из следующих: insert, update, delete и truncate. По умолчанию публикуются все действия, поэтому значение по умолчанию для этого параметра равно 'insert, update, delete, truncate'.

Примечания

Если не задано ни FOR TABLE, ни FOR ALL TABLES, публикация создаётся с пустым набором таблиц. Это полезно, если таблицы будут добавлены позже.

Создание публикации не запускает репликацию. Оно определяет только логику группировки и фильтрации для будущих подписчиков.

Чтобы создать публикацию, пользователь должен иметь право CREATE в текущей базе данных. (Разумеется, на суперпользователей это условие не распространяется).

Чтобы добавить таблицу в публикацию, пользователь должен быть владельцем таблицы. Предложение FOR ALL TABLES требует, чтобы пользователь был суперпользователем.

Таблицы, добавленные в публикацию, которая публикует которая охватывает операции UPDATE и/или DELETE, должны иметь свойство REPLICA IDENTITY. В противном случае эти операции будут запрещены для этих таблиц.

Для команды INSERT ... ON CONFLICT публикация выдает операцию, которая фактически является результатом выполнения этой команды. Таким образом, в зависимости от результата, оно может быть опубликован как INSERT или UPDATE, или она может быть не опубликован вовсе.

Команды COPY ... FROM публикуются в виде операций INSERT.

Операции DDL не публикуются.

Примеры

Создание публикации, охватывающей изменения в двух таблицах:

CREATE PUBLICATION mypublication FOR TABLE users, departments;

Создание публикации, охватывающей все изменения во всех таблицах:

CREATE PUBLICATION alltables FOR ALL TABLES;

Создание публикации, охватывающей только операции INSERT в одной таблице:

CREATE PUBLICATION insert_only FOR TABLE mydata
    WITH (publish = 'insert');

Совместимость

Команда CREATE PUBLICATION является расширением QHB.

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

ALTER PUBLICATION, DROP PUBLICATION


CREATE ROLE

CREATE ROLE - создать роль в базе данных

Синтаксис

CREATE ROLE имя [ [ WITH ] параметр [ ... ] ]

Где параметр:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT предел_подключений
    | [ ENCRYPTED ] PASSWORD 'пароль' | PASSWORD NULL
    | VALID UNTIL 'дата_время'
    | IN ROLE имя_роли [, ...]
    | IN GROUP имя_роли [, ...]
    | ROLE имя_роли [, ...]
    | ADMIN имя_роли [, ...]
    | USER имя_роли [, ...]
    | SYSID uid

Описание

CREATE ROLE добавляет новую роль в кластер баз данных QHB. Роль-это сущность, которая может владеть объектами базы данных и иметь права доступа к базе данных; роль может рассматриваться как “пользователь”, “группа” или и то, и другое в зависимости от того, как она используется. Дополнительную информацию об управлении пользователями и проверке подлинности см. в главе Роли в базе данных. Чтобы выполнить эту команду, необходимо быть суперпользователем или иметь право CREATEROLE.

Обратите внимание, что роли определяются на уровне кластера баз данных и поэтому допустимы во всех базах данных в кластере.

Параметры

Имя

Название новой роли.

SUPERUSER
NOSUPERUSER

Эти предложения определяют, является ли новая роль "суперпользователем", который может переопределить все ограничения доступа в базе данных. Статус суперпользователя опасен и должен использоваться только тогда, когда это действительно необходимо. Чтобы создать нового суперпользователя вы должны сами быть суперпользователем. Значение по умолчанию NOSUPERUSER.

CREATEDB
NOCREATEDB

Эти предложения определяют способность роли создавать базы данных. Если CREATEDB указывается, то определяемой роли будет разрешено создавать новые баз данных. NOCREATEDB лишит роль возможности создавать базы данных. Значение по умолчанию NOCREATEDB.

CREATEROLE
NOCREATEROLE

Эти предложения определяют, будет ли разрешено роли для создание новых ролей (то есть выполнять CREATE ROLE ). Роль с правом CREATEROLE может также изменять и удалять другие роли. По умолчанию NOCREATEROLE.

INHERIT
NOINHERIT

Эти предложения определяют, наследует ли роль права ролей, членом которых она является. Роль с атрибутом INHERIT может автоматически использовать любые права в базе данных, предоставленные всем ролям, в которые она непосредственно или опосредованно входит. Без INHERIT членство в другой роли позволяет только выполнить SET ROLE и переключиться на эту роль; правами, назначенными другой роли, можно будет пользоваться только после этого. По умолчанию INHERIT.

LOGIN
NOLOGIN

Эти предложения определяют, разрешен ли роли вход на сервер; то есть, может ли роль быть задана в качестве начального авторизованного имени при подключении клиента. Роль, с атрибутом LOGIN может рассматриваться как пользователь. Роли без этого атрибута полезны для управления правами доступа к базе данных, но не являются пользователями в обычном смысле этого слова. По умолчанию NOLOGIN, за исключением случаев, когда CREATE ROLE вызывается через альтернативное написание CREATE USER.

REPLICATION
NOREPLICATION

Эти предложения определяют, является ли роль ролью репликации. Роль должна иметь этот атрибут (или быть суперпользователем), чтобы иметь возможность подключаться к серверу в режиме репликации (в режиме физической или логической репликация) и иметь возможность создавать или удалять слоты репликации. Роль, с атрибутом REPLICATION обладает очень большими правами и поэтому атрибут должен использоваться только в ролях, фактически используемых для репликации. По умолчанию NOREPLICATION.

BYPASSRLS
NOBYPASSRLS

Эти предложения определяют, будут ли для роли игнорироваться все политики защиты на уровне строк (RLS). Значение по умолчанию NOBYPASSRLS. Обратите внимание, что qhb_dump установит row_security(устанавливает значение OFF) по умолчанию, чтобы гарантировать, что все содержимое таблицы выгружается. Если пользователь, выполняющий qhb_dump, не имеет соответствующих прав, будет возвращена ошибка. Суперпользователь и владелец выгружаемой таблицы всегда обходят RLS.

CONNECTION LIMIT предел_подключений

Если роли разрешён вход, параметр указывает, сколько одновременных подключений может выполнить роль. -1 (по умолчанию) означает отсутствие ограничений. Обратите внимание, что под это ограничение подпадают только обычные соединения. Ни подготовленные транзакции, ни фоновые рабочие соединения не учитываются.

[ ENCRYPTED ] PASSWORD 'пароль'
PASSWORD NULL

Задает пароль роли. (Пароль используется только для ролей, с атрибутом LOGIN, но тем не менее вы можете определить его для ролей без него). Если вы не планируете использовать аутентификацию паролем, вы можете опустить эту опцию. Если пароль не указан, он будет установлен в значение NULL, и проверка подлинности пароля для этого пользователя всегда завершится ошибкой. При желании пароль NULL можно установить явно, указав PASSWORD NULL.

Замечание
При указании пустой строки пароль также будет иметь значение NULL Чтобы избежать двусмысленности, следует избегать указания пустой строки.

Пароль всегда хранится зашифрованным в системных каталогах. Ключевое слово ENCRYPTED не имеет эффекта, но принимается для обратной совместимости. Способ шифрования определяется параметром конфигурации password_encryption. Если представленная строка пароля уже находится в формате MD5-encrypted или SCRAM-encrypted, то она сохраняется как есть независимо от password_encryption (поскольку система не может расшифровать указанную зашифрованную строку пароля, зашифровать ее в другом формате). Это позволяет перезагрузить зашифрованные пароли во время выгрузки/восстановления.

VALID UNTIL ’дата_время

Предложение VALID UNTIL ’дата_время устанавливает дату и время, после которых пароль роли становится не действительным. Если этот пункт пропущен пароль будет действителен в течение всего времени.

IN ROLE имя_роли

В предложении IN ROLE имя_роли перечислены одна или несколько существующих ролей, к которым новая роль будет немедленно добавлена в качестве нового члена. (Обратите внимание, что нет возможности добавить новую роль в качестве администратора; для этого используйте отдельную команду GRANT).

IN GROUP имя_роли

IN GROUP устаревшее написание предложения IN ROLE.

ROLE имя_роли

В предложении ROLE перечислены одна или несколько существующих ролей, которые автоматически добавляются в качестве членов новой роли. (Это фактически делает новую роль "группой").

ADMIN имя_роли

Предложение ADMIN подобно ROLE, но перечисленные роли добавляются в новую роль с атрибутом WITH ADMIN OPTION, давая им право предоставлять членство в этой роли другим ролям.

USER имя_роли

Предложение USER является устаревшим написанием предложения ROLE.

SYSID uid

Предложение SYSID игнорируется, но принимается для обратной совместимости.

Примечания

Используйте команду ALTER ROLE, чтобы изменить атрибуты роли,
а для удаления роли — DROP ROLE. Все атрибуты, указанные в CREATE ROLE, могут быть позднее изменены командой ALTER ROLE.

Предпочтительным способом добавления и удаления членов ролей, используемых в качестве групп, является использование функций GRANT и REVOKE .

Предложение VALID UNTIL определяет срок действия только для пароля, а не для роли как таковой. В частности, время истечения срока действия не проверяется при входе в систему с помощью метода проверки подлинности без пароля.

Атрибут INHERIT управляет наследованием предоставленных прав (т. е. прав доступа для объектов базы данных и членства в ролях). Он не применяется к специальным атрибутам роли, заданным с помощью CREATE ROLE и ALTER ROLE. Например, членства в роли с правом CREATEDB недостаточно для получения права создавать базы данных, даже если установлен атрибут INHERIT; чтобы воспользоваться правом создавать базы данных, необходимо переключиться на эту роль, выполнив SET ROLE.

Будьте осторожны с правом CREATEROLE. На роли, создаваемые командой CREATEROLE, не распространяется концепция наследования. Это означает, что даже если у роли нет определенных прав, ей все равно разрешено создавать другие роли, и она может легко создать другую роль с правилами, отличными от тех что есть у нее самой (за исключением создания ролей с правами суперпользователя). Например, если роль «user» имеет право CREATEROLE, но не CREATEDB, она, тем не менее, может создать новую роль с правом CREATEDB. Поэтому роль с правом CREATEROLE следует воспринимать как роль почти суперпользователя.

QHB включает в себя программу createuser, которая имеет ту же функциональность команда CREATE ROLE (на самом деле она вызывает эту команду), но может запускаться в командной оболочке.

Ограничение CONNECTION LIMIT действует приблизительно; если одновременно запускаются два сеанса, в то время как для этой роли остаётся только одно «свободное место», может так случиться, что будут отклонены оба подключения. Кроме того, это ограничение не распространяется на суперпользователей.

При указании незашифрованного пароля с помощью этой команды необходимо соблюдать осторожность. Пароль будет передан на сервер в виде открытого текста, и он также может быть зарегистрирован в журнале команд клиента или журнале сервера. Команда createuser, однако, передает зашифрованный пароль.

Примеры

Создание роли, для которой разрешён вход, но не задан пароль:

CREATE ROLE jonathan LOGIN;

Создание роли с паролем:

CREATE USER davide WITH PASSWORD 'jw8s0F4';

(CREATE USER действует так же, как CREATE ROLE, но подразумевает ещё и атрибут LOGIN).

Создание роли с паролем, действующим до конца 2004 г., то есть пароль перестаёт действовать в первую же секунду 2005 г.

CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2005-01-01';

Создание роли, которая может создавать базы данных и управлять ролями:

CREATE ROLE admin WITH CREATEDB CREATEROLE;

Совместимость

Команда CREATE ROLE описана в стандарте SQL, но стандарт требует поддержки только следующего синтаксиса:

CREATE ROLE имя [ WITH ADMIN имя_роли ]

Возможность создавать множество начальных администраторов и все другие параметры CREATE ROLE относятся к расширениям QHB.

Стандарт SQL определяет понятия пользователей и ролей, но он рассматривает их как отдельные понятия, а все команды создания пользователей считаются внутренней спецификой СУБД. В QHB мы решили объединить пользователей и роли в единый вид сущности. Таким образом, роли имеют гораздо больше дополнительных атрибутов, чем в стандарте.

Поведение, заданное стандартом SQL, можно получить, если создавать пользователей с атрибутом NOINHERIT, а роли - с атрибутом INHERIT.

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

SET ROLE, ALTER ROLE, DROP ROLE, GRANT, REVOKE, createuser


CREATE RULE

CREATE RULE - определение нового правила перезаписи

Синтаксис

CREATE [ OR REPLACE ] RULE имя AS ON событие
    TO имя_таблицы [ WHERE условие ]
    DO [ ALSO | INSTEAD ] { NOTHING | команда | ( команда ; команда ... ) }

Где событие может быть:

    SELECT | INSERT | UPDATE | DELETE

Описание

CREATE RULE определяет новое правило, применяемое к указанной таблице или представлению. CREATE OR REPLACE RULE будет либо создавать новое правило, либо заменять существующее правило с тем же именем для той же таблицы.

Система правил QHB позволяет определить альтернативное действие, которое будет выполняться при вставке, обновлении или удалении в таблицах базы данных. Грубо говоря, правило вызывает выполнение дополнительных команд, когда выполняется данная команда на данной таблице. В качестве альтернативы, правило INSTEAD может заменить данную команду другой или привести к тому, что команда не будет выполняться вообще. Правила также используются для реализации представлений SQL. Важно понимать, что правило-это действительно механизм преобразования команд или командный макрос. Преобразование происходит до начала выполнения команды. Если вам действительно нужна операция, которая срабатывает независимо для каждой физической строки, вы, вероятно, хотите использовать триггер, а не правило.

На данный момент, правила ON SELECT должны быть безусловными, с указанием INSTEAD, и их действия должны состоять из единственной команды SELECT. Таким образом, правило ON SELECT эффективно превращает таблицу в представление, видимым содержимым которого являются строки, возвращаемые командой SELECT, заданной в правиле, а не данные, хранящиеся в таблице (если они есть). Считается все же что для этой цели лучше пользоваться командой CREATE VIEW, а не создавать реальную таблицу и определять затем правило ON SELECT для неё.

Вы можете создать иллюзию обновляемого представления путем определения правил ON INSERT, ON UPDATE и ON DELETE (или любого подмножество правил, достаточного для ваших целей) и заменив операции обновления в представлении соответствующими обновлениями в других таблицах. Если вы хотите, чтобы поддержать оператор INSERT RETURNING и и подобные ему, то не забудьте поместить подходящее предложение RETURNING в каждом из этих правил.

Существует подвох, если вы пытаетесь использовать условные правила для обновления сложных представлений: для каждого действия, которое вы хотите разрешить для представления, необходимо определить безусловное правило INSTEAD. Если определено только условное правило, или правило не типа INSTEAD, система отвергнет попытки выполнить изменения, предполагая, что в некоторых случаях изменения могут свестись к операциям с фиктивной нижележащей таблицей. Если вы хотите обрабатывать все полезные случаи изменений в условных правилах, добавьте безусловное правило DO INSTEAD NOTHING, гарантирующее, что система поймет, что ей никогда не придётся изменять нижележащую таблицу. Затем создайте условные правила без свойства INSTEAD; в тех случаях, когда они будут применяться, их действия будут добавлены к действию по умолчанию INSTEAD NOTHING. (Однако, этот способ в настоящее время не подходит для реализации запросов RETURNING.)

Замечание
Представление, которое достаточно просто, чтобы быть автоматически обновляемым (см. CREATE VIEW), не требует правила, созданного пользователем, чтобы быть обновляемым. Хотя вы можете создать явное правило в любом случае, автоматическое преобразование обновления, как правило, превосходит явное правило.
Еще одна альтернатива, которую стоит рассмотреть, - это использование триггеров INSTEAD OF (см. раздел CREATE TRIGGER) вместо правил.

Параметры

Имя

Имя создаваемого правила. Должно отличаться от имени любого другого правила для той же таблицы. Несколько правил для одной и той же таблицы и одного и того же типа событий применяются в алфавитном порядке имен.

событие

Тип события: SELECT, INSERT, UPDATE или DELETE. Обратите внимание, что INSERT, с предложением ON CONFLICT не может быть использовано в таблицах, для которых определены правила INSERT, UPDATE. Вместо этого рассмотрите возможность использования изменяемого представления.

имя_таблицы

Имя, которое может быть дополнено схемой, таблицы или представления, к которым будет применяться правило.

условие

Любое выражение условия SQL (возвращающее boolean). Выражение условия не может ссылаться ни на какие таблицы, кроме NEW и OLD, и не может содержать агрегатных функций.

INSTEAD

INSTEAD указывает, что команды должны выполняться вместо исходной команды.

ALSO

ALSO указывает, что команды должны выполняться в дополнение к исходной команде.

Если ни INSTEAD, ни ALSO не заданы, по умолчанию применяется ALSO.

команда

Команда или команды, составляющие действие правила. Допустимыми командами являются SELECT, INSERT , UPDATE , DELETE или NOTIFY.

В параметрах условие и команда, имена специальных таблиц NEW и OLD могут использоваться для обращения к значениям в соответствующей таблице. NEW действительна в правилах ON INSERT и ON UPDATE для ссылки на новую вставляемую или обновляемую строку. OLD действительна в правилах ON UPDATE и ON DELETE для ссылки на существующую строку, которая обновляется или удаляется.

Примечания

Текущий пользователь должен быть владельцем таблицы, чтобы создавать или изменять правила для нее.

В правила для INSERT, UPDATE или DELETE для представления можно добавить предложение RETURNING, которое выдает столбцы представления. Это предложение будет использоваться для вычисления выходных данных, если правило инициируется командой INSERT RETURNING, UPDATE RETURNING или DELETE RETURNING. Когда правило запускается командой без RETURNING, правило RETURNING будет проигнорировано. Текущая реализация позволяет только безусловным правилам INSTEAD, содержать RETURNING; кроме того, может быть не более одного предложения RETURNING среди всех правил для одного события. (Это гарантирует, что существует только один предложение RETURNING, которое и будет использоваться для вычисления результатов). Запросы с RETURNING к представление будут отклонены, если в его правилах нет ни одного предложения RETURNING.

Очень важно позаботиться о том, чтобы правила не зацикливались. Например, хотя каждое из следующих двух определений правил принимается QHB, команда SELECT приведет к тому, что QHB сообщит об ошибке из-за рекурсивного расширения правила:

CREATE RULE "_RETURN" AS
    ON SELECT TO t1
    DO INSTEAD
        SELECT * FROM t2;

CREATE RULE "_RETURN" AS
    ON SELECT TO t2
    DO INSTEAD
        SELECT * FROM t1;

SELECT * FROM t1;

В настоящее время, если действие правила содержит команду NOTIFY, команда NOTIFY будет выполняться безоговорочно, то есть уведомление будет выдано, даже если нет строк, к которым должно применяться правило. Например:

CREATE RULE notify_me AS ON UPDATE TO mytable DO ALSO NOTIFY mytable;

UPDATE mytable SET name = 'foo' WHERE id = 42;

событие NOTIFY будет отправлено во время выполнения UPDATE, независимо от того, есть ли строки, соответствующие условию id = 42. Это ограничение реализации, которое может быть исправлено в будущих выпусках.

Совместимость

Команда CREATE RULE является расширением QHB, как и вся система перезаписи запросов.

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

ALTER RULE, DROP RULE


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 и дополнительные подкоманды, которые в настоящее время не принимает QHB.

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

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

Указание IF NOT EXISTS является расширением QHB.

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

ALTER SCHEMA, DROP SCHEMA


CREATE SEQUENCE

CREATE SEQUENCE -определение нового генератора последовательности

Синтаксис

CREATE [ TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ] name
    [ AS data_type ]
    [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
    [ OWNED BY { table_name.column_name | NONE } ]

Описание

CREATE SEQUENCE создает новый генератор порядковых номеров. Это включает в себя создание и инициализацию новой специальной однострочной таблицы с именем Имя. Генератор будет принадлежать пользователю, выдавшему команду.

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

После того, как последовательность создана, вы используете функции nextval, currval, и setval чтобы оперировать на последовательности. Эти функции описаны в разделе Функции управления последовательностями.

Хотя вы не можете обновить последовательность напрямую, вы можете использовать запрос, например:

SELECT * FROM name;

изучить параметры и текущее состояние последовательности. В частности, то, что последнее значение поле последовательности показывает последнее значение, выделенное любым сеансом. (Конечно, это значение может устареть к моменту его печати, если другие сеансы активно работают nextval звонки).

Параметры

TEMPORARY или TEMP

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

IF NOT EXISTS

Не считать ошибкой, если связь с тем же именем уже существует. В этом случае выдается соответствующее уведомление. Обратите внимание, что нет никакой гарантии, что существующее отношение является чем - то вроде последовательности, которая была бы создана-это может даже не быть последовательностью.

name

Имя, которое может быть дополнено схемой, создаваемой последовательности.

data_type

Необязательное предложение Как data_type задает тип данных последовательности. Допустимые типы: smallint, integer, и bigint. bigint это значение по умолчанию. Тип данных определяет минимальные и максимальные значения последовательности по умолчанию.

increment

Необязательное предложение INCREMENT BY increment указывает, какое значение добавляется к текущему значению последовательности для создания нового значения. Положительное значение сделает восходящую последовательность, отрицательное-нисходящую. Значение по умолчанию: 1.

minvalue NO MINVALUE

Необязательное предложение MINVALUE minvalue определяет минимальное значение, которое может генерировать последовательность. Если это условие не указано или не указано значение MINVALUE, будут использоваться значения по умолчанию. Значение по умолчанию для восходящей последовательности равно 1. По умолчанию для нисходящей последовательности используется минимальное значение типа данных.

maxvalue NO MAXVALUE

Необязательное предложение MAXVALUE maxvalue определяет максимальное значение для последовательности. Если условие не указано или указано значение NO MAXVALUE, будут использоваться значения по умолчанию. По умолчанию для восходящей последовательности используется максимальное значение типа данных. Значение по умолчанию для нисходящей последовательности равно -1.

start

Необязательное предложение START WITH start позволяет последовательности начинаться в любом месте. Начальное значение по умолчанию: minvalue для восходящих последовательностей и maxvalue для нисходящих.

cache

Необязательное предложение CACHE cache указывает, сколько порядковых номеров должно быть предварительно выделено и сохранено в памяти для быстрого доступа. Минимальное значение равно 1 (только одно значение может быть сгенерировано одновременно, т. е. без кэша), и это также значение по умолчанию.

CYCLE NO CYCLE

Опция CYCLE позволяет последовательности продолжаться, когда maxvalue или minvalue была достигнута восходящей или нисходящей последовательностью соответственно. Если лимит достигнут, то следующим сгенерированным номером будет minvalue или maxvalue, соответственно.

Если указано NO CYCLE, любые вызовы nextval после того, как последовательность достигнет своего максимального значения, будут возвращать ошибку. Если не указан ни CYCLE ни NO CYCLE, по умолчанию используется NO CYCLE.

OWNED BY table_name.column_name
OWNED BY NONE

Опция OWNED BY заставляет последовательность быть связанной с определенным столбцом таблицы, таким образом, что если этот столбец (или вся его таблица) удаляется, последовательность будет автоматически удалена также. Указанная таблица должна иметь того же владельца и находиться в той же схеме, что и последовательность. OWNED BY NONE, значение по умолчанию указывает, что такой связи не существует.

Примечания

Используйте DROP SEQUENCE, чтобы удалить последовательность.

Последовательности основаны на bigint арифметике, поэтому диапазон не может превышать диапазон восьмибайтного целого числа (от -9223372036854775808 до 9223372036854775807).

Потому что nextval и setval вызовы никогда не откатываются, объекты последовательности не могут быть использованы, если требуется "gapless" присвоение порядковых номеров. Можно построить gapless присваивание с помощью исключительной блокировки таблицы, содержащей счетчик; но это решение гораздо дороже, чем объекты последовательности, особенно если многие транзакции требуют порядковые номера одновременно.

Неожиданные результаты могут быть получены, если a cache настройка больше единицы используется для объекта последовательности, который будет использоваться одновременно несколькими сеансами. Каждый сеанс будет выделять и кэшировать последовательные значения последовательности во время одного доступа к объекту последовательности и увеличивать значение объекта последовательности последнее значение соответственно. Затем, следующее cache-1 использование nextval в этом сеансе просто верните предварительно выделенные значения, не касаясь объекта последовательности. Таким образом, любые номера, выделенные, но не используемые в сеансе, будут потеряны, когда этот сеанс закончится, что приведет к "дырам" в последовательности.

Кроме того, хотя несколько сеансов гарантированно выделяют отдельные значения последовательности, значения могут быть сгенерированы из последовательности, когда рассматриваются все сеансы. Например, с a cache установка 10, сессия A может резервировать значения 1..10 и возвращение nextval=1, то сессия B может зарезервировать значения 11..20 и возвращение nextval=11 Перед началом сеанса a сгенерировал nextval=2. Таким образом, с a cache установка одного можно с уверенностью предположить, что nextval значения генерируются последовательно; с a cache установка больше единицы вы должны только предполагать, что nextval значения все различны, а не то, что они генерируются чисто последовательно. Также, последнее значение будет отражать последнее значение, зарезервированное любым сеансом, независимо от того, было ли оно уже возвращено nextval.

Еще одно соображение заключается в том, что a setval выполнение в такой последовательности не будет замечено другими сеансами, пока они не используют все предварительно выделенные значения, которые они кэшировали.

Примеры

Создайте восходящую последовательность под названием серийный, начиная с 101 года:

CREATE SEQUENCE serial START 101;

Выберите следующий номер из этой последовательности:

SELECT nextval('serial');

 nextval
---------
     101

Выберите следующий номер из этой последовательности:

SELECT nextval('serial');

 nextval
---------
     102

Используйте эту последовательность в команде INSERT:

INSERT INTO distributors VALUES (nextval('serial'), 'nothing');

Обновите значение последовательности после копирования из:

BEGIN;
COPY distributors FROM 'input_file';
SELECT setval('serial', max(id)) FROM distributors;
END;

Совместимость

CREATE SEQUENCE соответствует стандарту SQL, за следующими исключениями:

  • Получение следующего значения производится с помощью nextval() функция вместо NEXT VALUE FOR выражения.

  • OWNED BY: предложение является расширением QHB.

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

ALTER SEQUENCE, DROP SEQUENCE


CREATE SERVER

CREATE SERVER - создать новый сторонний сервер

Синтаксис

CREATE SERVER [ IF NOT EXISTS ] имя_сервера [ TYPE 'тип_сервера' ] [ VERSION 'версия_сервера' ]
    FOREIGN DATA WRAPPER имя_обертки_сторонних_данных
    [ OPTIONS ( параметр 'значение' [, ... ] ) ]

Описание

CREATE SERVER создает новый сторонний сервер. Пользователь, создавший сервер, становится его владельцем.

Определение стороннего сервера обычно включает информацию о подключении, которую обертка сторонних данных использует для доступа к внешнему ресурсу данных. Дополнительная информация о соединении может быть определена с помощью пользовательских сопоставлений.

Имя сервера должно быть уникальным в пределах базы данных.

Для создания сервера требуется право USAGE на используемую обертку сторонних данных.

Параметры

IF NOT EXISTS

Не выдавать ошибку, если сервер с тем же именем уже существует. В этом случае выдается соответствующее уведомление. Обратите внимание, что нет никакой гарантии, что существующий сервер как-то соотносится с тем, который был бы создан.

имя_сервера

Имя создаваемого стороннего сервера.

тип_сервера

Необязательный тип сервера, потенциально полезный для оберток сторонних данных.

версия_сервера

Необязательная версия сервера, потенциально полезная для оберток сторонних данных.

имя_обертки_сторонних_данных

Имя обертки сторонних данных, управляющей сервером.

OPTIONS ( параметр 'значение' [, ... ] )

Это предложение определяет параметры для сервера. Параметры обычно определяют сведения о соединении сервера, но фактические имена и значения зависят от обертки сторонних данных сервера.

Примечания

При использовании модуля dblink имя стороннего сервера может использоваться в качестве аргумента функции dblink_connect для указания параметров соединения. Необходимо иметь право USAGE для стороннего сервера, чтобы иметь возможность использовать его таким образом.

Примеры

Создание сервера myserver, который использует обертку сторонних данных qhb_fdw:

CREATE SERVER myserver FOREIGN DATA WRAPPER qhb_fdw OPTIONS (host 'foo', dbname 'foodb', port '5432');

Совместимость

Команда CREATE SERVER соответствует стандарту ISO/IEC 9075-9 (SQL/MED).

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

ALTER SERVER, DROP SERVER, CREATE FOREIGN DATA WRAPPER, CREATE FOREIGN TABLE, CREATE USER MAPPING


CREATE STATISTICS

CREATE STATISTICS-определение расширенной статистики

Синтаксис

CREATE STATISTICS [ IF NOT EXISTS ] statistics_name
    [ ( statistics_kind [, ... ] ) ]
    ON column_name, column_name [, ...]
    FROM table_name

Описание

CREATE STATISTICS создаст новый расширенный объект статистики, отслеживающий данные о заданной таблице, сторонней таблице или материализованном представлении. Объект статистики будет создан в текущей базе данных и будет принадлежать пользователю, выдавшему команду.

Если задано имя схемы (например, CREATE STATISTICS myschema.mystat ...) затем объект статистики создается в указанной схеме. В противном случае он создается в текущей схеме. Имя объекта статистики должно отличаться от имени любого другого объекта статистики в той же схеме.

Параметры

IF NOT EXISTS

Не выдавать ошибку, если объект статистики с тем же именем уже существует. В этом случае выдается соответствующее уведомление. Обратите внимание, что здесь рассматривается только имя объекта статистики, а не детали его определения.

statistics_name

Имя, которое может быть дополнено схемой, создаваемого объекта статистики.

statistic_kind

Тип статистики, который будет вычисляться в этом объекте статистики. В настоящее время поддерживаются следующие виды ndistinct, что позволяет n-различную статистику, зависимости, который включает статистику функциональной зависимости, и mcv что включает списки наиболее распространенных значений. Если это предложение опущено, все поддерживаемые типы статистики включаются в объект статистики. Дополнительную информацию см. в разделе Расширенная статистика и раздел Примеры многомерной статистики.

column_name

Имя столбца таблицы, который должен быть покрыт вычисляемой статистикой. Должно быть задано не менее двух имен столбцов; порядок имен столбцов незначителен.

table_name

Имя, которое может быть дополнено схемой таблицы, содержащей столбец(ы), по которому вычисляются статистические данные.

Примечания

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

Примеры

Создание таблицы t1 с двумя функционально зависимыми столбцами, т. е. знание значения в первом столбце достаточно для определения значения в другом столбце. Затем на этих столбцах строится статистика функциональной зависимости:

CREATE TABLE t1 (
    a   int,
    b   int
);

INSERT INTO t1 SELECT i/100, i/500
                 FROM generate_series(1,1000000) s(i);

ANALYZE t1;

-- the number of matching rows will be drastically underestimated:
EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0);

CREATE STATISTICS s1 (dependencies) ON a, b FROM t1;

ANALYZE t1;

-- now the row count estimate is more accurate:
EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0);

Без статистики функциональной зависимости планировщик предположил бы, что эти два WHERE условия независимы и умножили бы их селективности вместе, чтобы получить слишком маленькую оценку количества строк. С такой статистикой планировщик признает, что WHERE условия являются избыточными и не недооценивают количество строк.

Создание таблицы t2 с двумя идеально коррелированными столбцами (содержащими идентичные данные) и списком MCV на этих столбцах:

CREATE TABLE t2 (
    a   int,
    b   int
);

INSERT INTO t2 SELECT mod(i,100), mod(i,100)
                 FROM generate_series(1,1000000) s(i);

CREATE STATISTICS s2 (mcv) ON a, b FROM t2;

ANALYZE t2;

-- valid combination (found in MCV)
EXPLAIN ANALYZE SELECT * FROM t2 WHERE (a = 1) AND (b = 1);

-- invalid combination (not found in MCV)
EXPLAIN ANALYZE SELECT * FROM t2 WHERE (a = 1) AND (b = 2);

Список MCV предоставляет планировщику более подробную информацию о конкретных значениях, которые обычно отображаются в таблице, а также верхнюю границу выборочности комбинаций значений, которые не отображаются в таблице, что позволяет ему генерировать лучшие оценки в обоих случаях.

Совместимость

В стандарте SQL нет команды CREATE STATISTICS.

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

ALTER STATISTICS, DROP STATISTICS


CREATE SUBSCRIPTION

CREATE SUBSCRIPTION -определение новой подписки

Синтаксис

CREATE SUBSCRIPTION subscription_name
    CONNECTION 'conninfo'
    PUBLICATION publication_name [, ...]
    [ WITH ( subscription_parameter [= value] [, ... ] ) ]

Описание

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

Подписка представляет собой подключение репликации к издателю. Таким образом, эта команда не только добавляет определения в локальные каталоги, но и создает слот репликации на издателе.

При фиксации транзакции, в которой выполняется эта команда, будет запущен процесс логической репликации для репликации данных для новой подписки.

Параметры

subscription_name

Имя новой подписки.

CONNECTION 'conninfo'

Строка подключения к издателю..

PUBLICATION publication_name

Названия публикаций на издателя, на которые необходимо подписаться.

WITH ( subscription_parameter [= value] [, ... ] )

В этом предложении указываются необязательные параметры для подписки. Поддерживаются следующие параметры:

copy_data (boolean)

Указывает, следует ли копировать существующие данные в публикациях, на которые выполняется подписка, после запуска репликации. Значение по умолчанию: истинный.

create_slot (boolean)

Указывает, должна ли команда создать слот репликации на издателе. Значение по умолчанию: истинный.

enabled (boolean)

Указывает, должна ли подписка активно тиражироваться или она должна быть только настроена, но еще не запущена. Значение по умолчанию: истинный.

slot_name (string)

Имя используемого слота репликации. Поведение по умолчанию заключается в использовании имени подписки для имени слота.

Когда slot_name имеет значение: NONE, не будет никакого слота репликации, связанного с подпиской. Это можно использовать, если слот репликации будет создан позже вручную. Такие подписки также должны быть enabled и create_slot устанавливать false.

synchronous_commit (enum)

Значение этого параметра переопределяет параметр synchronous_commit. Значение по умолчанию: ВЫКЛ (off).

Это безопасно для использования off для логической репликации: если подписчик теряет транзакции из-за отсутствия синхронизации, данные будут повторно отправлены издателем.

При выполнении синхронной логической репликации может потребоваться другой параметр. Процессы логической репликации сообщают о положениях операций записи и сброса на издателе, и при использовании синхронной репликации издатель будет ожидать фактического сброса. Это означает, что настройка synchronous_commit для абонента off при использовании подписки для синхронной репликации может увеличиться задержка COMMIT на издателе. В этом случае может быть выгодно установить synchronous_commit на local или выше.

connect (boolean)

Указывает, должна ли CREATE SUBSCRIPTION вообще подключаться к издателю. Установите этот параметр в false будет изменено значение по умолчанию: enabled, create_slot и copy_data на false.

Не допускается совмещать connect установленного в false и enabled, create_slot, или copy_data, установленного в true.

Так как соединение не устанавливается, когда этот параметр установлен в ложный, таблицы не подписаны, и поэтому после включения подписки ничего не будет реплицироваться. Это необходимо для запуска ALTER SUBSCRIPTION ... REFRESH PUBLICATION для того, чтобы таблицы были подписаны.

Примечания

Дополнительные сведения о настройке управления доступом между подпиской и экземпляром публикации.

При создании слота репликации (поведение по умолчанию), CREATE SUBSCRIPTION нельзя выполнить внутри блока транзакций.

Создание подписки, которая подключается к одному и тому же кластеру баз данных (например, для репликации между базами данных в одном и том же кластере или для репликации в одной и той же базе данных), будет успешным только в том случае, если слот репликации не создается в рамках одной команды. В противном случае вызов CREATE SUBSCRIPTION будет зависать. Чтобы выполнить эту работу, создайте слот репликации отдельно (с помощью функции pg_create_logical_replication_slot с именем плагина pgoutput) и создайте подписку с помощью параметра create_slot = false. Это ограничение реализации, которое может быть снято в будущем выпуске.

Примеры

Создайте подписку на удаленный сервер, который реплицирует таблицы в публикациях mypublication и insert_only и начинает тиражироваться сразу по коммиту:

CREATE SUBSCRIPTION mysub
         CONNECTION 'host=192.168.1.50 port=5432 user=foo dbname=foodb'
        PUBLICATION mypublication, insert_only;

Создайте подписку на удаленный сервер, который реплицирует таблицы в insert_only публикация и не начинается репликация, пока не будет включена позже.

CREATE SUBSCRIPTION mysub
         CONNECTION 'host=192.168.1.50 port=5432 user=foo dbname=foodb'
        PUBLICATION insert_only
               WITH (enabled = false);

Совместимость

CREATE SUBSCRIPTION-это расширение QHB.

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

ALTER SUBSCRIPTION, DROP SUBSCRIPTION, CREATE PUBLICATION, ALTER PUBLICATION


CREATE TABLE

CREATE TABLE-определение новой таблицы

Синтаксис

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name ( [
  { column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
    | table_constraint
    | LIKE source_table [ like_option ... ] }
    [, ... ]
] )
[ INHERITS ( parent_table [, ... ] ) ]
[ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
    OF type_name [ (
  { column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ]
    | table_constraint }
    [, ... ]
) ]
[ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
    PARTITION OF parent_table [ (
  { column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ]
    | table_constraint }
    [, ... ]
) ] { FOR VALUES partition_bound_spec | DEFAULT }
[ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]

where column_constraint is:

[ CONSTRAINT constraint_name ]
{ NOT NULL |
  NULL |
  CHECK ( expression ) [ NO INHERIT ] |
  DEFAULT default_expr |
  GENERATED ALWAYS AS ( generation_expr ) STORED |
  GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] |
  UNIQUE index_parameters |
  PRIMARY KEY index_parameters |
  REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
    [ ON DELETE referential_action ] [ ON UPDATE referential_action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

and table_constraint is:

[ CONSTRAINT constraint_name ]
{ CHECK ( expression ) [ NO INHERIT ] |
  UNIQUE ( column_name [, ... ] ) index_parameters |
  PRIMARY KEY ( column_name [, ... ] ) index_parameters |
  EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ] |
  FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
    [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

and like_option is:

{ INCLUDING | EXCLUDING } { COMMENTS | CONSTRAINTS | DEFAULTS | GENERATED | IDENTITY | INDEXES | STATISTICS | STORAGE | ALL }

and partition_bound_spec is:

IN ( partition_bound_expr [, ...] ) |
FROM ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] )
  TO ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] ) |
WITH ( MODULUS numeric_literal, REMAINDER numeric_literal )

index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:

[ INCLUDE ( column_name [, ... ] ) ]
[ WITH ( storage_parameter [= value] [, ... ] ) ]
[ USING INDEX TABLESPACE tablespace_name ]

exclude_element in an EXCLUDE constraint is:

{ column_name | ( expression ) } [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]

Описание

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

Если задано имя схемы (например, CREATE TABLE myschema.mytable ...) таблица создается в указанной схеме. В противном случае она создается в текущей схеме. Временные таблицы существуют в специальной схеме, поэтому имя схемы не может быть задано при создании временной таблицы. Имя таблицы должно отличаться от имени любой другой таблицы, последовательности, индекса, представления или сторонней таблицы в той же схеме.

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

Необязательные предложения ограничений определяют ограничения (тесты), которым должны удовлетворять новые или обновленные строки для успешного выполнения операции вставки или обновления. Ограничение-это объект SQL, который помогает различными способами определить набор допустимых значений в таблице.

Существует два способа определения ограничений: ограничения таблицы и ограничения столбца. Ограничение столбца определяется как часть определения столбца. Определение ограничения таблицы не привязано к определенному столбцу, и оно может охватывать несколько столбцов. Каждое ограничение столбца также может быть записано как ограничение таблицы; ограничение столбца - это только нотационное удобство для использования, когда ограничение затрагивает только один столбец.

Чтобы иметь возможность создать таблицу, текущий пользователь должен иметь право USAGE на все типы столбцов или типа в предложении OF, соответственно.

Параметры

TEMPORARY или TEMP

Если этот параметр указан, таблица создается как временная таблица. Временные таблицы автоматически удаляются в конце сеанса или, возможно, в конце текущей транзакции (см. раздел НА КОММИТЕ под). Существующие постоянные таблицы с одинаковыми именами не видны текущему сеансу, пока существует временная таблица, если только они не связаны с именами, определенными схемой. Все индексы, созданные во временной таблице, также автоматически являются временными.

Процесс «Автовакуум» не может получить доступ и, следовательно, не может вакуумировать или анализировать временные таблицы. По этой причине соответствующие операции вакуумирования и анализа должны выполняться с помощью команд SQL сеанса. Например, если временная таблица будет использоваться в сложных запросах, целесообразно запустить ANALYZE для временной таблицы после ее заполнения.

Необязательно, GLOBAL или LOCAL можно написать и раньше TEMPORARY или TEMP. В настоящее время это не имеет никакого значения в QHB и не рекомендуется; см. Cовместимость.

UNLOGGED

Если указано, таблица создается как незарегистрированная таблица. Данные, записанные в незарегистрированные таблицы, не записываются в журнал предварительной записи (см. главу Надежность и журнал записи), что делает их значительно быстрее, чем обычные таблицы. Однако они не являются безопасными для сбоев: незарегистрированная таблица автоматически усекается после сбоя или нечистого завершения работы. Содержимое незарегистрированной таблицы также не реплицируется на резервные серверы. Все индексы, созданные в незарегистрированной таблице, также автоматически разблокируются.

IF NOT EXISTS

Не считать ошибкой, если связь с тем же именем уже существует. В этом случае выдается соответствующее уведомление. Обратите внимание, что нет никакой гарантии, что существующее отношение является чем-то подобным тому, которое было бы создано.

table_name

Имя, которое может быть дополнено схемой, создаваемой таблицы.

OF type_name

Создает typed table, которая берет свою структуру из указанного составного типа (имя, возможно, дополненное схемой). Типизированная таблица привязывается к своему типу; например, таблица будет удалена, если тип будет удален (с DROP TYPE ... CASCADE).

При создании типизированной таблицы типы данных столбцов определяются базовым составным типом и не определяются базовым составным типом. CREATE TABLE команда. Но это не так. CREATE TABLE команда может добавлять в таблицу значения по умолчанию и ограничения, а также указывать параметры хранения.

column_name

Имя столбца, который будет создан в новой таблице.

data_type

Тип данных столбца. Это может включать в себя спецификаторы массива. Дополнительную информацию о типах данных, поддерживаемых QHB, смотрите в главе Типы данных.

COLLATE collation

То COLLATE предложение присваивает столбцу правила сортировки (которые должны иметь сопоставимый тип данных). Если параметр не указан, используются правила сортировки по умолчанию для типа данных столбца.

INHERITS ( parent_table [, ... ] )

Необязательный параметр INHERITS предложение задает список таблиц, из которых новая таблица автоматически наследует все столбцы. Родительские таблицы могут быть простыми таблицами или сторонними таблицами.

Использование INHERITS создает постоянную связь между новой дочерней таблицей и ее родительскими таблицами. Изменения схемы для родительских объектов обычно распространяются и на дочерние объекты, и по умолчанию данные дочерней таблицы включаются в сканирование родительских объектов.

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

CHECK ограничения объединяются по существу так же, как и столбцы: если несколько родительских таблиц и / или новое определение таблицы содержат однотипные имена CHECK ограничения, все эти ограничения должны иметь одно и то же выражение проверки, иначе появится сообщение об ошибке. Ограничения, имеющие одинаковое имя и выражение, будут объединены в одну копию. Ограничение помечено NO INHERIT в качестве родителя рассматриваться не будет. Обратите внимание, что безымянный CHECK ограничение в новой таблице никогда не будет объединено, так как для него всегда будет выбрано уникальное имя.

Колонка STORAGE настройки также копируются из родительских таблиц.

Если столбец в родительской таблице является столбцом идентификаторов, это свойство не наследуется. При желании столбец в дочерней таблице можно объявить столбцом идентификаторов.

PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ opclass ] [, ...] )

Необязательный параметр PARTITION BY предложение задает стратегию партиционирования таблицы. Созданная таким образом таблица называется партиционированной таблицей. Заключенный в скобки список столбцов или выражений формирует ключ партиции для таблицы. При использовании партиционирования диапазона или хэша ключ партиции может включать несколько столбцов или выражений (до 32, но это ограничение может быть изменено при создании QHB), но для партиционирования списка ключ партиции должен состоять из одного столбца или выражения.

Для разбиения диапазона и списка требуется класс оператора btree,а для разбиения хэша - класс оператора hash. Если класс оператора не указан явно, будет использоваться класс оператора по умолчанию соответствующего типа; если класс оператора по умолчанию не существует, будет вызвана ошибка. При использовании хэш-партиционирования используемый класс операторов должен реализовывать функцию поддержки 2 (см. раздел Процедуры поддержки метода индекса для получения подробной информации).

Партиционированная таблица делится на подтаблицы (называемые партициями), которые создаются с помощью отдельных элементов CREATE TABLE команды. Партиционированная таблица сама по себе пуста. Строка данных, вставленная в таблицу, направляется в партицию на основе значения столбцов или выражений в ключе партиции. Если ни одна существующая партиция не соответствует значениям в новой строке, будет сообщена об ошибке.

Партиционированные таблицы не поддерживают ограничения EXCLUDE; однако эти ограничения можно определить для отдельных партиций.

Дополнительную информацию о партиционировании таблиц см. в разделе Партиционирование таблиц.

PARTITION OF parent_table { FOR VALUES partition_bound_spec | DEFAULT }

Создает таблицу как партицию указанной родительской таблицы. Таблица может быть создана либо как раздел для конкретных значений с помощью FOR VALUES или в качестве раздела по умолчанию с помощью DEFAULT.

partition_bound_spec должен соответствовать методу партиционирования и ключу партиционирования родительской таблицы и не должен перекрываться с какой-либо существующей партицией этого родительского элемента. Форма с IN используется для разбиения списка, форма с FROM и TO используется для разбиения диапазона, а также форма с WITH используется для хэш-партиционирования.

partition_bound_expr является ли любое выражение без переменных (подзапросы, оконные функции, агрегатные функции и функции возврата набора не допускаются). Его тип данных должен соответствовать типу данных соответствующего столбца ключа партиции. Выражение вычисляется один раз во время создания таблицы, поэтому оно может даже содержать летучие выражения, такие как CURRENT_TIMESTAMP.

При создании раздела списка, NULL может быть указано, чтобы обозначить, что раздел позволяет ключевому столбцу раздела быть нулевым. Однако не может быть более одного такого раздела списка для данной родительской таблицы. NULL невозможно указать для разделов диапазона.

При создании раздела диапазона нижняя граница задается с помощью FROM является включающей границей, в то время как верхняя граница, указанная с TO это эксклюзивная граница. То есть, значения, указанные в FROM список-это допустимые значения соответствующих столбцов ключа раздела для данного раздела, В то время как те, что находятся в TO списке их нет. Обратите внимание, что это утверждение должно пониматься в соответствии с правилами сравнения строк (Сравнение конструкторов строк). Например, дано: PARTITION BY RANGE (x,y), раздел привязан FROM (1, 2) TO (3, 4) позволяет x=1 с любым y>=2, x=2 с любым ненулевым значением y, и x=3 с любым y.

Особое значение MINVALUE и MAXVALUE может использоваться при создании раздела диапазона, чтобы указать, что нет нижней или верхней границы значения столбца. Например, раздел, определенный с помощью FROM (MINVALUE) TO (10) позволяет использовать любые значения меньше 10, а также раздел, определенный с помощью FROM (10) TO (MAXVALUE) разрешает любые значения, превышающие или равные 10.

При создании раздела диапазона, включающего более одного столбца, он также может иметь смысл использовать MAXVALUE как часть нижней границы, и MINVALUE как часть верхней границы. Например, раздел, определенный с помощью FROM (0, MAXVALUE) BEFORE (10, MAXVALUE) разрешает любые строки, в которых первый столбец ключа партиции больше 0 и меньше или равен 10. Аналогично, раздел, определенный с помощью FROM (’a’, MINVALUE) TO (’b’, MINVALUE) разрешает любые строки, в которых первый столбец ключа партиции начинается с "a".

Обратите внимание, что если MINVALUE или MAXVALUE используется для одного столбца привязки партиционирования, одно и то же значение должно использоваться для всех последующих столбцов. Например, (10, MINVALUE, 0) не является допустимой привязкой; вы должны написать (10, MINVALUE, MINVALUE).

Также обратите внимание, что некоторые типы элементов, такие как отметка времени (timestamp), есть понятие "бесконечность" (infinity), которое является просто еще одним значением, которое может быть сохранено. Это отличается от MINVALUE и MAXVALUE, которые не являются реальными значениями, которые могут быть сохранены, но скорее они являются способами сказать, что значение безгранично. MAXVALUE можно считать, что это больше, чем любое другое значение, включая "бесконечность" и MINVALUE как бы меньше любой другой величины, в том числе и "минус бесконечность". Таким образом, диапазон FROM ('infinity') TO (MAXVALUE) это не пустой диапазон; он позволяет хранить ровно одно значение - "infinity".

Если DEFAULT указывается, что таблица будет создана как партиция по умолчанию родительской таблицы. Этот параметр недоступен для хэш-партиционированных таблиц. Значение ключа партиции, не вписывающееся в любую другую партицию данного родительского объекта, будет перенаправлено в партицию по умолчанию.

Когда таблица имеет существующий DEFAULT раздел и новый раздел добавляется к нему, раздел по умолчанию должен быть проверен, чтобы убедиться, что он не содержит строк, которые правильно принадлежат в новом разделе. Если раздел по умолчанию содержит большое количество строк, это может быть медленным. Проверка будет пропущена, если раздел по умолчанию является сторонней таблицей или если он имеет ограничение, которое доказывает, что он не может содержать строки, которые должны быть размещены в новом разделе.

При создании хэш-раздела необходимо указать модуль и остаток. Модуль должен быть положительным целым числом, а остаток должен быть неотрицательным целым числом меньше модуля. Как правило, при первоначальной настройке хэш-партиционированной таблицы следует выбрать модуль, равный числу партиций, и назначить каждой таблице тот же модуль и другой остаток (см. примеры ниже). Однако не требуется, чтобы каждая партиция имела одинаковый модуль, только чтобы каждый модуль, который встречается среди партиций хэш-партиционированной таблицы, был фактором следующего большего модуля. Это позволяет постепенно увеличивать число партиций без необходимости перемещать все данные одновременно. Например, предположим, что у вас есть хэш-партиционированная таблица с 8 партициями, каждая из которых имеет модуль 8, но необходимо увеличить число партиций до 16. Вы можете отсоединить один из разделов модуля-8, создать два новых раздела модуля-16, охватывающих ту же часть пространства ключей (один с остатком, равным остатку отсоединенного раздела, а другой с остатком, равным этому значению плюс 8), и повторно заполнить их данными. Затем вы можете повторить это - возможно, в более позднее время

  • для каждого раздела модуля-8, пока ни один не останется. Хотя это все еще может включать в себя большой объем перемещения данных на каждом шаге, это все же лучше, чем создавать целую новую таблицу и перемещать все данные сразу.

Раздел должен иметь те же имена столбцов и типы, что и партиционированная таблица, к которой он принадлежит. Изменения имен столбцов или типов партиционированной таблицы будут автоматически распространяться на все партиции. CHECK ограничения будут наследоваться автоматически каждой партицией, но отдельная партиция может указывать дополнительные ограничения CHECK ограничения; дополнительные ограничения с тем же именем и условием, что и в родительском элементе, будут объединены с родительским ограничением. Значения по умолчанию могут быть указаны отдельно для каждого раздела.

Строки, вставленные в партиционированную таблицу, будут автоматически перенаправлены в нужную партицию. Если подходящего раздела не существует, произойдет ошибка.

Такие операции, как TRUNCATE, которые обычно влияют на таблицу и все ее дочерние элементы, будут распространяться на все партиции, но также могут выполняться на отдельной партиции. Обратите внимание, что удаление раздела с помощью DROP TABLE требует запрашивать ACCESS EXCLUSIVE блокировку на родительской таблице.

LIKE source_table [ like_option ... ]

Предложение LIKE указывает таблицу, из которой новая таблица автоматически копирует все имена столбцов, их типы данных и их ограничения not-null.

В отличие от INHERITS, новая таблица и исходная таблица полностью разъединяются после завершения создания. Изменения исходной таблицы не будут применены к новой таблице, и нет возможности включить данные новой таблицы в сканы исходной таблицы.

Также в отличие от INHERITS, столбцы и ограничения, скопированные по LIKE не объединяются с аналогично именованными столбцами и ограничениями. Если одно и то же имя указано явно или в другом LIKE предложение, ошибка сигнализируется.

Необязательный параметр like_option предложения указывают, какие дополнительные свойства исходной таблицы следует скопировать. Определяющий INCLUDING копирует свойство, указав EXCLUDING опускает свойство. EXCLUDING это значение по умолчанию. Если для одного и того же типа объекта создается несколько спецификаций, то используется последняя из них. Доступные опции::

INCLUDING COMMENTS

Комментарии для скопированных столбцов, ограничений и индексов будут скопированы. Поведение по умолчанию заключается в исключении комментариев, в результате чего скопированные столбцы и ограничения в новой таблице не имеют комментариев.

INCLUDING CONSTRAINTS

CHECK ограничения будут скопированы. Между ограничениями столбцов и ограничениями таблиц не проводится никакого различия. Ограничения Not-null всегда копируются в новую таблицу.

INCLUDING DEFAULTS

Выражения по умолчанию для скопированных определений столбцов будут скопированы. В противном случае выражения по умолчанию не копируются, в результате чего скопированные столбцы в новой таблице имеют значения по умолчанию null. Обратите внимание, что копирование значений по умолчанию, которые вызывают функции изменения базы данных, такие как nextval, может создать функциональную связь между исходной и новой таблицами.

INCLUDING GENERATED

Все выражения генерации скопированных определений столбцов будут скопированы. По умолчанию новые столбцы будут обычными базовыми столбцами.

INCLUDING IDENTITY

Все спецификации идентификаторов скопированных определений столбцов будут скопированы. Новая последовательность создается для каждого столбца идентификаторов новой таблицы отдельно от последовательностей, связанных со старой таблицей.

INCLUDING INDEXES

Индексы, PRIMARY KEY, UNIQUE, и EXCLUDE ограничения для исходной таблицы будут созданы для новой таблицы. Имена для новых индексов и ограничений выбираются в соответствии с правилами по умолчанию, независимо от того, как были названы оригиналы. (Это поведение позволяет избежать возможных ошибок повторяющихся имен для новых индексов).

INCLUDING STATISTICS

Расширенная статистика копируется в новую таблицу.

INCLUDING STORAGE

STORAGE настройки для скопированных определений столбцов будут скопированы. Поведение по умолчанию-исключить STORAGE параметры, в результате чего скопированные столбцы в новой таблице имеют параметры по умолчанию для конкретного типа. Для получения дополнительной информации STORAGE настройки, см. раздел TOAST.

INCLUDING ALL

INCLUDING ALL это сокращенная форма выбора всех доступных индивидуальных опций. (Это может быть полезно, чтобы написать отдельные пункты EXCLUDING после INCLUDING ALL чтобы выбрать все, кроме некоторых конкретных параметров).

LIKE предложение также можно использовать для копирования определений столбцов из представлений, сторонних таблиц или составных типов. Неприменимые опции (например, INCLUDING INDEXES из представления) игнорируются.

CONSTRAINT constraint_name

Необязательное имя для ограничения столбца или таблицы. Если ограничение нарушается, имя ограничения присутствует в сообщениях об ошибках, поэтому имена ограничений, такие как col должен быть положительным может использоваться для передачи полезной информации о ограничениях клиентским приложениям. (Двойные кавычки необходимы для указания имен ограничений, содержащих пробелы). Если имя ограничения не указано, система создает имя.

NOT NULL

Столбец не может содержать значения null.

NULL

Столбец может содержать значения null. Это значение по умолчанию.

Этот пункт предусмотрен только для обеспечения совместимости с нестандартными базами данных SQL. Его использование не рекомендуется в новых приложениях.

CHECK ( expression ) [ NO INHERIT ]

CHECK предложение задает выражение, создающее логический результат, которому должны удовлетворять новые или обновленные строки для успешного выполнения операции вставки или обновления. Выражения, оценивающие значение TRUE или UNKNOWN, успешно выполняются. Если какая-либо строка операции вставки или обновления приводит к ложному результату, возникает исключение ошибки, и вставка или обновление не изменяет базу данных. Проверочное ограничение, указанное в качестве ограничения столбца, должно ссылаться только на значение этого столбца, в то время как выражение, появляющееся в ограничении таблицы, может ссылаться на несколько столбцов.

В настоящий момент, CHECK выражения не могут содержать вложенные запросы и ссылаться на переменные, отличные от Столбцов текущей строки (см. раздел Контрольные ограничения). Столбец система столоид может быть ссылка, но не любой другой системный столбец.

Ограничение, отмеченное знаком NO INHERIT не будет распространяться на дочерние таблицы.

Когда таблица имеет несколько CHECK ограничения, они будут проверены для каждой строки в алфавитном порядке по имени, после проверки NOT NULL ограничения.

DEFAULT default_expr

DEFAULT предложение присваивает значение данных по умолчанию для столбца, в определении которого оно отображается. Значением является любое выражение без переменной (в частности, перекрестные ссылки на другие столбцы в текущей таблице не допускаются). Подзапросы также не допускаются. Тип данных выражения по умолчанию должен соответствовать типу данных столбца.

Выражение по умолчанию будет использоваться в любой операции вставки, которая не задает значение для столбца. Если для столбца нет значения по умолчанию, то значение по умолчанию равно null.

GENERATED ALWAYS AS ( generation_expr ) STORED

Это предложение создает столбец как generated column . Столбец не может быть записан, и при чтении будет возвращен результат указанного выражения.

Ключевое слово STORED требуется для обозначения того, что столбец будет вычислен при записи и сохранен на диске.

Выражение generation может ссылаться на другие столбцы в таблице, но не на другие созданные столбцы. Любые используемые функции и операторы должны быть неизменяемыми. Ссылки на другие таблицы не допускаются.

GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ]

Это предложение создает столбец как identity column. Он будет иметь неявную последовательность, прикрепленную к нему, и столбец в новых строках автоматически будет иметь значения из последовательности, назначенной ему.

Пункты ALWAYS и BY DEFAULT определяют, каким образом значение последовательности имеет приоритет над указанным пользователем значением в инструкции INSERT. Если задано значение ALWAYS, указанное пользователем значение принимается только в том случае, если в инструкции INSERT указано VERRIDING SYSTEM VALUE. Если указано BY DEFAULT, то указанное пользователем значение имеет приоритет. Смотрите раздел INSERT для получения дополнительной информации. (В команде COPY всегда используются заданные пользователем значения, независимо от этого параметра).

Необязательный параметр sequence_options предложение может использоваться для переопределения параметров последовательности. Дополнительные сведения см. в разделе CREATE SEQUENCE.

UNIQUE (column constraint)
UNIQUE ( column_name [, ... ] ) [ INCLUDE ( column_name [, ...]) ] (table constraint)

Ограничение UNIQUE указывает, что группа из одного или нескольких столбцов таблицы может содержать только уникальные значения. Поведение ограничения unique table такое же, как и для ограничений столбцов, с дополнительной возможностью охватывать несколько столбцов.

Для целей уникального ограничения нулевые значения не считаются равными.

Каждое ограничение уникальной таблицы должно содержать имя набора столбцов, отличного от набора столбцов, названных любым другим ограничением уникального или первичного ключа, определенным для таблицы. (В противном случае это будет просто одно и то же ограничение, указанное дважды).

При установлении уникального ограничения для многоуровневой иерархии партиций в определение ограничения должны быть включены все столбцы в ключе партиционирования целевой партиционированной таблицы, а также столбцы всех ее дочерних партиционированных таблиц.

Добавление уникального ограничения автоматически создаст уникальный индекс btree для столбца или группы столбцов, используемых в ограничении. Необязательное предложение INCLUDE добавляет к этому индексу один или несколько столбцов,для которых не применяется уникальность. Обратите внимание, что хотя ограничение не применяется к включенным столбцам, оно все равно зависит от них. Следовательно, некоторые операции над этими столбцами (например КАПЕЛЬНАЯ КОЛОННА) может вызвать каскадное ограничение и удаление индекса.

PRIMARY KEY (column constraint)
PRIMARY KEY ( column_name [, ... ] ) [ INCLUDE ( column_name [, ...]) ] (table constraint)

Ограничение PRIMARY KEY указывает, что столбец или столбцы таблицы могут содержать только уникальные (не повторяющиеся), не имеющие значения null. Для таблицы можно указать только один первичный ключ, будь то ограничение столбца или ограничение таблицы.

Ограничение первичного ключа должно содержать имя набора столбцов, отличного от набора столбцов, названных любым уникальным ограничением, определенным для одной и той же таблицы. (В противном случае ограничение unique является избыточным и будет отброшено).

PRIMARY KEY принудительно применяет те же ограничения данных, что и комбинация UNIQUE и NOT NULL, но определение набора столбцов в качестве первичного ключа также предоставляет метаданные о конструкции схемы, поскольку первичный ключ подразумевает, что другие таблицы могут полагаться на этот набор столбцов в качестве уникального идентификатора для строк.

Ограничения PRIMARY KEY разделяют ограничения, которые имеют ограничения UNIQUE при размещении в партиционированных таблицах.

Добавление ограничения PRIMARY KEY автоматически создаст уникальный индекс btree для столбца или группы столбцов, используемых в ограничении. Необязательный параметр INCLUDE предложение позволяет указать список столбцов, которые будут включены в неключевую часть индекса. Хотя уникальность не применяется к включенным столбцам, ограничение все равно зависит от них. Следовательно, некоторые операции над включенными столбцами (например DROP COLUMN) может вызвать каскадное ограничение и удаление индекса.

EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ]

Предложение EXCLUDE определяет ограничение исключения, которое гарантирует, что если любые две строки сравниваются на указанном столбце(столбцах) или выражении(выражениях) с использованием указанного оператора(операторов), не все эти сравнения вернутся TRUE. Если все указанные операторы проверяются на равенство, это эквивалентно a ограничение UNIQUE, хотя обычное уникальное ограничение будет быстрее. Однако ограничения исключения могут указывать на ограничения, которые являются более общими, чем простое равенство. Например, вы можете указать ограничение, что никакие две строки в таблице не содержат перекрывающихся кругов (см. Геометрические типы), используя && оператор.

Ограничения исключения реализуются с помощью индекса, поэтому каждый указанный оператор должен быть связан с соответствующим классом оператора (см. раздел Классы операторов и семейства операторов) для метода доступа к индексу индексный метод. Операторы должны быть коммутативными. Каждый exclude_element можно дополнительно указать класс оператора и / или параметры заказа; они полностью описаны в разделе CREATE INDEX.

Метод доступа должен поддерживать amgettuple (см. главу Определение интерфейса метода доступа индекса); в настоящее время это означает, что Джин не может быть использован. Хотя это разрешено, нет особого смысла в использовании B-дерева или хэш-индексов с ограничением исключения, потому что это не делает ничего, что обычное уникальное ограничение не делает лучше. Поэтому на практике метод доступа всегда будет GiST или SP-GiST.

predicate позволяет задать ограничение исключения для подмножества таблицы; внутри этого создается частичный индекс. Обратите внимание, что вокруг предиката требуются круглые скобки.

REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] (column constraint)
FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH matchtype ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] (table constraint)

Эти предложения задают ограничение внешнего ключа, которое требует, чтобы группа из одного или нескольких столбцов новой таблицы содержала только значения, соответствующие значениям в ссылочных столбцах некоторых строк ссылочной таблицы. Если refcolumn список опущен, первичный ключ объекта reftable предназначенный. Ссылочные столбцы должны быть столбцами недопустимого ограничения unique или primary key в ссылочной таблице. Пользователь должен иметь: REFERENCES разрешение на указанную таблицу (либо на всю таблицу, либо на конкретные столбцы ссылки). Добавление ограничения внешнего ключа требует SHARE ROW EXCLUSIVE блокировки указанной таблицы. Обратите внимание, что ограничения внешнего ключа не могут быть определены между временными и постоянными таблицами.

Значение, вставленное в ссылочный столбец(ы), сопоставляется со значениями ссылочной таблицы и ссылочных столбцов с использованием данного типа соответствия.Существует три типа соответствия: MATCH FULL, MATCH PARTIAL и MATCH SIMPLE (что является значением по умолчанию). MATCH FULL не допускает, чтобы один столбец многоколоночного внешнего ключа имел значение null, если только все столбцы внешнего ключа не имеют значения null; если все они имеют значение null, то строка не обязательно должна совпадать в указанной таблице. MATCH SIMPLE позволяет любому из столбцов внешнего ключа иметь значение null; если какой-либо из них имеет значение null, строка не обязательно должна совпадать в ссылочной таблице. MATCH PARTIAL это пока не реализовано. (Конечно, NOT NULL ограничения могут быть применены к ссылочному столбцу(столбцам), чтобы предотвратить возникновение таких случаев).

Кроме того, при изменении данных в ссылочных столбцах выполняются определенные действия с данными в Столбцах этой таблицы. ON DELETE предложение указывает действие, которое необходимо выполнить при удалении связанной строки в связанной таблице. Точно так же, как ОБ ОБНОВЛЕНИЯХ предложение указывает действие, которое необходимо выполнить, когда столбец ссылки в ссылочной таблице обновляется до нового значения. Если строка обновляется, но указанный столбец фактически не изменяется, никакие действия не выполняются. Ссылочные действия, отличные от НИКАКОЕ ДЕЙСТВИЕ проверка не может быть отложена, даже если ограничение объявлено отложенным. Для каждого предложения возможны следующие действия:

NO ACTION

Выдача ошибки, указывающей на то, что удаление или обновление приведет к нарушению ограничения внешнего ключа. Если ограничение отложено, эта ошибка будет произведена во время проверки ограничения, если все еще существуют какие-либо ссылочные строки. Это действие по умолчанию.

RESTRICT

Выдать ошибки, с указанием на то, что удаление или обновление приведет к нарушению ограничения внешнего ключа. Это то же самое, что и NO ACTION за исключением того, что проверка не откладывается.

CASCADE

Удалите все строки, ссылающиеся на удаленную строку, или обновите значения столбцов ссылок до новых значений столбцов ссылок, соответственно.

SET NULL

Установите для ссылочных столбцов значение null.

SET DEFAULT

Установите для столбцов ссылок значения по умолчанию. (В ссылочной таблице должна быть строка, соответствующая значениям по умолчанию, если они не равны нулю, иначе операция завершится ошибкой).

Если столбец(ы) ссылки часто изменяются, было бы целесообразно добавить индекс к ссылочному столбцу(ам), чтобы ссылочные действия, связанные с ограничением внешнего ключа, могли выполняться более эффективно.

DEFERRABLE NOT DEFERRABLE

Это определяет, может ли ограничение быть отложено. Ограничение, которое не может быть отменено, будет проверяться сразу же после каждой команды. Проверка отложенных ограничений может быть отложена до окончания транзакции (с помощью команды SET CONSTRAINTS). NOT DEFERRABLE это значение по умолчанию. В настоящее время только UNIQUE, PRIMARY KEY, EXCLUDE, и REFERENCES (внешний ключ) ограничения принимают это предложение. NOT NULL и CHECK ограничения не подлежат отмене. Обратите внимание, что отложенные ограничения не могут использоваться в качестве арбитров конфликтов в инструкции INSERT, которая включает в себя условие ON CONFLICT DO UPDATE.

INITIALLY IMMEDIATE INITIALLY DEFERRED

Если ограничение является отложенным, это предложение определяет время по умолчанию для проверки ограничения. Если ограничение является ПЕРВОНАЧАЛЬНО НЕМЕДЛЕННО, он проверяется после каждого утверждения. Это значение по умолчанию. Если ограничение является ПЕРВОНАЧАЛЬНО ОТЛОЖЕНО, он проверяется только в конце транзакции. Время проверки ограничений можно изменить с помощью команды SET CONSTRAINTS.

USING method

Это необязательное предложение определяет метод доступа к таблице, который будет использоваться для хранения содержимого для новой таблицы; метод должен быть методом доступа типа TABLE. Дополнительную информацию смотрите в главе Определение интерфейса метода доступа к таблице. Если этот параметр не указан, то для новой таблицы выбирается метод доступа к таблице по умолчанию. Дополнительную информацию смотрите в разделе default_table_access_method.

WITH ( storage_parameter [= value] [, ... ] )

В этом предложении указываются необязательные параметры хранения для таблицы или индекса; дополнительные сведения см. в разделе Параметры хранения. Для обратной совместимости предложение WITH для таблицы также может включать в себя OIDS=FALSE, чтобы указать, что строки новой таблицы не должны содержать OID (идентификаторы объектов), OIDS=TRUE не поддерживается.

WITHOUT OIDS

Это синтаксис обратной совместимости для объявления таблицы WITHOUT OIDS, создание таблицы WITH OIDS не поддерживается.

ON COMMIT

Поведение временных таблиц в конце блока транзакций можно контролировать с помощью ON COMMIT. Есть три варианта:

PRESERVE ROWS

Никаких специальных действий по завершению транзакций не предпринимается. Это поведение по умолчанию.

DELETE ROWS

Все строки во временной таблице будут удалены в конце каждого блока транзакций. По существу, автоматическое TRUNCATE выполняется на каждом коммите. При использовании в партиционированной таблице это не распространяется на ее разделы.

DROP

Временная таблица будет удалена в конце текущего блока транзакций. При использовании в партиционированной таблице это действие удаляет ее партиции, а при использовании в таблицах с дочерними элементами наследования-зависимые дочерние элементы.

TABLESPACE tablespace_name

tablespace_name это имя табличного пространства, в котором будет создана новая таблица. Если этот параметр не указан, выполняется запрос default_tablespace или temp_tablespaces если таблица является временной. Для партиционированных таблиц, поскольку для самой таблицы хранение не требуется, указанное табличное пространство переопределяет default_tablespace как табличное пространство по умолчанию, используемое для любых вновь созданных партиций, когда никакое другое табличное пространство явно не указано.

USING INDEX TABLESPACE tablespace_name

Это предложение позволяет выбрать табличное пространство, в котором будет создан индекс, связанный с UNIQUE, PRIMARY KEY, или EXCLUDE ограничением. Если этот параметр не указан, выполняется запрос default_tablespace или temp_tablespaces если таблица является временной.

Параметры хранения

Предложение WITH может указывать параметры хранения для таблиц и для индексов, связанных с UNIQUE, PRIMARY KEY, или EXCLUDE ограничениями. Параметры хранения для индексов описаны в разделе CREATE INDEX. Ниже перечислены параметры хранения, доступные в настоящее время для таблиц. Для многих из этих параметров, как показано, существует дополнительный параметр с тем же именем, префиксом которого является toast., который управляет поведением вторичной таблицы TOAST таблицы, если таковые имеются (см. раздел TOAST для получения дополнительной информации о тостах). Если установлено значение параметра таблицы и эквивалент toast. параметр не является, таблица TOAST будет использовать значение параметра таблицы. Указание этих параметров для партиционированных таблиц не поддерживается, но их можно задать для отдельных конечных партиций.

fillfactor (integer)

Коэффициент заполнения для таблицы-это процентное соотношение между 10 и 100. Значение по умолчанию-100 (полная упаковка). Если указан меньший коэффициент заполнения, то операции вставки упаковывают страницы таблицы только до указанного процента; оставшееся пространство на каждой странице зарезервировано для обновления строк на этой странице. Это дает UPDATE возможность разместить обновленную копию строки на той же странице, что и оригинал, что является более эффективным, чем размещение его на другой странице. Для таблицы, записи которой никогда не обновляются, полная упаковка является лучшим выбором,но в сильно обновленных таблицах более мелкие заполнители подходят. Этот параметр нельзя задать для таблиц TOAST.

toast_tuple_target (integer)

Toast_tuple_target задает минимальную длину кортежа, необходимую перед тем, как мы попытаемся переместить значения длинных столбцов в таблицы TOAST, а также целевую длину, которую мы пытаемся уменьшить ниже, как только начинается тостирование. Это касается только столбцов, помеченных как внешние или расширенные, и применяется только к новым кортежам - нет никакого влияния на существующие строки. По умолчанию этот параметр позволяет разрешить не менее 4 кортежей на блок, который с размером блока по умолчанию будет 2040 байт. Допустимые значения находятся между 128 байтами и (blocksize - header), по умолчанию 8160 байт. Изменение этого значения может быть не очень полезно для очень коротких или очень длинных строк. Обратите внимание, что настройка по умолчанию часто близка к оптимальной, и вполне возможно, что установка этого параметра может иметь негативные последствия в некоторых случаях. Этот параметр нельзя задать для таблиц TOAST.

parallel_workers (integer)

Это задает число процессов, которые должны использоваться для помощи в параллельном сканировании этой таблицы. Если не задано, система определит значение, основанное на размере отношения. Фактическое число процессов, выбранных планировщиком или служебными инструкциями, использующими параллельное сканирование, может быть меньше, например, из-за настройки max_worker_processes.

autovacuum_enabled, toast.autovacuum_enabled (boolean)

Включает или отключает процесс autovacuum для определенной таблицы. Если задано значение true, то процесс autovacuum будет выполнять автоматический VACUUM и / или ANALYZE операции с этой таблицей, следуя правилам, описанным в разделе Процесс «Автовакуум». Если значение равно false, эта таблица не будет автоматически обработана, за исключением случаев, когда необходимо предотвратить обертывание идентификатора транзакции. Смотрите раздел Предотвращение ошибок wraparound идентификатора транзакции для получения дополнительной информации о предотвращении зацикливания. Обратите внимание, что процесс autovacuum не запускается вообще (кроме как для предотвращения обхода идентификатора транзакции), если autovacuum параметр имеет значение false; установка параметров хранения отдельных таблиц не переопределяет его. Поэтому редко бывает много смысла в явном задании этому параметру хранения значения true, только в false.

vacuum_index_cleanup, toast.vacuum_index_cleanup (boolean)

Включает или отключает очистку индекса при выполнении вакуума в этой таблице. Значение по умолчанию: true. Отключение очистки индекса может значительно ускорить true, но также может привести к сильно раздутым индексам, если изменения таблицы происходят часто. INDEX_CLEANUP параметр VACUUM, если он указан, переопределяет значение этого параметра.

vacuum_truncate, toast.vacuum_truncate (boolean)

Позволяет или отключает вакуум, чтобы попытаться сократить любые пустые страницы в конце этой таблицы. Значение по умолчанию: true. Если true, VACUUM и автовакуум делают усечение, и дисковое пространство для усеченных страниц возвращается в операционную систему. Обратите внимание, что усечения требуется блокировка ACCESS EXCLUSIVE для таблицы. TRUNCATE параметр VACUUM, если он указан, переопределяет значение этого параметра.

autovacuum_vacuum_threshold, toast.autovacuum_vacuum_threshold (integer)

Per-табличное значение параметра autovacuum_vacuum_threshold.

autovacuum_vacuum_scale_factor, toast.autovacuum_vacuum_scale_factor (float4)

Per-табличное значение для параметра autovacuum_vacuum_scale_factor.

autovacuum_analyze_threshold (integer)

Значение таблицы для параметра autovacuum_analyze_threshold.

autovacuum_analyze_scale_factor (float4)

Значение таблицы для параметра autovacuum_analyze_scale_factor.

autovacuum_vacuum_cost_delay, toast.autovacuum_vacuum_cost_delay (floating point)

Значение таблицы для параметра autovacuum_vacuum_cost_delay.

autovacuum_vacuum_cost_limit, toast.autovacuum_vacuum_cost_limit (integer)

Значение таблицы для параметра autovacuum_vacuum_cost_limit.

autovacuum_freeze_min_age, toast.autovacuum_freeze_min_age (integer)

Значение таблицы для параметра vacuum_freeze_min_age. Обратите внимание, что autovacuum будет игнорировать параметры autovacuum_freeze_min_age для каждой таблицы, у которой больше половины общесистемного параметра autovacuum_freeze_max_age.

autovacuum_freeze_max_age, toast.autovacuum_freeze_max_age (integer)

Значение таблицы для параметра autovacuum_freeze_max_age. Обратите внимание, что autovacuum будет игнорировать параметры autovacuum_freeze_max_age для каждой таблицы, которые больше, чем общесистемная настройка (она может быть установлена только меньше).

autovacuum_freeze_table_age, toast.autovacuum_freeze_table_age (integer)

Значение таблицы для параметра vacuum_freeze_table_age.

autovacuum_multixact_freeze_min_age, toast.autovacuum_multixact_freeze_min_age (integer)

Значение таблицы для параметра vacuum_multixact_freeze_min_age. Обратите внимание, что autovacuum будет игнорировать параметры autovacuum_multixact_freeze_min_age для каждой таблицы, которые больше половины общесистемного параметра autovacuum_multixact_freeze_max_age.

autovacuum_multixact_freeze_max_age, toast.autovacuum_multixact_freeze_max_age (integer)

Значение таблицы для параметра autovacuum_multixact_freeze_max_age. Обратите внимание, что autovacuum будет игнорировать параметры autovacuum_multixact_freeze_max_age для каждой таблицы, которые больше, чем общесистемная настройка (она может быть установлена только меньше).

autovacuum_multixact_freeze_table_age, toast.autovacuum_multixact_freeze_table_age (integer)

Значение таблицы для параметра vacuum_multixact_freeze_table_age.

log_autovacuum_min_duration, toast.log_autovacuum_min_duration (integer)

Значение таблицы для параметра log_autovacuum_min_duration.

user_catalog_table (boolean)

Объявите таблицу в качестве дополнительной таблицы каталога для целей логической репликации.

Примечания

QHB автоматически создает индекс для каждого ограничения уникальности и ограничения первичного ключа для обеспечения уникальности. Таким образом, нет необходимости явно создавать индекс для столбцов первичного ключа. (Дополнительную информацию смотрите в разделе CREATE INDEX).

Уникальные ограничения и первичные ключи не наследуются в текущей реализации. Это делает сочетание наследования и уникальных ограничений довольно дисфункциональным.

Таблица не может иметь более 1600 столбцов. (На практике эффективный предел обычно ниже из-за ограничений длины кортежа).

Примеры

Создание таблиц films и distributors:

CREATE TABLE films (
    code        char(5) CONSTRAINT firstkey PRIMARY KEY,
    title       varchar(40) NOT NULL,
    did         integer NOT NULL,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute
);

CREATE TABLE distributors (
     did    integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
     name   varchar(40) NOT NULL CHECK (name<> '')
);

Создайте таблицу с двумерным массивом:

CREATE TABLE array_int (
    vector  int[][]
);

Определите уникальное ограничение таблицы для таблицы films. Ограничения уникальной таблицы могут быть определены для одного или нескольких столбцов таблицы:

CREATE TABLE films (
    code        char(5),
    title       varchar(40),
    did         integer,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute,
    CONSTRAINT production UNIQUE(date_prod)
);

Определите ограничение для контрольного столбца:

CREATE TABLE distributors (
    did     integer CHECK (did > 100),
    name    varchar(40)
);

Определите ограничение проверочной таблицы:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    CONSTRAINT con1 CHECK (did > 100 AND name<> '')
);

Определите ограничение таблицы первичного ключа для таблицы films:

CREATE TABLE films (
    code        char(5),
    title       varchar(40),
    did         integer,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute,
    CONSTRAINT code_title PRIMARY KEY(code,title)
);

Определение ограничения первичного ключа для таблицы distributors. Следующие два примера эквивалентны, первый использует синтаксис ограничения таблицы, Второй-синтаксис ограничения столбца:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    PRIMARY KEY(did)
);

CREATE TABLE distributors (
    did     integer PRIMARY KEY,
    name    varchar(40)
);

Присвойте столбцу name литеральное значение константы по умолчанию, упорядочить значение по умолчанию столбца did путем выбора следующего сгенерированного значения объекта последовательности, и установите значение по умолчанию для modtime как время вставки строки:

CREATE TABLE distributors (
    name      varchar(40) DEFAULT 'Luso Films',
    did       integer DEFAULT nextval('distributors_serial'),
    modtime   timestamp DEFAULT current_timestamp
);

Определить два NOT NULL ограничения столбцов в таблице distributors, одному из которых явно дано имя:

CREATE TABLE distributors (
    did     integer CONSTRAINT no_null NOT NULL,
    name    varchar(40) NOT NULL
);

Определите уникальное ограничение для колонки name:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40) UNIQUE
);

То же самое, указанное в качестве ограничения таблицы:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    UNIQUE(name)
);

Создайте ту же таблицу, указав коэффициент заполнения 70% как для самой таблицы, так и для ее уникального индекса:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40),
    UNIQUE(name) WITH (fillfactor=70)
)
WITH (fillfactor=70);

Создание таблицы circles с ограничением исключения, которое предотвращает перекрытие любых двух кругов:

CREATE TABLE circles (
    c circle,
    EXCLUDE USING gist (c WITH &&)
);

Создание таблицы cinemas в табличном пространстве diskvol1:

CREATE TABLE cinemas (
        id serial,
        name text,
        location text
) TABLESPACE diskvol1;

Создание составного типа и типизированной таблицы:

CREATE TYPE employee_type AS (name text, salary numeric);

CREATE TABLE employees OF employee_type (
    PRIMARY KEY (name),
    salary WITH OPTIONS DEFAULT 1000
);

Создание партиционированной таблицы диапазона:

CREATE TABLE measurement (
    logdate         date not null,
    peaktemp        int,
    unitsales       int
) PARTITION BY RANGE (logdate);

Создайте партиционированную таблицу диапазона с несколькими столбцами в ключе партиции:

CREATE TABLE measurement_year_month (
    logdate         date not null,
    peaktemp        int,
    unitsales       int
) PARTITION BY RANGE (EXTRACT(YEAR FROM logdate), EXTRACT(MONTH FROM logdate));

Создание партиционированной таблицы списка:

CREATE TABLE cities (
    city_id      bigserial not null,
    name         text not null,
    population   bigint
) PARTITION BY LIST (left(lower(name), 1));

Создание хэш-партиционированной таблицы:

CREATE TABLE orders (
    order_id     bigint not null,
    cust_id      bigint not null,
    status       text
) PARTITION BY HASH (order_id);

Создание партиции партиционированной таблицы диапазона:

CREATE TABLE measurement_y2016m07
    PARTITION OF measurement (
    unitsales DEFAULT 0
) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01');

Создайте несколько партиций партиционированной таблицы диапазона с несколькими столбцами в ключе партиции:

CREATE TABLE measurement_ym_older
    PARTITION OF measurement_year_month
    FOR VALUES FROM (MINVALUE, MINVALUE) TO (2016, 11);

CREATE TABLE measurement_ym_y2016m11
    PARTITION OF measurement_year_month
    FOR VALUES FROM (2016, 11) TO (2016, 12);

CREATE TABLE measurement_ym_y2016m12
    PARTITION OF measurement_year_month
    FOR VALUES FROM (2016, 12) TO (2017, 01);

CREATE TABLE measurement_ym_y2017m01
    PARTITION OF measurement_year_month
    FOR VALUES FROM (2017, 01) TO (2017, 02);

Создание раздел партиционированной таблицы списка:

CREATE TABLE cities_ab
    PARTITION OF cities (
    CONSTRAINT city_id_nonzero CHECK (city_id != 0)
) FOR VALUES IN ('a', 'b');

Создайте партицию партиционированной таблицы списка, которая сама является дальнейшей партиционированной, а затем добавьте в нее раздел:

CREATE TABLE cities_ab
    PARTITION OF cities (
    CONSTRAINT city_id_nonzero CHECK (city_id != 0)
) FOR VALUES IN ('a', 'b') PARTITION BY RANGE (population);

CREATE TABLE cities_ab_10000_to_100000
    PARTITION OF cities_ab FOR VALUES FROM (10000) TO (100000);

Создание партиций хэш-партиционированной таблицы:

CREATE TABLE orders_p1 PARTITION OF orders
    FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE orders_p2 PARTITION OF orders
    FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE orders_p3 PARTITION OF orders
    FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE orders_p4 PARTITION OF orders
    FOR VALUES WITH (MODULUS 4, REMAINDER 3);

Создание раздела по умолчанию:

CREATE TABLE cities_partdef
    PARTITION OF cities DEFAULT;

Совместимость

Команда CREATE TABLE соответствует стандарту SQL, с исключениями, указанными ниже.

Временная таблица

Хотя синтаксис у него такой CREATE TEMPORARY TABLE похоже, что из стандарта SQL, эффект не является тем же самым. В стандарте временные таблицы определяются только один раз и автоматически существуют (начиная с пустого содержимого) в каждом сеансе, который нуждается в них. QHB вместо этого требует, чтобы каждый сеанс выдавал свой собственный CREATE TEMPORARY TABLE команда для каждой используемой временной таблицы. Это позволяет различным сеансам использовать одно и то же имя временной таблицы для различных целей, в то время как подход стандарта ограничивает все экземпляры данного имени временной таблицы одной и той же структурой таблицы.

Стандартное определение поведения временных таблиц широко игнорируется. Поведение QHB на этом этапе аналогично поведению нескольких других баз данных SQL.

Стандарт SQL также различает глобальные и локальные временные таблицы, где локальная временная таблица имеет отдельный набор содержимого для каждого модуля SQL в каждом сеансе, хотя его определение все еще является общим для всех сеансов. Поскольку QHB не поддерживает модули SQL, это различие не имеет отношения к QHB.

Для обеспечения совместимости QHB примет следующее GLOBAL и LOCAL ключевые слова в объявлении временной таблицы, но они в настоящее время не имеют никакого эффекта. Использование этих ключевых слов не рекомендуется, так как будущие версии QHB могут принять более стандартную интерпретацию их значения.

Ппредложение ON COMMIT для временных таблиц также напоминает стандарт SQL, но имеет некоторые отличия. Если ON COMMIT предложение опущено, SQL указывает, что поведение по умолчанию является ON COMMIT DELETE ROWS. Однако поведение по умолчанию в QHB является ON COMMIT PRESERVE ROWS. ON COMMIT DROP опция не существует в SQL.

Неотложные ограничения уникальности

Когда UNIQUE или PRIMARY KEY ограничение не является отложенным, QHB проверяет уникальность сразу же, когда строка вставляется или изменяется. Стандарт SQL говорит, что уникальность должна быть применена только в конце инструкции; это имеет значение, когда, например, одна команда обновляет несколько ключевых значений. Чтобы получить поведение, соответствующее стандарту, объявите ограничение как DEFERRABLE но не откладывается (т. е., INITIALLY IMMEDIATE). Имейте в виду, что это может быть значительно медленнее, чем немедленная проверка уникальности.

Ограничения Проверки Столбцов

В стандарте SQL говорится, что CHECK ограничения столбца могут ссылаться только на столбец, к которому они применяются; только CHECK ограничения таблицы могут ссылаться на несколько столбцов. QHB не применяет это ограничение; он обрабатывает ограничения проверки столбцов и таблиц одинаково.

Ограничение EXCLUDE

Ограничение EXCLUDE - это расширение QHB.

Ограничение NULL

Ограничение NULL (на самом деле не является ограничением) - это расширение QHB для стандарта SQL, которое включено для совместимости с некоторыми другими системами баз данных (и для симметрии с NOT NULL ограничение). Поскольку это значение по умолчанию для любого столбца, то это слово не несёт смысловой нагрузки.

Ограничение именования

Стандарт SQL говорит, что ограничения таблицы и домена должны иметь имена, которые являются уникальными в схеме, содержащей таблицу или домен. QHB является более мягким: он требует, чтобы имена ограничений были уникальными только для ограничений, прикрепленных к определенной таблице или домену. Однако эта дополнительная свобода не существует для ограничений на основе индексов (ограничения UNIQUE, PRIMARY KEY и EXCLUDE), поскольку связанный индекс имеет то же имя, что и ограничение, и имена индексов должны быть уникальными во всех отношениях в пределах одной схемы.

В настоящее время QHB не записывает имена для NOT NULL ограничения вообще отсутствуют, поэтому они не подлежат ограничению уникальности. Это может измениться в будущем выпуске.

Наследование

Множественное наследование через INHERITS предложение является расширением языка QHB. SQL:1999 и более поздние версии определяют одиночное наследование, используя другой синтаксис и другую семантику. Наследование стиля SQL:1999 еще не поддерживается QHB.

Таблицы с нулевыми столбцами

QHB позволяет создавать таблицу без столбцов (например, CREATE TABLE foo();). Это расширение от стандарта SQL, который не позволяет таблицы с нулевыми столбцами. Таблицы с нулевыми столбцами сами по себе не очень полезны, но их запрещение создает специальные случаи для ALTER TABLE DROP COLUMN, поэтому кажется более правильным игнорировать это ограничение спецификации.

Несколько столбцов идентификаторов

QHB позволяет таблице иметь более одного столбца идентификаторов. Стандарт указывает, что таблица может иметь не более одного столбца идентификаторов. Это смягчается главным образом для обеспечения большей гибкости при выполнении изменений схемы или миграции. Обратите внимание, что команда INSERT поддерживает только одно предложение переопределения, которое применяется ко всему оператору, поэтому наличие нескольких столбцов идентификаторов с различным поведением не очень хорошо поддерживается.

Генерируемые столбцы

Вариант STORED не является стандартным, но также используется другими реализациями SQL. Стандарт SQL не определяет хранение генерируемых столбцов.

Предложение LIKE

В то время как a LIKE предложение существует в стандарте SQL, многие параметры, которые QHB принимает для него, не входят в стандарт, а некоторые параметры стандарта не реализуются QHB.

Предложение WITH

Предложение WITH является расширением QHB; параметры хранения не входят в стандарт.

TABLESPACE

Концепция табличных пространств QHB не является частью стандарта. Следовательно, пункты TABLESPACE и USING INDEX TABLESPACE это расширения.

Типизированная таблица

Типизированные таблицы реализуют подмножество стандарта SQL. Согласно стандарту, типизированная таблица имеет столбцы, соответствующие базовому составному типу, а также еще один столбец, который является "самоссылающимся столбцом" (self-referencing column). QHB явно не поддерживает столбцы с собственными ссылками.

Предложение PARTITION BY

Предложение PARTITION BY является расширением QHB.

Предложение PARTITION OF

Предложение PARTITION OF является расширением QHB.

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

ALTER TABLE, DROP TABLE, CREATE TABLE AS, CREATE TABLESPACE, CREATE TYPE


CREATE TABLE AS

CREATE TABLE AS -определить новую таблицу из результатов запроса

Синтаксис

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
    [ (column_name [, ...] ) ]
    [ USING method ]
    [ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
    [ TABLESPACE tablespace_name ]
    AS query
    [ WITH [ NO ] DATA ]

Описание

CREATE TABLE AS создает таблицу и заполняет ее данными, вычисленными командой SELECT. Столбцы таблицы имеют имена и типы данных, связанные с выходными столбцами SELECT (за исключением того, что можно переопределить имена столбцов, предоставив явный список новых имен столбцов).

CREATE TABLE AS имеет некоторое сходство с созданием представления, но на самом деле это совсем другое: он создает новую таблицу и оценивает запрос только один раз, чтобы заполнить новую таблицу изначально. Новая таблица не будет отслеживать последующие изменения исходных таблиц запроса. Напротив, представление повторно оценивает свою определяющую инструкцию SELECT всякий раз, когда оно запрашивается.

Параметры

GLOBAL или LOCAL

Игнорируется для совместимости. Использование этих ключевых слов не рекомендуется; смотрите дополнительную информацию в разделе CREATE TABLE.

TEMPORARY или TEMP

Если этот параметр указан, таблица создается как временная таблица. Дополнительные сведения см. в разделе CREATE TABLE.

UNLOGGED

Если указано, таблица создается как незарегистрированная таблица. Дополнительные сведения см. в разделе CREATE TABLE.

IF NOT EXISTS

Не считать ошибкой, если связь с тем же именем уже существует. В этом случае выдается соответствующее уведомление. Дополнительные сведения см. в разделе CREATE TABLE.

table_name

Имя, которое может быть дополнено схемой, создаваемой таблицы.

column_name

Имя столбца в новой таблице. Если имена столбцов не указаны, они берутся из выходных имен столбцов запроса.

USING method

Это необязательное предложение определяет метод доступа к таблице, который будет использоваться для хранения содержимого для новой таблицы; метод должен быть методом доступа типа TABLE. Дополнительную информацию смотрите в главе Определение интерфейса метода доступа к таблице. Если этот параметр не указан, то для новой таблицы выбирается метод доступа к таблице по умолчанию. Дополнительную информацию смотрите в разделе default_table_access_method.

WITH ( storage_parameter [= value] [, ... ] )

В этом предложении указываются необязательные параметры хранения для новой таблицы; дополнительные сведения см. в разделе Параметры хранения. Для обратной совместимости the С предложение для таблицы также может включать в себя OIDS=FALSE чтобы указать, что строки новой таблицы не должны содержать OID (идентификаторы объектов), OIDS=TRUE не поддерживается.

WITHOUT OIDS

Это синтаксис обратной совместимости для объявления таблицы WITHOUT OIDS, создание таблицы WITH OIDS не поддерживается.

ON COMMIT

Поведение временных таблиц в конце блока транзакций можно контролировать с помощью ON COMMIT. Есть три варианта::

PRESERVE ROWS

Никаких специальных действий по завершению сделок не предпринимается. Это поведение по умолчанию.

DELETE ROWS

Все строки во временной таблице будут удалены в конце каждого блока транзакций. По существу, автоматическое TRUNCATE выполняется на каждом коммите.

DROP

Временная таблица будет удалена в конце текущего блока транзакций.

TABLESPACE tablespace_name

tablespace_name это имя табличного пространства, в котором будет создана новая таблица. Если этот параметр не указан, выполняется запрос default_tablespace или temp_tablespaces если таблица является временной.

query

Команда SELECT, TABLE или VALUES, либо команда EXECUTE, которая выполняет подготовленный запрос SELECT , TABLE или VALUES.

WITH [NO ] DATA

Это предложение указывает, следует ли копировать данные, созданные запросом, в новую таблицу. Если нет, то копируется только структура таблицы. По умолчанию выполняется копирование данных.

Примечания

Эта команда функционально похожа на SELECT INTO, но она предпочтительна, так как ее менее вероятно спутать с другими вариантами использования синтаксиса SELECT INTO. Кроме того, CREATE TABLE AS , которая предлагает дополнительный набор функций, предлагаемых SELECT INTO.

Примеры

Создание новой таблицы films_recent состоит только из последних записей из таблицы films:

CREATE TABLE films_recent AS
  SELECT * FROM films WHERE date_prod >= '2002-01-01';

Чтобы скопировать таблицу полностью, короткая форма с помощью команды TABLE также может быть использована:

CREATE TABLE films2 AS
  TABLE films;

Создайте новую временную таблицу films_recent, состоящую только из последних записей из таблицы films, используя подготовленное заявление. Новая таблица будет удалена при фиксации:

PREPARE recentfilms(date) AS
  SELECT * FROM films WHERE date_prod > $1;
CREATE TEMP TABLE films_recent ON COMMIT DROP AS
  EXECUTE recentfilms('2002-01-01');

Совместимость

CREATE TABLE AS соответствует стандарту SQL. Ниже приведены нестандартные расширения:

  • Стандарт требует круглых скобок вокруг предложения subquery; в QHB эти круглые скобки необязательны.

  • В стандарте, предложение WITH [ NO ] DATA обязательно; в QHB это необязательно.

  • QHB обрабатывает временные таблицы способом, несколько отличающимся от стандартного; смотрите раздел CREATE TABLE для получения подробной информации.

  • Предложение WITH является расширением QHB; параметры хранения не входят в стандарт.

  • Концепция табличных пространств QHB не является частью стандарта. Следовательно, предложение TABLESPACE это расширение.

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

CREATE MATERIALIZED VIEW, CREATE TABLE, EXECUTE, SELECT, SELECT INTO, VALUES


CREATE TABLESPACE

CREATE TABLESPACE -определение нового табличного пространства

Синтаксис

CREATE TABLESPACE tablespace_name
    [ OWNER { new_owner | CURRENT_USER | SESSION_USER } ]
    LOCATION 'directory'
    [ WITH ( tablespace_option = value [, ... ] ) ]

Описание

CREATE TABLESPACE пространство регистрирует новое табличное пространство в масштабе кластера. Имя табличного пространства должно отличаться от имени любого существующего табличного пространства в кластере баз данных.

Табличное пространство позволяет суперпользователям определять альтернативное расположение в файловой системе, в котором могут находиться файлы данных, содержащие объекты базы данных (такие как таблицы и индексы).

Пользователь с соответствующими правами может пройти tablespace_name чтобы CREATE DATABASE данных, CREATE TABLE, CREATE INDEX или ADD CONSTRAINT, чтобы файлы данных для этих объектов хранились в указанном табличном пространстве.

Предупреждение

Табличное пространство не может использоваться независимо от кластера, в котором оно определено; см. раздел Табличные пространства.

Параметры

tablespace_name

Имя создаваемого табличного пространства. Имя не может начинаться с pg_, поскольку такие имена зарезервированы для системных табличных пространств.

user_name

Имя пользователя, которому будет принадлежать табличное пространство. Если этот параметр опущен, по умолчанию используется пользователь, выполняющий команду. Только суперпользователи могут создавать табличные пространства, но они могут назначать владение табличными пространствами не суперпользователям.

directory

Каталог, который будет использоваться для табличного пространства. Каталог должен существовать (CREATE TABLESPACE не будет его создавать), быть пустым и принадлежать системному пользователю QHB. Каталог должен быть задан абсолютным именем пути.

tablespace_option

Параметр табличного пространства, который необходимо установить или сбросить. В настоящее время доступны только следующие параметры seq_page_cost, random_page_cost и effective_io_concurrency. Установка любого значения для конкретного табличного пространства переопределит обычную оценку планировщиком стоимости чтения страниц из таблиц в этом табличном пространстве, установленную параметрами конфигурации с тем же именем (см. seq_page_cost , random_page_cost, effective_io_concurrency). Это может быть полезно, если одно табличное пространство расположено на диске, который быстрее или медленнее, чем остальная часть подсистемы ввода-вывода.

Примечания

Табличные пространства поддерживаются только в системах, поддерживающих символьные ссылки.

CREATE TABLESPACE не может быть выполнено внутри блока транзакций.

Примеры

Чтобы создать табличное пространство dbspace в расположении файловой системы /data/dbs, сначала создайте каталог с помощью средств операционной системы и установите правильное владение:

mkdir /data/dbs
chown qhb:qhb /data/dbs

Затем выполните команду создания табличного пространства внутри QHB:

CREATE TABLESPACE dbspace LOCATION '/data/dbs';

Чтобы создать табличное пространство, принадлежащее другому пользователю базы данных, используйте следующую команду:

CREATE TABLESPACE indexspace OWNER genevieve LOCATION '/data/indexes';

Совместимость

CREATE TABLESPACE-это расширение QHB.

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

CREATE DATABASE, CREATE TABLE, CREATE INDEX, DROP TABLESPACE, ALTER TABLESPACE


CREATE TEXT SEARCH CONFIGURATION

CREATE TEXT SEARCH CONFIGURATION - создание новой конфигурации текстового поиска

Синтаксис

CREATE TEXT SEARCH CONFIGURATION имя (
    PARSER = имя_анализатора |
    COPY = исходная_конфигурация
)

Описание

CREATE TEXT SEARCH CONFIGURATION создает новую конфигурацию текстового поиска. Конфигурация текстового поиска задает синтаксический анализатор текстового поиска, который может разделить строку на фрагменты, а также словари, которые могут использоваться для определения, какие фрагменты представляют интерес для поиска.

Если указан только синтаксический анализатор, то новая конфигурация текстового поиска изначально не имеет сопоставлений между типами фрагментов и словарями и поэтому будет игнорировать все слова. Необходимо использовать команду ALTER TEXT SEARCH CONFIGURATION для создания сопоставлений, чтобы сделать конфигурацию полезной. Кроме того, можно скопировать существующую конфигурацию текстового поиска.

Если задано имя схемы, то конфигурация текстового поиска создается в указанной схеме. В противном случае он создается в текущей схеме.

Пользователь, определяющий конфигурацию текстового поиска, становится его владельцем.

Дополнительную информацию смотрите в главе Команды SQL.

Параметры

имя

Имя создаваемой конфигурации текстового поиска. Имя может быть дополнено схемой.

имя_анализатора

Имя синтаксического анализатора текстового поиска, используемого для этой конфигурации.

исходная_конфигурация

Имя существующей конфигурации текстового поиска для копирования.

Примечания

Параметры PARSER и COPY являются взаимоисключающими, поскольку при копировании существующей конфигурации копируется и выбранный в ней анализатор.

Совместимость

В стандарте SQL нет инструкции CREATE TEXT SEARCH CONFIGURATION.

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

ALTER TEXT SEARCH CONFIGURATION, DROP TEXT SEARCH CONFIGURATION


CREATE TEXT SEARCH DICTIONARY

CREATE TEXT SEARCH DICTIONARY - создание нового словаря текстового поиска

Синтаксис

CREATE TEXT SEARCH DICTIONARY имя (
    TEMPLATE = шаблон
    [, параметр = значение [, ... ]]
)

Описание

CREATE TEXT SEARCH DICTIONARY создает новый словарь текстового поиска. Словарь текстового поиска определяет способ распознавания интересных или неинтересных слов для поиска. Словарь зависит от шаблона текстового поиска, который определяет функции, фактически выполняющие эту работу. Обычно словарь предоставляет некоторые параметры, которые управляют подробным поведением функций шаблона.

Если задано имя схемы, то в указанной схеме создается словарь текстового поиска. В противном случае он создается в текущей схеме.

Пользователь, определяющий словарь текстового поиска, становится его владельцем.

Дополнительную информацию смотрите в главе Команды SQL.

Параметры

имя

Имя создаваемого словаря текстового поиска. Имя может быть дополнено схемой.

шаблон

Имя шаблона текстового поиска, который будет определять основное поведение этого справочника.

параметр

Имя определенного шаблоном параметра, который должен быть установлен для этого справочника.

значение

Значение, используемое для параметра, зависящего от шаблона. Если значение не является простым идентификатором или числом, оно должно быть заключено в кавычки (при желании его можно заключать в кавычки всегда).

Параметры могут отображаться в любом порядке.

Примеры

В следующем примере команда создает словарь на основе Snowball с нестандартным списком стоп-слов.

CREATE TEXT SEARCH DICTIONARY my_russian (
    template = snowball,
    language = russian,
    stopwords = myrussian
);

Совместимость

В стандарте SQL нет инструкции CREATE TEXT SEARCH DICTIONARY.

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

ALTER TEXT SEARCH DICTIONARY, DROP TEXT SEARCH DICTIONARY


CREATE TEXT SEARCH PARSER

CREATE TEXT SEARCH PARSER - создание нового синтаксического анализатора текстового поиска

Синтаксис

CREATE TEXT SEARCH PARSER имя (
    START = функция_начала ,
    GETTOKEN = функция_выдачи_фрагмента ,
    END = функция_окончания ,
    LEXTYPES = функция_лекс_типов
    [, HEADLINE = функция_выдержек ]
)

Описание

CREATE TEXT SEARCH PARSER создает новый анализатор текстового поиска. Синтаксический анализатор текстового поиска определяет способ разбиения текстовой строки на фрагменты и назначения фрагментам типов (категорий). Синтаксический анализатор сам по себе не особенно полезен, но должен быть привязан к конфигурации текстового поиска вместе с некоторыми словарями текстового поиска, которые будут использоваться для поиска.

Если задано имя схемы, то анализатор текстового поиска создается в указанной схеме. В противном случае он создается в текущей схеме.

Текущий пользователь должен быть суперпользователем, чтобы использовать CREATE TEXT SEARCH PARSER . (Это ограничение сделано потому, что ошибочное определение синтаксического анализатора текстового поиска может вызвать нарушения или даже аварийно завершить работу сервера).

Дополнительную информацию смотрите в главе Команды SQL.

Параметры

имя

Имя создаваемого анализатора текстового поиска. Имя может быть дополнено схемой.

функция_начала

Имя функции запуска для синтаксического анализатора.

функция_выдачи_фрагмента

Имя функции, выдающей следующий фрагмент для синтаксического анализатора.

функция_окончания

Имя конечной функции для синтаксического анализатора.

функция_лекс_типов

Имя функции перечисления лексических типов для синтаксического анализатора (функция, которая возвращает информацию о наборе типов фрагментов, которые она производит).

функция_выдержек

Имя функции извлечения выдержек (эта функция выделяет краткое содержание для набора фрагментов).

Имена функций могут быть дополнены схемой, если это необходимо. Типы аргументов не задаются, так как список аргументов для каждого типа функции предопределен. Все, кроме функции выдержек, являются обязательными.

Аргументы могут появляться в любом порядке, а не только тот, который показан выше.

Совместимость

В стандарте SQL нет инструкции CREATE TEXT SEARCH PARSER.

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

ALTER TEXT SEARCH PARSER, DROP TEXT SEARCH PARSER


CREATE TEXT SEARCH TEMPLATE

CREATE TEXT SEARCH TEMPLATE - создание нового шаблона текстового поиска

Синтаксис

CREATE TEXT SEARCH TEMPLATE имя (
    [ INIT = функция_инициализации , ]
    LEXIZE = функция_выделения_лексем
)

Описание

CREATE TEXT SEARCH TEMPLATE создает новый шаблон текстового поиска. Шаблоны текстового поиска определяют функции, реализующие словари текстового поиска. Шаблон не является полезным сам по себе, но должен быть создан как словарь, который будет использоваться. В справочнике обычно указываются параметры, которые должны быть заданы функциям шаблона.

Если задано имя схемы, то шаблон текстового поиска создается в указанной схеме. В противном случае он создается в текущей схеме.

Выполнить CREATE TEXT SEARCH TEMPLATE может только суперпользователь. Это ограничение сделано потому, что ошибочное определение шаблона текстового поиска может нарушить или даже аварийно завершить работу сервера. Причина отделения шаблонов от словарей заключается в том, что шаблон инкапсулирует “небезопасные” аспекты определения словаря. Параметры, которые можно задать при определении словаря, не могут причинить вред, поэтому создавать словари разрешено и непривилегированным пользователям.

Дополнительную информацию смотрите в главе Команды SQL.

Параметры

имя

Имя создаваемого шаблона текстового поиска. Имя может быть дополнено схемой.

функция_инициализации

Имя функции инициализации для шаблона.

функция_выделения_лексем

Имя функции выделения лексем.

Имена функций могут быть определены схемой, если это необходимо. Типы аргументов не задаются, так как список аргументов для каждого типа функции предопределен. Функция выделения лексем является обязательной, но функция инициализации является необязательной.

Аргументы могут появляться в любом порядке, а не только в том, который показан выше.

Совместимость

В стандарте SQL нет инструкции CREATE TEXT SEARCH TEMPLATE.

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

ALTER TEXT SEARCH TEMPLATE, DROP TEXT SEARCH TEMPLATE


CREATE TRANSFORM

CREATE TRANSFORM — создать трансформацию

Синтаксис

CREATE [ OR REPLACE ] TRANSFORM FOR type_name LANGUAGE lang_name (
    FROM SQL WITH FUNCTION from_sql_function_name [ (argument_type [, ...]) ],
    TO SQL WITH FUNCTION to_sql_function_name [ (argument_type [, ...]) ]
);

Описание

CREATE TRANSFORM определяет новую трансформацию. CREATE OR REPLACE TRANSFORM будет либо создавать новую трансформацию, либо заменять существующее определение.

Трансформация указывает, как адаптировать тип данных к процедурному языку. Например, при написании функции на языке PL/Python с использованием типа hstore, PL/Python заранее не знает, как представить значения hstore в среде Python. Языковые реализации обычно по умолчанию используют текстовое представление, но это неудобно, когда, например, ассоциативный массив или список были бы более подходящими.

Трансформация определяет две функции:

  • Функция "from SQL", которая преобразует тип из среды SQL в среду языка. Эта функция будет вызываться для аргументов функции, написанной на этом языке.

  • Функция "to SQL", которая преобразует тип из среды языка в среду SQL. Эта функция будет вызвана для значения, возвращаемого из функции, написанной на этом языке.

Нет необходимости предоставлять обе эти функции одновременно. Если одна из них не указана, при необходимости будет использоваться поведение по умолчанию для конкретного языка. (Чтобы полностью исключить возможность трансформации в одну сторону, можно написать функцию, которая будет всегда выдавать ошибку).

Чтобы иметь возможность создать трансформацию, текущий пользователь должен быть владельцем и иметь право USAGE для типа, иметь право USAGE для языка, и быть владельцем и иметь право EXECUTE для функций from-SQL и to-SQL, если они указаны.

Параметры

type_name

Имя типа данных, для которого предназначена трансформация.

lang_name

Название языка, для которого предназначена трансформация.

from_sql_function_name[(argument_type [, ...])]

Имя функции для преобразования типа из среды SQL в среду языка. Она должна принимать один аргумент типа internal и возвращать тип internal. Фактический аргумент будет иметь тип, который нужно преобразовать, и функция должна быть закодирована под это. (Но нельзя объявить функцию, возвращающую тип internal, на уровне SQL, без по крайней мере одного входного аргумента типа internal). Фактическое возвращаемое значение будет определяться реализацией языка. Если список аргументов не указан, имя функции должно быть уникальным в схеме.

to_sql_function_name[(argument_type [, ...])]

Имя функции для преобразования типа из среды языка в среду SQL. Она должна принимать один аргумент типа internal и возвращает тип, к которому и требуется преобразование. Фактическое значение аргумента будет будет определяться реализацией языка. Если список аргументов не указан, имя функции должно быть уникальным в схеме.

Примечания

Используйте DROP TRANSFORM для удаления трансформации.

Примеры

Чтобы создать трансформацию для типа hstore и языка plpythonu, сначала нужно создать тип и язык:

CREATE TYPE hstore ...;

CREATE EXTENSION plpythonu;

Затем создайте необходимые функции:

CREATE FUNCTION hstore_to_plpython(val internal) RETURNS internal
LANGUAGE C STRICT IMMUTABLE
AS ...;

CREATE FUNCTION plpython_to_hstore(val internal) RETURNS hstore
LANGUAGE C STRICT IMMUTABLE
AS ...;

И, наконец, создать трансформацию, чтобы соединить их все вместе:

CREATE TRANSFORM FOR hstore LANGUAGE plpythonu (
    FROM SQL WITH FUNCTION hstore_to_plpython(internal),
    TO SQL WITH FUNCTION plpython_to_hstore(internal)
);

На практике эти команды будут пом в расширение.

Раздел contrib содержит ряд расширений, которые предоставляют трансформации,которые могут служить в качестве реальных примеров.

Совместимость

Команда CREATE TRANSFORM является расширением QHB. В стандарте SQL существует команда CREATE TRANSFORM, но она предназначена для преобразования типов для языков на стороне клиента. Этот вариант использования не поддерживается QHB.

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

CREATE FUNCTION, CREATE LANGUAGE, CREATE TYPE, DROP TRANSFORM


CREATE TRIGGER

CREATE TRIGGER - создать новый триггер

Синтаксис

CREATE [ CONSTRAINT ] TRIGGER имя { BEFORE | AFTER | INSTEAD OF } { событие [ OR ... ] }
    ON имя_таблицы
    [ FROM ссылающаяся_таблица ]
    [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ]
    [ REFERENCING { { OLD | NEW } TABLE [ AS ] имя_переходного_отношения } [ ... ] ]
    [ FOR [ EACH ] { ROW | STATEMENT } ]
    [ WHEN ( условие ) ]
    EXECUTE { FUNCTION | PROCEDURE } имя_функции ( аргументы )

Где событием может быть:

    INSERT
    UPDATE [ OF имя_столбца [, ... ] ]
    DELETE
    TRUNCATE

Описание

Команда CREATE TRIGGER создает новый триггер. Триггер будет связан с заданной таблицей, представлением или сторонней таблицей и будет выполнять указанную функцию имя_функции, при выполнении определенных типов операций с таблицей.

Триггер может быть настроен так, чтобы он срабатывал до попытки выполнения операции со строкой (до проверки ограничений и попытки выполнить INSERT, UPDATE или DELETE); или после завершения операции (после проверки ограничений и завершения INSERT, UPDATE или DELETE); или вместо операции (в случае вставки, обновления или удаления строк в представлении). Если триггер срабатывает до или вместо события, триггер может пропустить операцию с текущей строкой или изменить вставляемую строку (только для операции INSERT и UPDATE ). Если триггер срабатывает после события, все изменения, включая результат действия других триггеров, будут “видимы” для него.

Триггер, с указанием FOR EACH ROW вызывается один раз для каждой строки, которая изменяется в результате операции. Например, операция DELETE, которая затрагивает(удаляет) 10 строк, вызовет срабатывание всех триггеров с событием ON DELETE для целевого отношения 10 раз подряд, по одному разу для каждой удаляемой строки. И наоборот, триггер, с указанием FOR EACH STATEMENT срабатывает только один раз для любой заданной операции, независимо от того, сколько строк она изменяет (в частности, выполнение операции, которая не изменит ни одной строки, все равно приведет к вызову всех применимых триггеров FOR EACH STATEMENT).

Триггеры, для запуска вместо события, т.е. INSTEAD OF, должны быть созданы с указанием FOR EACH ROW, и могут быть определены только для представлений. Тригеры с режимами BEFORE и AFTER для представления должны быть созданы с указанием FOR EACH STATEMENT.

Кроме того, триггеры могут быть определены для операции TRUNCATE, но только с указанием FOR EACH STATEMENT.

В следующей таблице перечислены типы триггеров, которые могут использоваться для таблиц, представлений и сторонних таблиц:

КогдаСобытиеНа уровне строкНа уровне оператора
BEFOREINSERT/UPDATE/DELETEТаблицы и сторонние таблицыТаблицы, Представления и сторонние таблицы
BEFORETRUNCATEТаблицы
AFTERINSERT/UPDATE/DELETEТаблицы и сторонние таблицыТаблицы, Представления и сторонние таблицы
AFTERTRUNCATEТаблицы
INSTEAD OFINSERT/UPDATE/DELETEПредставления
INSTEAD OFTRUNCATE

Кроме того, в определении триггера можно указывать логическое условие WHEN, после проверки которого, определяется должен ли срабатывать триггер. В триггерах на уровне строк условие WHEN может проверять старые и/или новые значения столбцов строки. Триггеры на уровне оператора также могут содержать условие WHEN, хотя эта функциональность не так полезна в этом случае, так как в условии нельзя сослаться на какие-либо значения в таблице.

Если для одного и того же события определено несколько триггеров одного типа, они будут срабатывать в алфавитном порядке их имен.

Если указан параметр CONSTRAINT, команда создает триггер ограничения. Он такой же как и обычный триггер, за исключением того, что время его срабатывания можно регулировать с помощью команды SET CONSTRAINTS. Триггеры ограничений должны быть созданы с указанием AFTER ROW для обычных таблиц (не для сторонних таблиц). Они могут срабатывать либо в конце оператора, вызывающего целевое событие, либо в конце содержащей оператор транзакции; в последнем случае они считаются отложенными (deferred). Срабатывание ожидающего отложенного запуска триггера может быть принудительно вызвано с помощью команды SET CONSTRAINTS. Триггеры ограничений, как ожидается, должны генерировать исключение, когда реализуемые ими ограничения нарушаются.

Если указан параметр REFERENCING, для триггера собираются переходные отношения (transition relations), которые представляют собой наборы строк, включающие все строки, которые были вставлены, удалены или изменены текущим оператором SQL. Эта функциональность позволяет триггеру иметь глобальное представление о том, что сделал оператор, а не только об одной строке за раз. Это указание разрешено только для триггера с режимом AFTER, который не является триггером ограничения; также, если такой триггер является триггером для операций UPDATE, у него должен отсутствовать список имён_столбцов. Указание OLD TABLE может быть задано только один раз, и только для триггера, который срабатывает для операций UPDATE или DELETE; это указание создает переходное отношение, которое содержит образы до изменения всех строк, обновленных или удаленных оператором. Аналогично, указание NEW TABLE может быть задано только один раз, и только для триггера, который срабатывает для операций UPDATE или INSERT; это указание создает переходное отношение, которое содержит образы после изменения всех строк, обновленных или вставленных оператором.

Операция SELECT не изменяет строки, поэтому нельзя создать триггеры SELECT. Для решения проблем, в которых как представляется, требуются такие триггеры, могут подойти правила и представления

Дополнительную информацию о триггерах смотрите в главе Триггеры.

Параметры

имя

Имя, нового триггера. Имя должно отличаться от имени любого другого триггера для той же таблицы. Имя триггера не может быть дополнено схемой, так как триггер наследует схему своей таблицы. Для триггера ограничения это имя также используется для изменения поведения триггера с помощью команды SET CONSTRAINTS.

BEFORE
AFTER
INSTEAD OF

Определяет, вызывается ли функция до, после или вместо события. Для триггер ограничения можно задать только значение AFTER.

событие

Одно из значений INSERT, UPDATE, DELETE или TRUNCATE; параметр указывает на событие, которое приведет к срабатыванию триггера. Можно указать несколько событий с помощью слова OR, за исключением случаев, когда запрашиваются переходные отношения.

Для события UPDATE, можно указать список столбцов, используя следующий синтаксис:

UPDATE OF имя_столбца1 [, имя_столбца2 ... ]

Триггер будет срабатывать только в том случае, если хотя бы один из перечисленных столбцов указан в целевой команде UPDATE или будет генерируемым и при этом зависящим от столбца, который фигурирует в UPDATE.

Для событий INSTEAD OF UPDATE не допускается использование списка столбцов. Список столбцов также не может быть указан при запросе переходных отношений.

имя_таблицы

Имя, которое может быть дополнено схемой, таблицы, представления или сторонней таблицы, для которой предназначен триггер.

ссылающаяся_таблица

Имя, которое может быть дополнено схемой, другой таблицы, на которую ссылается ограничение. Этот параметр используется для ограничений внешнего ключа и не рекомендуется для обычного использования. Параметр может быть указан только для триггеров ограничений.

DEFERRABLE
NOT DEFERRABLE
INITIALLY IMMEDIATE
INITIALLY DEFERRED

Время срабатывания триггера по умолчанию. Смотрите документацию CREATE TABLE для получения подробной информации об этих параметрах. Параметр может быть указан только для триггеров ограничений.

REFERENCING

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

OLD TABLE NEW TABLE

Это предложение указывает, относится ли следующее имя к переходному отношению которое содержит образы до изменения, или к переходному отношению,которое содержит образы после изменения.

имя_переходного_отношения

Имя (без указания схемы), которое будет использоваться в триггере для этого переходного отношения.

FOR EACH ROW FOR EACH STATEMENT

Этот параметр указывает, запускать функцию триггера один раз для каждой строки, на которую влияет событие триггера, или только один раз для оперетора SQL. FOR EACH STATEMENT является значением по умолчанию. Для триггеров ограничений может быть указано только FOR EACH ROW.

условие

Логическое выражение, определяющее, будет ли фактически выполняться функция триггера. Если WHEN указано, функция будет вызываться только в том случае, если условие вернет true. В триггерах FOR EACH ROW, условие WHEN может ссылаться на столбцы старых и / или новых значений строк в виде записи OLD.имя_столбца или NEW.имя_столбца соответственно. Конечно, триггеры INSERT не могут ссылаться на OLD, а триггеры DELETE не могут ссылаться на NEW.

Триггеры INSTEAD OF не поддерживают условия WHEN.

В настоящий момент, выражения WHEN не могут содержать вложенные запросы.

Обратите внимание, что для триггеров ограничений, вычисление условия WHEN не откладывается, а выполняется сразу после операции обновления строки. Если условие вернуло не true, то триггер не помещается в очередь для отложенного выполнения.

имя_функции

функция заданная пользователем, которая объявляется как функция без аргументов и возвращающая тип trigger, и который выполняется при срабатывании триггера.

В синтаксисе команды CREATE TRIGGER, ключевые слова FUNCTION и PROCEDURE эквивалентны, но указанная функция должна в любом случае быть функцией, а не процедурой. Ключевое слово PROCEDURE оставлено по историческим причинам.

аргументы

Необязательный список аргументов разделенных запятыми, которые будут переданы функции при срабатывании триггера. Аргументы являются строковыми константами. Также в качестве аргументов можно указать простые имена и числовые константы, но все они будут также преобразованы в строки. Следует проверить описание языка реализации триггерной функции, чтобы точно знать порядок обращения к таким аргументам внутри функции, так как он может отличаться от обычных аргументов функции.

Примечания

Чтобы создать триггер, пользователь должен иметь право TRIGGER для таблицы. Пользователь также должен иметь право EXECUTE для функции триггера.

Для удаления триггера используйте команду DROP TRIGGER.

Триггер для определенных столбцов (созданный с помощью синтаксиса UPDATE OF имя_столбца) будет срабатывать, когда любой из его столбцов перечислен в качестве целевых в команде UPDATE списка SET. Значения столбцов можно изменить так, что триггер не сработает, потому что изменения, внесенные с помощью триггера BEFORE UPDATE не рассматриваются. И наоборот, команда UPDATE ... SET x = x ... запустит триггер по колонке x, даже если значение столбца не изменилось.

В триггере BEFORE, условие WHEN вычисляется непосредственно перед возможным выполнением функции, поэтому проверка с помощью WHEN существенно не отличается от проверки того же условия в начале функции триггера. В частности, обратите внимание, что строка NEW, рассматриваемая условием, содержит текущее значение, возможно, измененное предыдущими триггерами. Кроме того, в триггере BEFORE условие WHEN не может проверять системные столбцы строк new (как например ctid), потому что они еще не будут установлены.

В триггере AFTER, условие WHEN вычисляется сразу после того, как происходит обновление строки, и если условие выполняется, событие помещается в очередь для запуска триггера в конце оператора. Если же для триггера AFTER условие WHEN не выполнено, нет необходимости ставить событие в очередь или повторно перечитывать строку в конце оператора. Это приводит к значительному ускорению операторов, которые изменяют много строк, если триггер должен срабатывать только для нескольких из них.

В некоторых случаях одна команда SQL может запустить несколько видов триггеров. Например, команда INSERT с указанием ON CONFLICT DO UPDATE может вызвать как операции вставки, так и операции обновления, поэтому она будет запускать оба типа триггеров по мере необходимости. Переходные отношения, предоставляемые триггерам, будут разными в зависисмости от типа их типа событий; таким образом, триггер INSERT будет видеть только вставленные строки, в то время как триггер UPDATE будет видеть только обновленные строки.

Обновления или удаления строк, вызванные принудительными действиями внешнего ключа, такими как ON UPDATE CASCADE или ON DELETE SET NULL, рассматриваются как часть команды SQL, которая вызвала их (обратите внимание, что такие действия никогда не откладываются). В затрагиваемой таблице будут запущены соответствующие триггеры, так что это позволяет вызывать триггеры для команд SQL, не соответствующих непосредственно их типу. В простых случаях триггеры, которые запрашивают переходные отношения, будут видеть все изменения, сделанные в их таблице одной исходной командой SQL, в виде одного переходного отношения. Однако существуют случаи, в которых наличие триггера AFTER ROW, который запрашивает переходные отношения, приведет к тому, что действия принудительного применения внешнего ключа, инициированные одной командой SQL, будут разделены на несколько шагов, каждый со своим собственным переходным отношением(отношениями). В таких случаях любые триггеры уровня оператора, будут вызваны один раз при создании переходного отношения, гарантируя, что триггеры будут видеть каждую затронутую строку в переходном отношении один и только один раз.

Триггеры уровня операторов для представления срабатывают только в том случае, если операция с представлениим обрабатывается триггером уровня строк INSTEAD OF. Если операция обрабатывается по правилу INSTEAD, тогда все операторы, генерируемые правилом, выполняются вместо исходного оператора, обращающегося к представлению, так что триггеры, которые будут запущены, являются триггерами для таблиц, к которым обращаются эти заменяющие операторы. Аналогично, если представление автоматически обновляется, то операция обрабатывается путем автоматического переписывания оператора в виде операции с базовой таблицей представления, так что запускаются триггеры уровня операторов базовой таблицы.

Создание триггера уровня строки в партиционированной таблице приведет к созданию идентичных триггеров во всех ее партициях; и все партиции, созданные или присоединенные позже, также будут содержать идентичный триггер. Триггеры для партиционированных таблиц могут быть только с режимом AFTER.

Изменение данных в партиционированной таблице или таблице, у которой есть потомки, запускает триггеры уровня оператора, связанные с явно задействованной таблицей, но не триггеры уровня оператора для ее партиций или дочерних таблиц. Напротив, триггеры уровня строк запускаются для строк в затронутых партициях или дочерних таблицах, даже если они явно не присутствуют в запросе. Если триггер уровня оператора был определен с переходными отношениями, указанными в параметре REFERENCING, то в них будут видны образы строк до и после из всех затронутых партиций или дочерних таблиц. В случае дочерних таблиц в иерархии наследования, образы строк включают только столбцы, которые присутствуют в таблице, связанной с триггером. В настоящее время триггеры уровня строк с переходными отношениями не могут быть определены для партиций или дочерних таблиц в иерархии наследования.

Примеры

Выполнение функции check_account_update всякий раз, перед изменением строк таблицы accounts:

CREATE TRIGGER check_update
    BEFORE UPDATE ON accounts
    FOR EACH ROW
    EXECUTE FUNCTION check_account_update();

То же самое, но функция будет выполняться, если столбец balance указан в списке целевых столбцов команды UPDATE:

CREATE TRIGGER check_update
    BEFORE UPDATE OF balance ON accounts
    FOR EACH ROW
    EXECUTE FUNCTION check_account_update();

В этом примере функция будет выполняться, если значение столбца balance действительно изменилось:

CREATE TRIGGER check_update
    BEFORE UPDATE ON accounts
    FOR EACH ROW
    WHEN (OLD.balance IS DISTINCT FROM NEW.balance)
    EXECUTE FUNCTION check_account_update();

Вызов функции, ведущей журнал изменений в accounts, только если что-то изменилось:

CREATE TRIGGER log_update
    AFTER UPDATE ON accounts
    FOR EACH ROW
    WHEN (OLD.* IS DISTINCT FROM NEW.*)
    EXECUTE FUNCTION log_account_update();

Выполнение для каждой строки таблицы функции view_insert_row, которая будет вставлять строки в нижележащие таблицы представления:

CREATE TRIGGER view_insert
    INSTEAD OF INSERT ON my_view
    FOR EACH ROW
    EXECUTE FUNCTION view_insert_row();

Выполнение функции check_transfer_balances_to_zero для каждого оператора, которая проверяет, что строки таблицы transfer в совокупности дают нулевой баланс:

CREATE TRIGGER transfer_insert
    AFTER INSERT ON transfer
    REFERENCING NEW TABLE AS inserted
    FOR EACH STATEMENT
    EXECUTE FUNCTION check_transfer_balances_to_zero();

Выполнение функции check_matching_pairs для каждой строки, которая проверяет, что соответствующие пары пунктов изменены синхронно (одним оператором):

CREATE TRIGGER paired_items_update
    AFTER UPDATE ON paired_items
    REFERENCING NEW TABLE AS newtab OLD TABLE AS oldtab
    FOR EACH ROW
    EXECUTE FUNCTION check_matching_pairs();

Раздел Полный пример запуска содержит полный пример функции триггера, написанной на языке C.

Совместимость

Команда CREATE TRIGGER в QHB реализует подмножество возможностей, описанных в стандарте SQL. В настоящее время отсутствуют следующие функциональные возможности:

  • В то время как имена переходных таблиц для триггеров AFTER задаются с помощью предложения REFERENCING стандартным образом, переменные строк, используемые в триггерах FOR EACH ROW нельзя указывать в предложении REFERENCING. Порядок обращения к таким строкам зависит от языка, на котором написана функция триггера, но для каждого языка он вполне определённый. Некоторые языки действуют так, как будто предложение REFERENCING присутствует в команде, и содержит указание OLD ROW AS OLD NEW ROW AS NEW.

  • Стандарт позволяет использовать переходные отношения с триггерами UPDATE, которые ограничивают набор отслеживаемых столбцов, но тогда набор строк, которые должны быть видны в переходных отношениях, должен зависеть от списка целевых столбцов триггера. Это в настоящее время в QHB это не реализовано.

  • QHB разрешает задавать в качестве действия триггера только функцию, которая определена пользователем. Стандарт же позволяет выполнять ряд других команд SQL, таких как CREATE TABLE, в качестве действия триггера. Это ограничение не трудно обойти, создав пользовательскую функцию, которая выполняет нужные команды.

В стандарте SQL определено, что несколько триггеров должны срабатывать в том порядке, в котором они были созданы. QHB использует порядок имен, который был сочтен более удобным.

В стандарте SQL указано, что триггеры BEFORE DELETE для каскадного удаления запускаются после завершения каскадного DELETE. В QHB триггеры BEFORE DELETE всегда запускаются перед операцией удаления, даже каскадной. Это поведение выбрано как более логичное. Существует ещё одно отклонение от стандарта, если триггеры BEFORE, срабатывающие в результате ссылочной операции, изменяют строки или препятствуют выполнению обновления. Это может привести к нарушениям ограничений или сохранению данных, которые не соблюдают ссылочную целостность.

Возможность задать несколько действий для одного триггера с помощью слова OR является расширением стандарта SQL, реализованным в QHB.

Возможность вызова триггеров для операции TRUNCATE яявляется расширением стандарта SQL, реализованным в QHB, так же как и возможность определять триггеры уровне оператора для представлений.

Вариант команды CREATE CONSTRAINT TRIGGER является расширением стандарта SQL, реализованным в QHB.

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

ALTER TRIGGER, DROP TRIGGER, CREATE FUNCTION, SET CONSTRAINTS


CREATE TYPE

CREATE TYPE - создать новый тип данных

Синтаксис

CREATE TYPE имя AS
    ( [ имя_атрибута тип_данных [ COLLATE правило_сортировки ] [, ... ] ] )

CREATE TYPE имя AS ENUM
    ( [ 'метка' [, ... ] ] )

CREATE TYPE имя AS RANGE (
    SUBTYPE = подтип
    [ , SUBTYPE_OPCLASS = класс_оператора_подтипа ]
    [ , COLLATION = правило_сортировки ]
    [ , CANONICAL = каноническая_функция ]
    [ , SUBTYPE_DIFF = функция_разницы_подтипа ]
)

CREATE TYPE имя (
    INPUT = функция_ввода,
    OUTPUT = функция_вывода
    [ , RECEIVE = функция_получения ]
    [ , SEND = функция_отправки ]
    [ , TYPMOD_IN = функция_ввода_модификатора_типа ]
    [ , TYPMOD_OUT = функция_вывода_модификатора_типа ]
    [ , ANALYZE = функция_анализа ]
    [ , INTERNALLENGTH = { внутр_длина | VARIABLE } ]
    [ , PASSEDBYVALUE ]
    [ , ALIGNMENT = выравнивание ]
    [ , STORAGE = хранение ]
    [ , LIKE = тип_образец ]
    [ , CATEGORY = категория ]
    [ , PREFERRED = предпочитаемый ]
    [ , DEFAULT = по_умолчанию ]
    [ , ELEMENT = элемент ]
    [ , DELIMITER = разделитель ]
    [ , COLLATABLE = сортируемый ]
)

CREATE TYPE имя

Описание

Команда CREATE TYPE регистрирует новый тип данных для использования в текущей базе данных. Пользователь, который создал тип, становится его владельцем.

Если задано имя схемы, то тип будет создан в указанной схеме. В противном случае он будет создан в текущей схеме. Имя типа должно отличаться от имени любого существующего типа или домена в той же схеме. (Поскольку таблицы связаны с типами данных, имя типа также должно отличаться от имени любой существующей таблицы в той же схеме).

Существует пять форм команды CREATE TYPE, как показано в блоке синтаксис выше. Они создают типы: составной тип (composite type), перечисляемый тип(enum type), диапазонный тип(range type), базовый тип (base type) или тип-оболочку(shell type) . Первые четыре из них рассматриваются ниже. Тип-оболочка представляет собой заготовку для типа, который будет определен позже; он создается командой CREATE TYPE без параметров, только с указанием имени типа. Типы-оболочки необходимы в качестве прямых ссылок при создании типов-диапазонов и базовых типов, как это описано в соответствующих разделах.

Составной тип

Первая форма CREATE TYPE создает составной тип (composite type). Составной тип определяется списком имен атрибутов и их типов данных. Для атрибута может быть также указано правило сортировки, если тип данных является сортируемым. Составной тип по существу совпадает с типом строки таблицы, но использование CREATE TYPE позволяет избежать необходимости создавать таблицу, когда требуется только определить тип. Отдельный составной тип может быть полезен, например, в качестве аргумента или возвращаемого типа функции.

Чтобы создать составной тип, необходимо иметь право USAGE для всех типов его атрибутов.

Перечисляемые типы

Вторая форма CREATE TYPE создает перечисляемый тип (enum type), как описано в разделе Перечисляемые типы. Перечисляемые типы принимают список меток в кавычках, каждая из которых может иметь длину не больше NAMEDATALEN байт (64 байта в стандартной сборке QHB). (Можно создать перечислимый тип без меток, но такой тип нельзя использовать для хранения значений, пока хотя бы одна метка не будет добавлена с помощью команды ALTER TYPE).

Типы диапазона

Третья форма CREATE TYPE создает новый тип диапазона (range type), как описано в разделе Типы диапазона.

Подтип диапазона может быть любым типом со связанным классом операторов B-дерева (для определения порядка значений в диапазоне). Обычно для определения порядка используется класс операторов B-дерева по умолчанию; чтобы изменить класс оператора, укажите его имя в параметре класс_операторов_подтипа. Если подтип поддерживает сортировку, и вы хотите использовать правила сортировки отличные от заданных по умолчанию, укажите нужные правила сортировки в параметре правило_сортировки.

Необязательная каноническая_функция должна принимать один аргумент определяемого типа диапазона и возвращать значение того же типа. Эта настройка используется для преобразования значений диапазона в каноническую форму, когда это применимо. Дополнительную информацию смотрите в разделе Определение новых типов диапазона. Создание канонической_функции сложнее, так как она должна быть определена до того, как тип диапазона может быть объявлен. Для этого необходимо сначала создать тип-оболочку, который является заглушкой, не имеющей никаких свойств, кроме имени и владельца. Это делается путем выполнения команды CREATE TYPE имя, без дополнительных параметров. Затем может быть объявлена функция с использованием типа-оболочки в качестве аргумента и результата, и, наконец, тип диапазона может быть объявлен с использованием того же имени. Последнее действие автоматически заменяет тип-оболочку допустимым типом диапазона.

Необязательная функция_разницы_подтипа должна принимать в качестве аргументов два значения типа подтип и возвращать значение double precision, представляющее собой разницу между двумя первыми значениями. Хотя эта функция необязательная, с помощью нее можно кардинально увеличить эффективность индексов GiST, для столбцов с типом диапазона. Дополнительную информацию смотрите в разделе Определение новых типов диапазона.

Базовые типы

Четвертая форма CREATE TYPE создает новый базовый тип (скалярный тип). Чтобы создать новый базовый тип (base type), текущий пользователь должен быть суперпользователем. (Это ограничение сделано потому, что ошибочное определение типа может вызвать нарушения в работе сервера или даже сбой).

Параметры могут перечисляться в любом порядке, а не только в том, который показан выше, и большинство из них являются необязательными. Перед определением типа необходимо зарегистрировать две или более функций (с помощью CREATE FUNCTION). Обязательными функциями являются функция_ввода и функция_вывода, а функции функция_получения, функция_отправки, функция_модификатора_типа, функция_вывода_модификатора_типа и функция_анализа могут быть не указаны. Как правило, эти функции должны быть написаны на C/RUST или другом языке низкого уровня.

Функция_ввода преобразует внешнее текстовое представление типа во внутреннее, используемое операторами и функциями, определенными для данного типа. Функция_вывода выполняет обратное преобразование. Функция ввода может быть объявлена как принимающая один аргумент типа cstring, или как принимающая три аргумента с типами cstring, oid, integer. Первый аргумент - это вводимый текст в виде строки в стиле C, второй аргумент - собственный OID типа (за исключением типов массивов, для которых передаётся OID типа элемента), а третий - это модификатор_типа для целевого столбца, если он определен (и -1 если не определен). Функция ввода должна возвращать значение нового типа данных. Обычно функция ввода должна быть объявлена строгой(STRICT); если это не так, при получении на вход значения NULL она будет вызываться с первым параметром NULL. В этом случае функция все равно может возвращать значение NULL или вызывать ошибку. (Этот случай в основном предназначен для поддержки функций ввода доменных типов, которые не должны принимать значения NULL). Функции вывода должна быть объявлена как принимающая один аргумент нового типа данных, а возвращать должна тип cstring. Функции вывода не вызываются для значений NULL.

Необязательная функция_получения преобразует внешнее двоичное представление типа во внутреннее представление. Если эта функция не указана, тип не может участвовать в двоичном вводе. Двоичное представление должно быть выбрано так, чтобы оно было просто для преобразования во внутреннюю форму, будучи при этом достаточно переносимым. (Например, для стандартных целочисленных типов данных используют сетевой порядок байтов в качестве внешнего двоичного представления, в то время как внутреннее представление определяется порядком байтов в процессоре). Функция получения должна выполнять проверку вводимого значения, чтобы убедиться, что значение является допустимым. Функция получения может быть объявлена как принимающая один аргумент типа internal, или либо как принимающая три аргумента с типами internal, oid, integer. Первый аргумент - это указатель на буфер StringInfo, содержащий полученную байтовую строку; а остальные аргументы такие же, как и для функции ввода текста. Функция получения должна возвращать значение нового типа данных. Обычно функция получения должна быть объявлена строгой (STRICT); если это не так, при получении на вход значения NULL, она будет вызываться с первым параметром NULL. В этом случае функция может возвращать значение NULL или вызывать ошибку. (Этот случай в основном предназначен для поддержки функций ввода доменных типов, которые не должны принимать значения NULL). Точно так же, необязательная функция_отправки преобразует данные из внутреннего представления во внешнее двоичное представление. Если эта функция не указана, тип не может участвовать в двоичном выводе. Функция отправки должна быть объявлена как принимающая один аргумент нового типа данных, а возвращать тип bytea. Функции отправки не вызываются для значений NULL.

На этом этапе у вас может возникнуть вопрос, а как функции ввода и вывода могут быть объявлены принимающими или возвращающими значения нового типа, если они должны быть созданы до того, как новый тип объявлен. Ответ прост, тип сначала должен быть определен как тип-оболочка (shell type), который является заготовкой, и не имеет никаких свойств, кроме имени и владельца. Он объявляется командой CREATE TYPE имя, без дополнительных параметров. Тогда функции ввода/вывода на C/RUST могут быть определены, ссылаясь на этот пустой тип. Затем, команда CREATE TYPE с полным определением заменит тип-оболочку на полное, допустимое определение типа, после чего новый тип можно будет использовать как обычно.

Необязательные функции *функция_ввода_модификатора_типа * и *функция_вывода_модификатора_типа * необходимы, если тип поддерживает модификаторы, то есть дополнительные ограничения, связываемые с объявлением типа, такие как char(5) или numeric(30,2). QHB позволяет создавать типы, которые могут принимать одну или несколько простых констант или идентификаторов в качестве модификаторов. Однако эта информация должна быть упакована в одно неотрицательное целочисленное значение для хранения в системных каталогах. Функция_ввода_модификатора_типа получает объявленные модификаторы в виде строки cstring. Функция должна проверить значения на допустимость (и вызвать ошибку, если они неверны), и если они верны, выдать одно неотрицательное значение integer, которое будет сохранено в столбце "typmod". Модификаторы типа не будут приниматься, если функция_ввода_модификатора_типа для типа не указана. Функция_вывода_модификатора_типа преобразует внутреннее целочисленное значение typmod обратно в понятную форму для отображения пользователю. Она должна вернуть значение cstring, которое является строкой для добавления к имени типа; например функция numeric должна вернуть (30,2). Функция_вывода_модификатора_типа, может быть не указана, в этом случае сохраненное целочисленное значение typmod по умолчанию будет выведено в виде числа, заключенного в круглые скобки.

Необязательная функция_анализа выполняет сбор специфичной для типа статистики по столбцам с этим типом данных. По умолчанию команда ANALYZE попытается собрать статистику, используя операторы “равно” и “меньше, чем”, если для типа определён класс операторов B-дерева по умолчанию. Для нескалярных типов такое поведение в большинстве случаев не подходит, поэтому его можно переопределить, указав собственную функцию анализа. Функция анализа должна быть объявлена как принимающая один аргумент типа internal, и возвращающая результат boolean. Подробно API функций анализа описан в разделе src/include/commands/vacuum.h.

Хотя сведения о внутреннем представлении нового типа известны только функциям ввода-вывода и другим функциям, созданным для работы с типом, существует еще несколько свойств внутреннего представления, которые должны быть объявлены в QHB. Прежде всего, это: internallength (внутренняя длина). Если базовый тип данных фиксированной длины, то в internallength указывается эта длина в виде положительного числа, а если тип переменной длины, в internallength задаётся значение VARIABLE. (Внутри же typlen принимает значение -1). Внутреннее представление всех типов переменной длины должно начинаться с 4-байтового целого числа, задающего общую длину значения типа. (Обратите внимание, что поле длины часто кодируется, как описано в разделе TOAST; неразумно обращаться к нему напрямую).

Необязательный флаг PASSEDBYVALUE указывает, что значения создаваемого типа данных передаются по значению, а не по ссылке. Типы, передаваемые по значению, должны быть фиксированной длины, и их внутреннее представление не может быть больше размера типа Datum (4 байта на одних машинах, 8 байт на других).

Параметр выравнивание указывает как требуется выравнивать данные этого типа. Допустимые значения выравнивания по границам 1, 2, 4 или 8 байт. Обратите внимание, что типы переменной длины должны иметь выравнивание не менее 4 байт, так как они обязательно содержат своим первым компонентом int4.

Параметр хранение позволяет выбирать стратегии хранения для типов данных переменной длины. (Только вариант plain допускается для типов фиксированной длины). Вариант plain указывает, что данные этого типа всегда будут храниться внутри и не будут сжаты. Вариант extended указывает, что система сначала попытается сжать большое значение данных, и потом переместит его из строки основной таблицы, если оно и после сжатия окажется слишком большим. Вариант external позволяет переместить значение из основной таблицы, но система не будет пытаться сжать его. Вариант main разрешает сжатие, но препятствует перемещению значения из основной таблицы. (Элементы данных с этим вариантом хранения, тем не менее, могут быть перемещены из основной таблицы, если нет другого способа уместить их в строке, но предпочтение будет отдано сохранению в основной таблице, по сравнению с вариантами extended и external).

Все значения параметра storage, кроме plain, подразумевают, что функции типа данных могут принимать значения в формате toast, как описано в разделах TOAST и Использование TOAST. Такое значение просто определяет вариант хранения TOAST по умолчанию для столбцов отделяемого в TOAST типа данных; пользователи могут выбирать другие варианты для отдельных столбцов с помощью команды ALTER TABLE SET STORAGE.

Параметр тип_образец предоставляет альтернативный метод для указания основных свойств представления типа данных: скопировать их из другого существующего типа. Из указанного типа будут скопированы свойства: internallength, passedbyvalue, alignment и storage. (Можно, хотя обычно это нежелательно, переопределить некоторые из этих значений, указав их вместе с предложением LIKE) Указывать представление типа таким образом особенно удобно при низкоуровневой реализации нового типа. которая некоторым образом опирается на существующий тип.

Параметры категория и предпочитаемый могут использоваться для управления тем, какое неявное приведение будет применяться в неоднозначных ситуациях. Каждый тип данных относится к категории, обозначаемой одним символом ASCII, и каждый тип является либо “предпочтительным” либо нет в этой категории. Анализатор запроса постарается выбрать приведение к предпочтительному типу (но только из других типов в той же категории), это правило полезно при разрешении перегруженных функций или операторов. Более подробную информацию смотрите в главе PL/pgSQL. Для типов, которые не имеют неявных приведений к какому-либо другому типу или обратное, достаточно оставить значения по умолчанию. Однако для группы связанных типов, которые имеют неявные приведения, часто бывает полезно пометить их все как принадлежащие к категории и выбрать один или два “наиболее общих” типа как предпочтительные в категории. Параметр категория особенно полезен при добавлении определяемого пользователем типа в существующую встроенную категорию, такую как числовые или строковые типы. Однако также можно создавать новые полностью определяемые пользователем категории типов. В качестве имени такой категории можно выбрать любой ASCII-символ, кроме латинской заглавной буквы.

При желании пользователь может назначить столбцам с этим типом данных значение умолчанию отличное от NULL, указав его после ключевого слова DEFAULT в этой команде. (Такое значение по умолчанию может быть переопределено явным предложением DEFAULT, добавленным при создании определенного столбца).

Чтобы указать, что тип является массивом, задайте тип элементов массива с помощью ключевого слова ELEMENT. Например, чтобы определить массив 4-байтовых целых чисел (int4), задайте ELEMENT = int4. Ниже приведены дополнительные сведения о типах массивов.

Для указания разделителя, который будет использоваться между значениями во внешнем представлении массива с элементами этого типа, используется параметр delimiter. Разделителем по умолчанию является запятая (,). Обратите внимание, что разделитель связан с типом элементов массива, а не с самим типом массива.

Если необязательный логический параметр сортируемый установлен в true, определения столбцов и выражения этого типа могут содержать информацию о правилах сортировки с помощью предложения COLLATE. Как именно будут использоваться эти указания зависит от реализаций функций, работающих с типом; просто от того, что тип помечен как сортируемый эти указания не будут действовать.

Типы массивов

Каждый раз, при создании нового типа, QHB автоматически создает связанный тип массива, имя которого состоит из имени типа элемента, и знака подчеркивания перед ним. Полученное имя усекается, если это его длина превышает NAMEDATALEN байт. (Если имя, созданное таким образом, конфликтует с существующим именем типа, процесс повторяется до тех пор, пока не будет найдено непротиворечивое имя). Этот неявно созданный тип массива имеет переменную длину и использует встроенные функции ввода и вывода array_in и array_out. Тип массива отражает любые изменения владельца или схемы его типа элемента и удаляется, если удаляется тип элемента.

Вы можете задать вопрос, зачем существует параметр ELEMENT, если система создает правильный тип массива автоматически. Единственный случай, когда полезно использовать ELEMENT это когда вы создаете тип фиксированной длины, который оказывается массивом нескольких одинаковых элементов, и вы хотите, чтобы эти элементы были доступны при обращению по индексу, в дополнение к любым операциям, которые вы планируете реализовать для типа в целом. Например, тип point представляется в виде двух чисел с плавающей запятой, доступ к которым можно получить с помощью point[0] и point[1]. Обратите внимание, что эта функция работает только для типов фиксированной длины, внутренняя форма которых представляет собой точную последовательность одинаковых полей фиксированной длины. Тип массива переменной длины должен иметь обобщенное внутреннее представление, с которым умеют работать array_in и array_out. По историческим причинам (это определённо некорректно, слишком поздно это менять), индексы в массивах фиксированной длины начинаются с нуля, а не с единицы, как для массивов переменной длины.

Параметры

имя

Имя, при необходимости дополненное схемой, создаваемого типа.

имя_атрибута

Имя атрибута (столбца) для составного типа.

тип_данных

Имя существующего типа данных, который должен стать столбцом составного типа.

правило_сортировки

Имя существующего правил сортировки, которое должно быть связано со столбцом составного или диапазонного типа.

метка

Строковый литерал, представляющий текстовую метку, связанную с одним значений перечисляемого типа.

подтип

Имя типа элемента, для которого тип диапазона будет представлять множество значений.

класс_оператора_подтипа

Имя класса операторов B-дерева для подтипа.

каноническая_функция

Имя функции канонизации для типа диапазона.

функция_разницы_подтипа

Имя функции разницы для данного подтипа.

функция_ввода

Имя функции, преобразующей данные из внешней текстовой формы (представления) типа в его внутреннюю форму.

функция_вывода

Имя функции, преобразующей данные из внутренней формы (представления) типа во внешнюю текстовую форму.

функция_получения

Имя функции, преобразующей данные из внешней двоичной формы (представления) типа в его внутреннюю форму (представление).

функция_отправки

Имя функции, преобразующей данные из внутренней формы типа во внешнюю двоичную форму (представление) типа.

функция_ввода_модификатора_типа

Имя функции, преобразующей массив модификаторов для данного типа во внутреннюю форму.

функция_вывода_модификатора_типа

Имя функции, преобразующей внутреннюю форму модификатора(модификаторов) типа во внешнюю текстовую форму(представление).

функция_анализа

Имя функции, выполняющей статистический анализ для данного типа данных.

внутр_длина

Числовая константа, указывающая длину внутреннего представления нового типа в байтах. По умолчанию предполагается, что тип имеет переменную длину.

выравнивание

Требуемое выравнивание для типа данных. Допустимые значения: char, int2, int4 или double; значение по умолчанию - int4.

хранение

Стратегия хранения для данного типа данных. Допустимые значения: plain, external, extended или main; значение по умолчанию - plain.

тип_образец

Имя существующего типа данных, от которого получит свойства представления новый тип. Значения следующих параметров этого типа будут скопированы: internallength, passedbyvalue, alignment, и storage, если только они не будут переопределены явными указаниями в команде CREATE TYPE.

категория

Код категории (один символ ASCII) для этого типа. Значение по умолчанию: 'U', что означает пользовательский тип, «User-defined». Другие коды категорий можно найти в Таблица кодов категорий. Вы также можете выбрать другие символы ASCII для создания пользовательских категорий.

предпочитаемый

Если значение равно true, то этот тип является предпочтительным типом в своей категории типов. Значение по умолчанию равно false. Будьте очень осторожны при создании нового предпочтительного типа в рамках существующей категории типов, так как это может вызвать неожиданные изменения в поведении.

по_умолчанию

Значение по умолчанию для данного типа данных. Если этот параметр не задан, будет использовано значение по умолчанию, равное null.

элемент

Указывает что создаваемый тип является массивом; это параметр определяет тип элементов массива.

разделитель

Символ-разделитель, используемый между значениями в массивах, образованных из значений создаваемого типа.

сортируемый

Если значение равно true, в операциях с этим типом может учитываться информация о параметрах сортировки. Значение по умолчанию равно false.

Примечания

Поскольку нет никаких ограничений на использование типа данных после его создания, создание базового типа или типа диапазона равносильно предоставлению права на выполнение функций, упомянутых в определении типа. Это обычно не является проблемой для функций, которые используются в определении типа. Но стоит подумать дважды, прежде чем создавать тип, преобразование которого во внешнюю форму и обратно будет использовать «секретную» информацию.

Рекомендуется избегать использования имен типов и таблиц, начинающихся с символа подчеркивания(_). Хотя сервер сможет сгенерировать другое имя, чтобы избежать конфликтов с пользовательскими именами, все еще существует риск возникновения путаницы, особенно со старыми клиентскими приложениями, которые могут предположить, что имена типов, начинающиеся с подчеркивания, относится к типу массива.

Примеры

В этом примере создается составной тип и затем используется в определении функции:

CREATE TYPE compfoo AS (f1 int, f2 text);

CREATE FUNCTION getfoo() RETURNS SETOF compfoo AS $$
    SELECT fooid, fooname FROM foo
$$ LANGUAGE SQL;

В этом примере создается перечисляемый тип и затем используется в определении таблицы:

CREATE TYPE bug_status AS ENUM ('new', 'open', 'closed');

CREATE TABLE bug (
    id serial,
    description text,
    status bug_status
);

В этом примере создается тип диапазона:

CREATE TYPE float8_range AS RANGE (subtype = float8, subtype_diff = float8mi);

В этом примере создается базовый тип данных box, а затем используется в определении таблицы:

CREATE TYPE box;

CREATE FUNCTION my_box_in_function(cstring) RETURNS box AS ... ;
CREATE FUNCTION my_box_out_function(box) RETURNS cstring AS ... ;

CREATE TYPE box (
    INTERNALLENGTH = 16,
    INPUT = my_box_in_function,
    OUTPUT = my_box_out_function
);

CREATE TABLE myboxes (
    id integer,
    description box
);

Если бы внутренняя структура box была массивом из четырех элементов float4, можно было бы вместо этого использовать:

CREATE TYPE box (
    INTERNALLENGTH = 16,
    INPUT = my_box_in_function,
    OUTPUT = my_box_out_function,
    ELEMENT = float4
);

В этом случае к числам, составляющим значение этого типа, можно было бы обращаться по индексу. В остальном поведение этого типа будет таким же.

В этом примере создается тип большого объекта и используется в определении таблицы:

CREATE TYPE bigobj (
    INPUT = lo_filein, OUTPUT = lo_fileout,
    INTERNALLENGTH = VARIABLE
);
CREATE TABLE big_objs (
    id integer,
    obj bigobj
);

Дополнительные примеры, включая соответствующие функции ввода и вывода, приведены в разделе Пользовательские типы.

Совместимость

Первая форма команды CREATE TYPE, которая создает составной тип, соответствует стандарту SQL. Другие формы являются расширением QHB. Команда CREATE TYPE в стандарте SQL также имеет другие формы, которые не реализованы в QHB.

Возможность создания составного типа без атрибутов это специфическое для QHB отклонение от стандарта (аналогично CREATE TABLE).

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

ALTER TYPE, CREATE DOMAIN, CREATE FUNCTION, DROP TYPE


CREATE USER

CREATE USER - определить новую роль базы данных

Синтаксис

CREATE USER имя [ [ WITH ] параметр [ ... ] ]

Где параметр может быть:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT предел_подключений
    | [ ENCRYPTED ] PASSWORD 'пароль' | PASSWORD NULL
    | VALID UNTIL 'дата_время'
    | IN ROLE имя_роли [, ...]
    | IN GROUP имя_роли [, ...]
    | ROLE имя_роли [, ...]
    | ADMIN имя_роли [, ...]
    | USER имя_роли [, ...]
    | SYSID uid

Описание

CREATE USER является псевдонимом для CREATE ROLE. Единственное отличие заключается в том, что в команде CREATE USER по умолчанию подразумевается параметр LOGIN, в то время как в команде CREATE ROLE по умолчанию подразумевается параметр NOLOGIN.

Совместимость

Инструкция CREATE USER является расширением QHB. Стандарт SQL оставляет определение пользователей для реализации.

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

CREATE ROLE


CREATE USER MAPPING

CREATE USER MAPPING - создать новое сопоставление пользователя со сторонним сервером

Синтаксис

CREATE USER MAPPING [ IF NOT EXISTS ] FOR { имя_пользователя | USER | CURRENT_USER | PUBLIC }
    SERVER имя_сервера
    [ OPTIONS ( параметр 'значение' [ , ... ] ) ]

Описание

CREATE USER MAPPING определяет сопоставление пользователя со сторонним сервером. Пользовательское сопоставление обычно содержит информацию о соединении, которую обёртка сторонних данных будет использовать вместе с информацией, инкапсулированной сторонним сервером (для доступа к внешнему ресурсу данных).

Владелец стороннего сервера может создавать сопоставления для любых пользователей на этом сервере. Кроме того, пользователь может создавать сопоставление пользователей для своего собственного имени (если он наделён правом USAGE на данном сервере).

Параметры

IF NOT EXISTS

Не выдавать ошибку, если сопоставление данного пользователя с данным сторонним сервером уже существует. В этом случае выдается соответствующее уведомление. Обратите внимание, что нет никакой гарантии, что существующее пользовательское сопоставление хоть чем-то похоже на то, которое могло бы быть создано.

имя_пользователя

Имя существующего пользователя, для которого создаётся сопоставление на стороннем сервере. Ключевые слова CURRENT_USER и USER обозначают имя текущего пользователя. Если указывается PUBLIC, то создается так называемое общедоступное сопоставление, которое используется, когда не применяется никакое пользовательское сопоставление.

имя_сервера

Имя существующего сервера, для которого создаётся сопоставление пользователя.

OPTIONS ( параметр 'значение' [, ... ] )

В этом предложении задаются параметры сопоставления. Эти параметры обычно определяют фактическое имя и пароль пользователя на целевом сервере. Имена параметров должны быть уникальными. Набор допустимых имён и значений параметров определяется обёрткой сторонних данных внешнего сервера.

Примеры

Создание пользовательского сопоставления для пользователя bob, сервер foo:

CREATE USER MAPPING FOR bob SERVER foo OPTIONS (user 'bob', password 'secret');

Совместимость

CREATE USER MAPPING соответствует стандарту ISO/IEC 9075-9 (SQL/MED).

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

ALTER USER MAPPING, DROP USER MAPPING, CREATE FOREIGN DATA WRAPPER, CREATE SERVER


CREATE VIEW

CREATE VIEW - определить новое представление

Синтаксис

CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW имя [ ( имя_столбца [, ...] ) ]
    [ WITH ( имя_параметра_представления [= значение_параметра_представления] [, ... ] ) ]
    AS запрос
    [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

Описание

Команда CREATE VIEW определяет представление запроса. Так как это представление физически не материализуется, то указанный запрос будет выполняться при каждом обращении к представлению.

Команда CREATE OR REPLACE VIEW действует аналогичным образом, но если представление с тем же именем уже существует, то оно будет заменено. Новый запрос должен выдавать те же столбцы, что и существующий запрос представления (то есть те же имена столбцов в том же порядке и с теми же типами данных), но он также может добавлять дополнительные столбцы в конец списка. Вычисления, в результате которых формируются столбцы представления, могут быть совершенно другими.

Если задано имя схемы (см. Схемы) (например, CREATE VIEW myschema.myview ...), то представление создается в указанной схеме, иначе - в текущей. Временные представления существуют в специальной схеме, так что при создании таких представлений имя схемы задать нельзя. Имя представления должно отличаться от имён других представлений, таблиц, последовательностей, индексов или сторонних таблиц в этой схеме.

Параметры

TEMPORARY или TEMP

Если этот параметр указан, то представление создается как временное представление (временные представления автоматически удаляются в конце сеанса). Существующее постоянное представление с тем же именем не будет видно в текущем сеансе, пока существует временное, однако к нему можно обратиться, дополнив имя указанием схемы.

Если в определении представления задействованы временные таблицы, то такое представление создаётся как временное (вне зависимости от явного указания TEMPORARY).

RECURSIVE

Создает рекурсивное представление. Синтаксис

CREATE RECURSIVE VIEW [ схема . ] имя_представления (имена_столбцов)
    AS SELECT ...;

равнозначен

CREATE VIEW [ схема . ] имя_представления
    AS WITH RECURSIVE имя_представления (имена_столбцов)
    AS (SELECT ...) SELECT имена_столбцов 
    FROM имя_представления;

Для рекурсивного представления обязательно должен задаваться список с именами столбцов.

имя

Имя создаваемого представления (возможно, дополненное схемой).

имя_столбца

Необязательный список имён, назначаемых столбцам представления. Если отсутствует, имена столбцов формируются из результатов запроса.

WITH ( имя_параметра_представления \[= значение_параметра_представления\] \[, ... \] )

В этом предложении указываются необязательные параметры для представления. Поддерживаются следующие параметры:

check_option (string)

Этот параметр может принимать значение local (локально) или cascaded (каскадно) и равнозначен указанию WITH [ CASCADED | LOCAL ] CHECK OPTION (см. ниже). На существующих представлениях этот параметр можно изменить с помощью команды ALTER VIEW.

security_barrier (boolean)

Этот параметр следует использовать, если представление должно обеспечивать защиту на уровне строк. За дополнительными подробностями обратитесь к разделу Политики безопасности строк.

запрос

Команда SELECT или VALUES, которая предоставляет столбцы и строки представления.

WITH [ CASCADED | LOCAL ] CHECK OPTION

Этот параметр управляет поведением автоматически обновляемых представлений. Если этот параметр указан, то команды INSERT и UPDATE на представлении будут проверяться, удовлетворяют ли новые строки условию, определяющему представление (то есть, проверяется, будут ли новые строки видны через это представление). Если это не так, то обновление будет отклонено. Если параметр CHECK OPTION не указан, то командам INSERT и UPDATE в представлении разрешается создавать строки, которые не будут видны через это представление. Поддерживаются следующие варианты проверки:

LOCAL

Новые строки проверяются только на соответствие условиям, определенным непосредственно в самом представлении. Любые условия, определенные на нижележащих базовых представлениях, не проверяются (если только в них нет указания CHECK OPTION).

CASCADED

Новые строки проверяются на соответствие условиям представления и всех нижележащих базовых представлений. Если указано CHECK OPTION, а LOCAL и CASCADED опущены, то предполагается значение CASCADED.

CHECK OPTION не допускается использовать с представлением RECURSIVE.

Обратите внимание, что CHECK OPTION поддерживается только для автоматически изменяемых представлений, не имеющих триггеров INSTEAD OF или правила INSTEAD. Если автоматически изменяемое представление определено поверх базового представления с триггерами INSTEAD OF, то параметр LOCAL CHECK OPTION может использоваться для проверки ограничений автоматически изменяемого представления, хотя условия базового представления с триггером INSTEAD OF проверяться не будут (каскадная опция проверки не будет распространяться ниже к представлению модифицируемому триггером, и любые параметры проверки, определённые для такого представления, будут просто игнорироваться). Если для представления или любого из его базовых отношений определено правило INSTEAD (которое приводит к перезаписи команды INSERT или UPDATE), то все параметры проверки в перезаписанном запросе будут проигнорированы, в том числе проверки из автоматически обновляемых представлений, определенных поверх отношения с правилом INSTEAD.

Примечания

Для удаления представлений применяется оператор DROP VIEW.

Позаботьтесь о том, чтобы столбцы представления получили желаемые имена и типы. Например, такая команда:

CREATE VIEW vista AS SELECT 'Hello World';

плоха тем, что именем столбца по умолчанию будет ?column?;, а типом данных - text; а это может быть совсем не то, что вы хотели. Лучше записывать строковую константу в результате представления примерно так:

CREATE VIEW vista AS SELECT text 'Hello World' AS hello;

Доступ к таблицам, задействованным в представлении, определяется правами владельца представления. В некоторых случаях это позволяет организовать безопасный, но ограниченный доступ к нижележащим таблицам. Однако учтите, что не все представления могут быть защищёнными (за подробностями обратитесь к Система правил QHB). Функции, вызываемые в представлении, выполняются так, как будто они вызываются непосредственно из запроса, обращающегося к представлению. Поэтому пользователь представления должен иметь все права, необходимые для вызова всех функций, задействованных в представлении.

При выполнении CREATE OR REPLACE VIEW для существующего представления изменяется только правило SELECT, определяющее представление. Другие свойства представления, включая владельца, права и правила, кроме SELECT, остаются неизменными. Чтобы изменить определение представления, необходимо быть его владельцем (или членом роли-владельца).

Изменяемые представления

Простые представления становятся изменяемыми автоматически: система позволит выполнять команды INSERT , UPDATE и DELETE с таким представлением так же, как и с обычной таблицей. Представление будет автоматически изменяемым, если оно удовлетворяет одновременно всем следующим условиям:

  • Список FROM в запросе, определяющем представление, должен содержать ровно один элемент, и это должна быть таблица или другое изменяемое представление.

  • Определение представления не должно содержать WITH, DISTINCT, GROUP BY, HAVING, LIMIT, и OFFSET BY на верхнем уровне запроса.

  • Определение представления не должно содержать операций с множествами (UNION, INTERSECT или EXCEPT) на верхнем уровне запроса.

  • Список выборки в запросе не должен содержать агрегатные и оконные функции, а также функции, возвращающие множества.

Автоматически обновляемое представление может содержать как изменяемые, так и неизменяемые столбцы. Столбец является изменяемым, если это простая ссылка на изменяемый столбец нижележащего базового отношения; в противном случае этот столбец будет доступен только для чтения, и если команда INSERT или UPDATE попытается записать значение в него, то возникнет ошибка.

Если представление автоматически изменяемое, то система будет преобразовывать обращающиеся к нему операторы INSERT, UPDATE и DELETE в соответствующие операторы, обращающиеся к нижележащему базовому отношению. При этом в полной мере поддерживаются операторы INSERT с пареметром ON CONFLICT UPDATE.

Если автоматически изменяемое представление содержит условие WHERE, то это условие ограничивает набор строк, которые могут быть изменены командой UPDATE и удалены командой DELETE в этом представлении. Однако UPDATE может изменить строку так, что она больше не будет соответствовать условию WHERE и, как следствие, больше не будет видна через представление. Команда INSERT подобным образом может вставить в базовое отношение строки, которые не удовлетворят условию WHERE и поэтому не будут видны через представление (ON CONFLICT UPDATE может подобным образом воздействовать на существующую строку, не видимую через представление). Чтобы запретить командам INSERT и UPDATE создавать такие строки, которые не видны через представление, можно воспользоваться указанием CHECK OPTION.

Если автоматически изменяемое представление имеет свойство security_barrier (барьер безопасности), то все условия WHERE этого представления (и все условия с герметичными операторами (LEAKPROOF)) будут всегда вычисляться перед условиями, добавленными пользователем представления. За подробностями обратитесь к Система правил QHB. Заметьте, что по этой причине строки, которые в итоге не были выданы (потому что не прошли проверку в пользовательском условии WHERE), могут всё же остаться заблокированными. Чтобы определить, какие условия применяются на уровне отношения (и, как следствие, избавляют часть строк от блокировки), можно воспользоваться командой EXPLAIN.

Более сложные представления, не удовлетворяющие этим условиям, по умолчанию доступны только для чтения: система не позволит выполнить операции добавления, изменения или удаления строк в таком представлении. Создать эффект изменяемого представления для них можно, определив триггеры INSTEAD OF, которые будут преобразовывать запросы на изменение данных в соответствующие действия с другими таблицами. За дополнительными сведениями обратитесь к CREATE TRIGGER. Так же есть возможность создавать правила (см. CREATE RULE), но на практике триггеры проще для понимания и применения.

Учтите, что пользователь, выполняющий операции добавления, изменения или удаления данных в представлении, должен иметь соответствующие права для этого представления. Кроме того, владелец представления должен иметь сопутствующие права в нижележащих базовых отношениях, хотя пользователь, выполняющий эти операции, может этих прав не иметь (см. Система правил QHB).

Примеры

Создание представления, содержащего все комедийные фильмы:

CREATE VIEW comedies AS
    SELECT *
    FROM films
    WHERE kind = 'Comedy';

Эта команда создаст представление со столбцами, которые содержались в таблице film в момент выполнения команды. Хотя при создании представления было указано *, столбцы, добавляемые в таблицу позже, не будут являться частью представления.

Создание представления с указанием LOCAL CHECK OPTION:

CREATE VIEW universal_comedies AS
    SELECT *
    FROM comedies
    WHERE classification = 'U'
    WITH LOCAL CHECK OPTION;

Эта команда создаст представление на базе представления comedies, выдающее только комедии (kind = 'Comedy') универсальной возрастной категории classification = 'U'. Любая попытка выполнить в представлении INSERT или UPDATE со строкой, не удовлетворяющей условию classification = 'U', будет отвергнута, но ограничение по полю kind (тип фильма) проверяться не будет.

Создание представления с указанием CASCADED CHECK OPTION:

CREATE VIEW pg_comedies AS
    SELECT *
    FROM comedies
    WHERE classification = 'PG'
    WITH CASCADED CHECK OPTION;

Это представление будет проверять, удовлетворяют ли новые строки обоим условиям: по столбцу kind и по столбцу classification.

Создание представления с изменяемыми и неизменяемыми столбцами:

CREATE VIEW comedies AS
    SELECT f.*,
           country_code_to_name(f.country_code) AS country,
           (SELECT avg(r.rating)
            FROM user_ratings r
            WHERE r.film_id = f.id) AS avg_rating
    FROM films f
    WHERE f.kind = 'Comedy';

Это представление будет поддерживать операции INSERT, UPDATE и DELETE. Изменяемыми будут все столбцы из таблицы films, тогда как вычисляемые столбцы country и avg_rating будут доступны только для чтения.

Создание рекурсивного представления, состоящего из чисел от 1 до 100:

CREATE RECURSIVE VIEW public.nums_1_100 (n) AS
    VALUES (1)
UNION ALL
    SELECT n+1 FROM nums_1_100 WHERE n < 100;

Заметьте, что несмотря на то, что имя рекурсивного представления дополнено схемой в этой команде CREATE, внутренняя ссылка представления на себя же схемой не дополняется. Это связано с тем, что имя неявно создаваемого общего табличного выражения (ОТВ) не может дополняться схемой.

Совместимость

Команда CREATE OR REPLACE VIEW - языковое расширение QHB. Так же расширением является предложение WITH ( ... ) и концепция временного представления.

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

ALTER VIEW, DROP VIEW, CREATE MATERIALIZED VIEW


DEALLOCATE

DEALLOCATE -освободить подготовленный оператор

Синтаксис

DEALLOCATE [ PREPARE ] { имя | ALL }

Описание

Функция DEALLOCATE используется для удаления ранее подготовленной инструкции SQL. Если вы явно не освобождаете подготовленный оператор, он освобождается по окончании сеанса.

Дополнительные сведения о подготовленных инструкциях см. PREPARE .

Параметры

PREPARE

Это ключевое слово игнорируется.

имя

Имя подготовленного оператора для освобождения.

ALL

Освобождает все подготовленные операторы.

Совместимость

Стандарт SQL включает в себя оператор DEALLOCATE, но он предназначен только для использования во встраиваемом SQL.

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

EXECUTE, PREPARE


DECLARE

DECLARE-определение курсора

Синтаксис

DECLARE имя [ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ]
    CURSOR [ { WITH | WITHOUT } HOLD ] FOR запрос

Описание

DECLARE позволяет пользователю создавать курсоры, которые могут использоваться для извлечения небольшого количества строк за один раз из большего запроса. После создания курсора строки извлекаются из него с помощью команды FETCH.

Замечание
Эта страница описывает использование курсоров на уровне команд SQL. Если вы пытаетесь использовать курсоры внутри функции PL/pgSQL, правила будут другими — см. раздел Структура PL/pgSQL.

Параметры

имя

Имя создаваемого курсора.

BINARY

Курсор будет возвращать данные в двоичном, а не в текстовом формате.

INSENSITIVE

Указывает, что данные, извлеченные из курсора, не должны быть затронуты обновлениями таблиц, лежащих в основе курсора, которые происходят после его создания. В QHB это поведение по умолчанию; поэтому это ключевое слово не имеет никакого эффекта и принимается только для совместимости со стандартом SQL.

SCROLL
NO SCROLL

SCROLL указывает, что курсор можно использовать для получения строк не последовательно (например, назад). В зависимости от сложности плана выполнения запроса, указание SCROLL может привести к снижению производительности во время выполнения запроса. NO SCROLL указывает, что курсор не может быть использован для получения строк неупорядоченным образом. По умолчанию прокрутка в некоторых случаях разрешается; но это не равнозначно эффекту указания SCROLL. Смотрите раздел Курсоры для получения дополнительной информации.

WITH HOLD
WITHOUT HOLD

WITH HOLD указывает, что курсор можно продолжать использоваться после успешной фиксации транзакции, которая его создала. WITHOUT HOLD указывает, что курсор не может использоваться вне транзакции, которая его создала. Если не указано ни WITHOUT HOLD, ни WITH HOLD, WITHOUT HOLD является значением по умолчанию.

запрос

Команда SELECT или VALUES, которые предоставляют строки, возвращаемые курсором.

Ключевые слова BINARY, INSENSITIVE и SCROLL могут быть указаны в любом порядке.

Примечания

Обычные курсоры возвращают данные в текстовом формате, в каком их выдаёт SELECT. Опция BINARY указывает, что курсор должен возвращать данные в двоичном формате. Это упрощает операции преобразования данных для сервера и клиента, за счет дополнительных усилий программиста по работе с зависимыми от платформы двоичными форматами данных. Например, если запрос возвращает значение единица из целочисленного столбца, вы получите строку содержащую 1, в то время как с двоичным курсором вы получите 4-байтовое поле, содержащее внутреннее представление значения (с сетевым порядком байтов).

Двоичные курсоры следует использовать осторожно. Многие приложения, включая qsql, не готовы обрабатывать двоичные курсоры и ожидают, что данные вернутся в текстовом формате.

Замечание
Когда клиентское приложение использует протокол 'расширенный запрос' для выполнения команды FETCH, сообщение протокола Bind указывается, следует ли извлекать данные в текстовом или двоичном формате. Этот выбор переопределяет свойство курсора, заданное в его объявлении. Таким образом, понятие двоичного курсора как такового устарело при использовании расширенного протокола запросов — любой курсор может рассматриваться как текстовый или двоичный.

Если в команде объявления курсора не указано WITH HOLD, созданный этой командой курсор, может использоваться только в рамках текущей транзакции. Таким образом, оператор DECLARE без WITH HOLD бесполезен вне блока транзакций: курсор сохранится только до завершения оператора. Поэтому QHB сообщает об ошибке, если такая команда используется вне блока транзакций. Используйте BEGIN и COMMIT (или ROLLBACK ) для определения блока транзакций.

Если в объявлении курсора WITH HOLD указывается и транзакция, которая создала курсор успешно фиксируется, курсор может продолжать быть доступен для последующих транзакций в том же сеансе. (Но если создание транзакции прерывается, курсор удаляется). Курсор, со свойством WITH HOLD закрывается, когда явно задается команда CLOSE, или по завершении сеанса. В текущей реализации строки, представленные удерживаемым курсором, копируются во временный файл или область памяти, чтобы они оставались доступными для последующих транзакций.

Свойство WITH HOLD может быть указано, только когда запрос не включает в себя указаний FOR UPDATE и FOR SHARE.

Опция SCROLL должна быть указана при определении курсора, который будет использоваться выборки данных в обратном порядке. Это требуется стандартом SQL. Однако для совместимости с более ранними версиями разрешается выборка в обратном направлении и без указания SCROLL, если план запроса курсора достаточно прост, и никакие дополнительные накладные расходы не требуются для его поддержки. Однако разработчикам приложений рекомендуется не полагаться на использование выборки в обратном направлении из курсора, который не был создан с помощью SCROLL. С указанием NO SCROLL прокрутка назад запрещается в любом случае..

Выборка в обратном направлении также запрещается, если запрос включает в себя указания FOR UPDATE и FOR SHARE; в этом случае указание SCROLL не принимается.

Внимание!!!
Прокручиваемые и удерживаемые (WITH HOLD) курсоры могут давать неожиданные результаты, если они вызывают любые изменчивые функции (см. раздел Категории волатильности функций). Когда ранее извлеченная строка повторно выбирается, функции могут быть повторно вызываны, возможно, приводя к результатам, отличным от полученных в первый раз. Одним из обходных путей для таких случаев является объявление курсора с указанием WITH HOLD и зафиксировать транзакцию перед чтением любых строк из него. В этом случае весь набор данных курсора будет материализован во временном хранилище, так что изменчивые функции будут выполнены для каждой строки лишь единожды.
Если запрос в определении курсора включает указания FOR UPDATE или FOR SHARE, возвращаемые курсором строки блокируются в момент первой выборки, так же, как это происходит при выполнении SELECT с этими указаниями. Кроме того, возвращаемые строки будут самыми актуальными версиями; поэтому эти параметры обеспечивают эквивалент того, что стандарт SQL называет “чувствительным курсором”. (Указать INSENSITIVE для курсора с запросом FOR UPDATE или FOR SHARE нельзя).

Внимание!!!
Обычно рекомендуется использовать FOR UPDATE, если курсор предназначен для использования в командах UPDATE ... WHERE CURRENT OF и DELETE ... WHERE CURRENT OF. Указание FOR UPDATE запрещает другим сеансам изменять строки между моментом их извлечения и моментом их обновления. Без FOR UPDATE, последующая команда с WHERE CURRENT OF не сработает, если строка была изменена с момента создания курсора.
Еще одна причина использовать FOR UPDATE в том, что без него при выполнении последующих команд с WHERE CURRENT OF может произойти сбой, если запрос курсора не удовлетворяет оговоренному в стандарте SQL критерию «простой изменяемости» (в частности, курсор должен ссылаться только на одну таблицу и не должен использовать группировку и сортировку (ORDER BY)). Курсоры, не удовлетворяющие этому критерию, могут работать либо не работать, в зависимости от конкретного выбранного плана; так что в худшем случае приложение может работать в тестовой, но сломается в производственной среде. С указанием FOR UPDATE курсор гарантированно будет изменяемым.
Главная причина не использовать FOR UPDATE вместе с WHERE CURRENT OF
если требуется получить прокручиваемый курсор или курсор, не отражающий последующие изменения (то есть, продолжающий показывать прежние данные). Если это действительно необходимо, обязательно учтите при реализации приведённые выше замечания.
Стандарт SQL содержит только положения для курсоров во встраиваемого SQL. Сервер QHB не реализует инструкцию OPEN для курсоров; курсор считается открытым, когда он объявлен. Однако ECPG, встроенный препроцессор SQL для QHB, поддерживает стандартные соглашения о курсорах SQL, в том числе включающие инструкции DECLARE и OPEN.
Вы можете просмотреть все доступные курсоры, запросив системное представление pg_cursors.

Примеры

Чтобы объявить курсор:

DECLARE liahona CURSOR FOR SELECT * FROM films;

Дополнительные примеры использования курсора см. В разделе FETCH.

Совместимость

Стандарт SQL говорит, что чувствительность курсоров к параллельному обновлению нижележащих данных по умолчанию определяется реализацией. В QHB курсоры нечувствительны по умолчанию и могут быть сделаны чувствительными путем указания FOR UPDATE. Другие СУБД могут работать по-разному.

Стандарт SQL позволяет использовать курсоры только во встраиваемом SQL и модулях. QHB позволяет использовать курсоры в интерактивном режиме.

Бинарные курсоры являются расширением QHB.

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

CLOSE, FETCH, MOVE


DELETE

DELETE -удаление строк таблицы

Синтаксис

[ WITH [ RECURSIVE ] запрос_WITH [, ...] ]
DELETE FROM [ ONLY ] имя_таблицы [ * ] [ [ AS ] псевдоним ]
    [ USING элемент_FROM [, ...] ]
    [ WHERE условие | WHERE CURRENT OF имя_курсора ]
    [ RETURNING * | выражение_результата [ [ AS ] имя_результата ] [, ...] ]

Описание

Команда DELETE удаляет строки из указанной таблицы, удовлетворяющие требованиям предложения WHERE. Если предложение WHERE отсутствует, результат будет заключаться в удалении всех строк таблицы. Итогом является действительная, но пустая таблица.

Совет
Команда TRUNCATE обеспечивает более быстрый механизм для удаления всех строк из таблицы.

Существует два способа удаления строк в таблице с помощью информации, содержащейся в других таблицах базы данных: с помощью подзапросов или путем указания дополнительных таблиц в предложении USING. Какой метод является более подходящим, зависит от конкретных обстоятельств.

Предложение RETURNING указывает, что команда DELETE должна вычислить и возвратить значения для каждой фактически удалённой строки. Вычислить в нём можно любое выражение со столбцами целевой таблицы и/или столбцами других таблиц, упомянутых в USING. Список RETURNING имеет тот же синтаксис, что и список результатов SELECT.

Чтобы удалять данные из таблицы, необходимо иметь право DELETE для неё, а также право SELECT для всех таблиц, перечисленных в предложении USING, и таблиц, данные которых считываются в условии.

Параметры

запрос_WITH

Предложение WITH позволяет указать один или несколько вложенных запросов, на которые можно ссылаться по имени в запросе на удаление. Смотрите Запросы WITH и SELECT для получения дополнительной информации.

имя_таблицы

Имя, которое может быть дополнено схемой, таблицы, из которой необходимо удалить строки. Если ONLY указывается перед именем таблицы, совпадающие строки удаляются только из указанной таблицы. Если ONLY не указано, совпадающие строки также удаляются из всех таблиц, наследуемых от указанной таблицы. При желании, после имени таблицы можно указать *, чтобы явно обозначить, что операция затрагивает все дочерние таблицы.

псевдоним

Альтернативное имя целевой таблицы. Когда предоставляется псевдоним, он полностью скрывает фактическое имя таблицы. Например, в запросе DELETE FROM foo AS f, остальная часть инструкции DELETE должна ссылаться на эту таблицу по имени f, а не foo.

элемент_FROM

Табличное выражение, позволяющее добавить в условие WHERE столбцы из других таблиц. В этом выражении используется тот же синтаксис, что и в предложении Предложение FROM оператора SELECT; например, в нём можно определить псевдоним для таблицы. Повторять в нём имя целевой таблицы нужно, только если требуется определить замкнутое соединение ( в этом случае для данного имени должен определяться псевдоним).

условие

Выражение, которое возвращает значение типа boolean. Только строки, для которых это выражение возвращает истину будут удалены.

имя_курсора

Имя курсора который будет использоваться в условии WHERE CURRENT OF. Строка, подлежащая удалению, является самой последней, извлеченной из этого курсора. Курсор должен быть образован запросом без группировки по целевой таблице команды DELETE. Обратите внимание, что WHERE CURRENT OF не может быть указано вместе с логическим условием. За дополнительной информацией об использовании курсоров с WHERE CURRENT OF обратитесь к описанию команды DECLARE.

выражение_результата

Выражение, вычисляемое и возвращаемое командой DELETE после удаления каждой строки. Выражение может использовать любые имена столбцов таблицы имя_таблицы или таблиц, перечисленных в списке USING. Чтобы получить все столбцы, достаточно написать *.

имя_результата

Имя, используемое для возвращаемого столбца.

Выводимая информация

После успешного завершения команда DELETE возвращает метку команды в виде

DELETE число

Где число - количество удаленных строк. Обратите внимание, что это число может быть меньше, чем число строк, которые соответствуют условию если удаления были подавлены триггером BEFORE DELETE. Если число равно 0, ни одна строка не была удалена запросом (это не считается ошибкой).

Если команда DELETE содержит предложение RETURNING, результат будет похож на результат оператора SELECT, (с теми же столбцами и значениями, что содержатся в списке RETURNING), полученный для строк, удалённых этой командой.

Примечания

QHB позволяет ссылаться на столбцы других таблиц в WHERE, когда эти таблицы перечисляются в предложении USING. Например, чтобы удалить все фильмы, произведенные данным производителем, можно сделать:

DELETE FROM films USING producers
  WHERE producer_id = producers.id AND producers.name = 'foo';

По существу происходит соединение таблиц films и producers, причем все успешно включённые в соединение строки в films помечаются для удаления. Этот синтаксис не является стандартным. Более стандартный способ сделать это:

DELETE FROM films
  WHERE producer_id IN (SELECT id FROM producers WHERE name = 'foo');

В некоторых случаях запрос в стиле соединения легче написать и он может выполняться быстрее, чем запрос в стиле вложенного запроса.

Примеры

Удаление всех фильмов, кроме мюзиклов:

DELETE FROM films WHERE kind <> 'Musical';

Очистка таблицы films:

DELETE FROM films;

Удаление завершённых задач с получением всех данных удалённых строк:

DELETE FROM tasks WHERE status = 'DONE' RETURNING *;

Удаление из tasks строки, на которой в текущий момент располагается курсор c_tasks:

DELETE FROM tasks WHERE CURRENT OF c_tasks;

Совместимость

Эта команда соответствует стандарту SQL, за исключением того, что предложения USING и RETURNING являются расширениями QHB, так же как и возможность использования использовать WITH с DELETE.

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

TRUNCATE


DISCARD

DISCARD - очистить состояние сеанса

Синтаксис

DISCARD { ALL | PLANS | SEQUENCES | TEMPORARY | TEMP }

Описание

DISCARD освобождает внутренние ресурсы, связанные с сеансом использования базы данных. Эта команда полезна для частичного или полного сброса состояния сеанса. Существует несколько подкоманд для освобождения различных типов ресурсов; вариант DISCARD ALL объединяет все остальные, а также сбрасывает дополнительное состояние.

Параметры

PLANS

Освобождает все кэшированные планы запросов, заставляя сервер провести повторное планирование при следующем использовании связанного подготовленного оператора.

SEQUENCES

Сбрасывает все кэшированные состояния, связанные с последовательностями, включая currval()/lastval() и любые предварительно выделенные значения последовательности, которые еще не были возвращены nextval(). (См. раздел CREATE SEQUENCE).

TEMPORARY или TEMP

Удаляет все временные таблицы, созданные в текущем сеансе.

ALL

Освобождает все временные ресурсы, связанные с текущим сеансом, и возвращает сеанс в исходное состояние. В настоящее время это имеет тот же эффект, что и выполнение следующей последовательности операторов:

CLOSE ALL;
SET SESSION AUTHORIZATION DEFAULT;
RESET ALL;
DEALLOCATE ALL;
UNLISTEN *;
SELECT pg_advisory_unlock_all();
DISCARD PLANS;
DISCARD TEMP;
DISCARD SEQUENCES;

Примечания

DISCARD ALL не может быть выполнена внутри блока транзакций.

Совместимость

Команда DISCARD ALL является расширением QHB.


DO

DO - выполнить анонимный блок кода

Синтаксис

DO [ LANGUAGE имя_языка ] код

Описание

DO выполняет анонимный блок кода или, другими словами, временную анонимную функцию на процедурном языке.

Блок кода обрабатывается так, как если бы это было тело функции без параметров, возвращающее значение void. Этот код анализируется и выполняется один раз.

Необязательное предложение LANGUAGE может быть написано как до, так и после блока кода.

Параметры

код

Выполняемый код на процедурном языке. Он должен задаваться в виде текстовой строки (её рекомендуется заключать в доллары), как и код в CREATE FUNCTION.

имя_языка

Название процедурного языка, на котором написан код. Если этот параметр опущен, значение по умолчанию равно plpgsql.

Примечания

Используемый процедурный язык должен быть уже установлен в текущую базу данных с помощью команды CREATE EXTENSION . plpgsql устанавливается по умолчанию, но другие языки-нет.

Пользователь должен иметь право USAGE для данного процедурного языка, либо быть суперпользователем, если этот язык недоверенный. Такие же требования действуют и при создании функции на этом языке.

Если команда DO выполняется в блоке транзакций, то код процедуры не может вызывать операторы управления транзакциями. Такие операторы допускаются только в том случае, если DO выполняется в собственной транзакции.

Примеры

Предоставьте все права доступа на все представления в схеме Публично к ролевой webuser:

DO $$DECLARE r record;
BEGIN
    FOR r IN SELECT table_schema, table_name FROM information_schema.tables
             WHERE table_type = 'VIEW' AND table_schema = 'public'
    LOOP
        EXECUTE 'GRANT ALL ON ' || quote_ident(r.table_schema) || '.' || quote_ident(r.table_name) || ' TO webuser';
    END LOOP;
END$$;

Совместимость

Оператор DO отсутствует в стандарте SQL.

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

CREATE LANGUAGE


DROP ACCESS METHOD

DROP ACCESS METHOD - удалить метод доступа

Синтаксис

DROP ACCESS METHOD [ IF EXISTS ] имя [ CASCADE | RESTRICT ]

Описание

Команда DROP ACCESS METHOD удаляет существующий метод доступа. Разрешение на удаление методов доступа есть только у суперпользователей.

Параметры

IF EXISTS

Не считать ошибкой, если метод доступа не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя существующего метода доступа.

CASCADE

Автоматически удалять объекты, зависящие от метода доступа (такие как классы операторов, семейства операторов и индексы), и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять метод доступ, если от него зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Удаление метода доступа heptree:

DROP ACCESS METHOD heptree;

Совместимость

Команда DROP ACCESS METHOD является расширением QHB.

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

CREATE ACCESS METHOD


DROP AGGREGATE

DROP AGGREGATE — удалить агрегатную функции

Синтаксис

DROP AGGREGATE [ IF EXISTS ] имя ( сигнатура_агрегатной_функции ) [ CASCADE | RESTRICT ]

Где сигнатура_агрегатной_функции:

* |
[ режим_аргумента ] [ имя_аргумента ] тип_аргумента [ , ... ] |
[ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [ , ... ] ] ORDER BY [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [ , ... ]

Описание

Команда DROP AGGREGATE удаляет существующую агрегатную функцию. Для выполнения этой команды пользователь должен быть владельцем агрегатной функции.

Параметры

IF EXISTS

Не считать ошибкой, если агрегатная функция не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя, которое может быть дополнено схемой, существующей агрегатной функции.

режим_аргумента

Режим аргумента: IN или VARIADIC. Значение по умолчанию равно IN.

имя_аргумента

Название аргумента. Обратите внимание, что DROP AGGREGATE фактически не обращает внимания на имена аргументов, поскольку для идентификации агрегатной функции необходимы только типы данных ее аргументов.

тип_аргумента

Тип входных данных, с которыми работает агрегатная функция. Чтобы сослаться на агрегатную функцию без аргументов, напишите * вместо списка аргументов. Чтобы сослаться на сортирующую агрегатную функцию, напишите ORDER BY между непосредственными и агрегированными аргументами.

CASCADE

Автоматически удалять объекты, зависящие от агрегатной функции (например, представления, использующие ее), и в свою очередь, все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять агрегатную функцию, если от нее зависят какие-либо объекты. Это поведение по умолчанию.

Примечания

Альтернативные варианты указания сортирующих агрегатных функций описаны в разделе ALTER AGGREGATE .

Примеры

Удалить агрегатную функцию myavg для типа integer:

DROP AGGREGATE myavg(integer);

Удалить гипотезирующую агрегатную функцию myrank, которая принимает произвольный список сортируемых столбцов и соответствующий список непосредственных аргументов:

DROP AGGREGATE myrank(VARIADIC "any" ORDER BY VARIADIC "any");

Удалить несколько агрегатных функций в одной команде:

DROP AGGREGATE myavg (integer), myavg (bigint);

Совместимость

Команда DROP AGGREGATE отсутствует в стандарте SQL.

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

ALTER AGGREGATE, CREATE AGGREGATE


DROP CAST

DROP CAST - удалить приведение типа

Синтаксис

DROP CAST [ IF EXISTS ] (исходный_тип AS целевой_тип) [ CASCADE | RESTRICT ]

Описание

Команда DROP CAST удаляет ранее определенное приведение тип.

Чтобы удалить приведение типа, пользователь должен быть владельцем исходного или целевого типа данных. Эти же требования действуют и при создании приведения.

Параметры

IF EXISTS

Не считать ошибкой, если приведение не существует. В этом случае будет выдано соответствующее уведомление.

исходный_тип

Имя исходного типа данных для приведения.

целевой_тип

Имя целевого типа данных приведения.

CASCADE RESTRICT

Эти ключевые слова не имеют эффекта, так как нет объектов, зависящих от приведений.

Примеры

Удалить приведение типа text к типу int:

DROP CAST (text AS int);

Совместимость

Команда DROP CAST соответствует стандарту SQL.

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

CREATE CAST


DROP COLLATION

DROP COLLATION - удалить правило сортировки

Синтаксис

DROP COLLATION [ IF EXISTS ] имя [ CASCADE | RESTRICT ]

Описание

Команда DROP COLLATION удаляет ранее определенное правило сортировки. Чтобы удалить правило сортировки, пользователь должен быть владельцем правила.

Параметры

IF EXISTS

Не считать ошибкой, если правило сортировки не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя правила сортировки. Имя правила сортировки может быть дополнено схемой.

CASCADE

Автоматически удалять объекты, зависящие от правила сортировки, и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять правила сортировки, если от них зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Удалить правило сортировки с именем german:

DROP COLLATION german;

Совместимость

Команда DROP COLLATION соответствует стандарту SQL, за исключением параметра IF EXISTS, который является расширением QHB.

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

ALTER COLLATION, CREATE COLLATION


DROP CONVERSION

DROP CONVERSION — удалить преобразования

Синтаксис

DROP CONVERSION [ IF EXISTS ] имя [ CASCADE | RESTRICT ]

Описание

Команда DROP CONVERSION удаляет ранее определенное преобразование. Чтобы иметь возможность удалить преобразование, пользователь должен быть его владельцем.

Параметры

IF EXISTS

Не считать ошибкой, если преобразование не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя преобразования. Имя преобразования может быть дополнено схемой.

CASCADE
RESTRICT

Эти ключевые слова не имеют эффекта, так как нет объектов, зависящих от преобразований.

Примеры

Удалить преобразование с именем myname:

DROP CONVERSION myname;

Совместимость

Команда DROP CONVERSION отсутствует в стандарте SQL. Но в стандарте есть команда DROP TRANSLATION, сопутствующая команде CREATE TRANSLATION, которая, в свою очередь, подобна CREATE CONVERSION в QHB.

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

ALTER CONVERSION, CREATE CONVERSION


DROP DATABASE

DROP DATABASE - удалить базу данных

Синтаксис

DROP DATABASE [ IF EXISTS ] имя

Описание

Команда DROP DATABASE удаляет базу данных. Она удаляет записи из каталогов, которые относятся к базе данных, и удаляет каталог, содержащий данные. Выполнить команду может только владелец базы данных. Кроме того, команда не может быть выполнена, пока вы или кто-либо другой подключен к целевой базе данных. (Подключитесь к QHB или любой другой базе данных, чтобы выполнить эту команду).

Действие команды DROP DATABASE нельзя отменить. Используйте команду с осторожностью!

Параметры

IF EXISTS

Не считать ошибкой, если база данных не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя базы данных, которую нужно удалить.

Примечания

Команда DROP DATABASE не может быть выполнена внутри блока транзакций.

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

Совместимость

Команда DROP DATABASE отсутствует в стандарте SQL.

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

CREATE DATABASE


DROP DOMAIN

DROP DOMAIN - удалить домен

Синтаксис

DROP DOMAIN [ IF EXISTS ] имя [, ...] [ CASCADE | RESTRICT ]

Описание

Команда DROP DOMAIN удаляет домен. Только владелец домена может его удалить.

Параметры

IF EXISTS

Не считать ошибкой, если домен не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя, которое может быть дополнено схемой, существующего домена.

CASCADE

Автоматически удалять объекты, зависящие от домена (например, столбцы таблицы), и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять домен, если от него зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Удалить домен box:

DROP DOMAIN box;

Совместимость

Команда DROP DOMAIN соответствует стандарту SQL, за исключением параметра IF EXISTS, который является расширением QHB.

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

CREATE DOMAIN, ALTER DOMAIN


DROP EVENT TRIGGER

DROP EVENT TRIGGER - удалить событийный триггер

Синтаксис

DROP EVENT TRIGGER [ IF EXISTS ] имя [ CASCADE | RESTRICT ]

Описание

Команда DROP EVENT TRIGGER удаляет существующий событийный триггер. Для выполнения этой команды пользователь должен быть владельцем событийного триггера.

Параметры

IF EXISTS

Не считать ошибкой, если событийный триггер не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя событийного триггера, который должен быть удален.

CASCADE

Автоматически удалять объекты, зависящие от триггера, и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять триггер, если от него зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Удаление триггера snitch:

DROP EVENT TRIGGER snitch;

Совместимость

Команда DROP EVENT TRIGGER отсутствует в стандарте SQL.

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

CREATE EVENT TRIGGER, ALTER EVENT TRIGGER


DROP EXTENSION

DROP EXTENSION — удалить расширение

Синтаксис

DROP EXTENSION [ IF EXISTS ] имя [, ...] [ CASCADE | RESTRICT ]

Описание

Команда DROP EXTENSION удаляет расширения из базы данных. Удаление расширения также приводит к удалению составляющих его объектов.

Для выполнения команды DROP EXTENSION, пользователь должен быть владельцем расширения.

Параметры

IF EXISTS

Не считать ошибкой, если расширение не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя установленного расширения.

CASCADE

Автоматически удалять объекты, зависящие от расширения, и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять расширение, если от него зависят какие-либо объекты (кроме его собственных объектов и других расширений, перечисленных в той же команде DROP). Это поведение по умолчанию.

Примеры

Удаление расширения hstore.

DROP EXTENSION hstore;

Эта команда завершится неудачей, если какой-либо объект из hstore используется в базе данных, например, если в какой-либо таблице есть столбец с типом hstore. Добавив указание CASCADE вы сможете принудительно удалить и все зависимые объекты.

Совместимость

Команда DROP EXTENSION является расширением QHB.

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

CREATE EXTENSION, ALTER EXTENSION


DROP FOREIGN DATA WRAPPER

DROP FOREIGN DATA WRAPPER - удалить обертку сторонних данных

Синтаксис

DROP FOREIGN DATA WRAPPER [ IF EXISTS ] имя [ CASCADE | RESTRICT ]

Описание

Команда DROP FOREIGN DATA WRAPPER удаляет существующую обертку сторонних данных. Для выполнения этой команды пользователь должен быть владельцем обертки сторонних данных.

Параметры

IF EXISTS

Не считать ошибкой, если обертка сторонних данных не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя существующей обертки сторонних данных.

CASCADE

Автоматически удалять объекты, зависящие от обертки сторонних данных (например, сторонние таблицы и серверы), и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять обертку сторонних данных, если от нее зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Удаление обертки сторонних данных dbi:

DROP FOREIGN DATA WRAPPER dbi;

Совместимость

Команда DROP FOREIGN DATA WRAPPER соответствует стандарту ISO/IEC 9075-9 (SQL/MED). Предложение IF EXISTS является расширением QHB.

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

CREATE FOREIGN DATA WRAPPER, ALTER FOREIGN DATA WRAPPER


DROP FOREIGN TABLE

DROP FOREIGN TABLE - удалить стороннюю таблицу

Синтаксис

DROP FOREIGN TABLE [ IF EXISTS ] имя [, ...] [ CASCADE | RESTRICT ]

Описание

Команда DROP FOREIGN TABLE удаляет стороннюю таблицу. Только владелец сторонней таблицы может ее удалить.

Параметры

IF EXISTS

Не считать ошибкой, если сторонняя таблица не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя, которое может быть дополнено схемой, сторонней таблицы, подлежащей удалению.

CASCADE

Автоматически удалять объекты, зависящие от сторонней таблицы (например, представления), и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять стороннюю таблицу, если от нее зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Удаление двух сторонних таблиц, films и distributors:

DROP FOREIGN TABLE films, distributors;

Совместимость

Эта команда соответствует стандарту ISO / IEC 9075-9 (SQL/MED), за исключением возможности удалять несколько сторонних таблиц в одной команде, а также параметра IF EXISTS, которые являются расширением QHB.

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

ALTER FOREIGN TABLE, CREATE FOREIGN TABLE


DROP FUNCTION

DROP FUNCTION - удалить функцию

Синтаксис

DROP FUNCTION [ IF EXISTS ] имя ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] )
    [ CASCADE | RESTRICT ]

Описание

Команда DROP FUNCTION удаляет определение существующей функции. Для выполнения этой команды пользователь должен быть владельцем функции. Кроме имени функции, должны быть еще указаны типы ее аргументов, так как могут существовать несколько различных функций с одинаковым именем и разными списками аргументов.

Параметры

IF EXISTS

Не считать ошибкой, если функция не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя, которое может быть дополнено схемой, существующей функции. Если список аргументов не указан, имя должно быть уникальным в своей схеме.

режим_аргумента

Режим аргумента: IN, OUT, IN или VARIADIC. Значение по умолчанию равно IN. Обратите внимание, что команда DROP FUNCTION на самом деле не обращает внимания аргументы с режимом OUT, так как только аргументы с режимом IN, необходимы для идентификации функции. Так что достаточно перечислить аргументы с режимами IN, INOUT, и VARIADIC.

имя_аргумента

Имя аргумента. Обратите внимание, что DROP FUNCTION фактически не обращает внимания на имена аргументов, поскольку для идентификации функции необходимы только типы данных ее аргументов.

тип_аргумента

Типы данных аргументов функции (которые могут быть дополнены именем схемы), если таковые имеются.

CASCADE

Автоматически удалять объекты, зависящие от функции (например, операторы или триггеры), и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять функцию, если от нее зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Эта команда удаляет функцию, вычисляющую квадратный корень:

DROP FUNCTION sqrt(integer);

Удаление нескольких функций одной командой:

DROP FUNCTION sqrt(integer), sqrt(bigint);

Если имя функции уникально в её схеме, на неё можно указать без списка аргументов:

DROP FUNCTION update_employee_salaries;

Обратите внимание, что это отличается от

DROP FUNCTION update_employee_salaries();

Данная форма ссылается на функцию без аргументов, тогда как первый вариант подходит для функции с любым числом аргументов, в том числе и совсем без аргументов, если имя функции уникально.

Совместимость

Эта команда соответствует стандарту SQL, со следующими расширениями QHB:

  • Стандарт позволяет удалить командой только одну функцию.

  • Параметр IF EXISTS

  • Возможность задавать режимы и имена аргументов

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

CREATE FUNCTION, ALTER FUNCTION, DROP PROCEDURE, DROP ROUTINE


DROP GROUP

DROP GROUP - удалить роль в базе данных

Синтаксис

DROP GROUP [ IF EXISTS ] имя [, ...]

Описание

Команда DROP GROUP является синонимом команды DROP ROLE .

Совместимость

Команда DROP GROUP отсутствует в стандарте SQL.

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

DROP ROLE


DROP INDEX

DROP INDEX - удалить индекс

Синтаксис

DROP INDEX [ CONCURRENTLY ] [ IF EXISTS ] имя [, ...] [ CASCADE | RESTRICT ]

Описание

Команда DROP INDEX удаляет существующий индекс из базы данных. Для выполнения этой команды пользователь должен быть владельцем индекса.

Параметры

CONCURRENTLY

Это указание позволяет удалить индекс без блокировки одновременных операции выборки, вставки, изменения и удаления данных в таблице индекса. Обычная команда DROP INDEX запрашивает исключительную блокировку на таблицу, блокируя другие обращения к ней до тех пор, пока удаление индекса не будет завершено. При использовании же этого параметра, команда вместо этого будет ожидать завершения конфликтующих транзакций.

Есть несколько особенностей, которые следует учитывать при использовании этого параметра. В команде можно указать только одно имя индекса, а также не поддерживается указание CASCADE. (Таким образом, индекс, поддерживающий ограничение UNIQUE или PRIMARY KEY, не может быть удален таким способом). Кроме того, обычные команды DROP INDEX могут выполняться в блоке транзакций, а DROP INDEX CONCURRENTLY не может.

IF EXISTS

Не считать ошибкой, если индекс не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя (при необходимости дополненное схемой), удаляемого индекса.

CASCADE

Автоматически удалять объекты, зависящие от индекса, и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять индекс, если от него зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Эта команда удалит индекс title_idx:

DROP INDEX title_idx;

Совместимость

Команда DROP INDEX является расширением QHB. В стандарте SQL нет положений для индексов.

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

CREATE INDEX


DROP LANGUAGE

DROP LANGUAGE - удалить процедурный язык

Синтаксис

DROP [ PROCEDURAL ] LANGUAGE [ IF EXISTS ] имя [ CASCADE | RESTRICT ]

Описание

Команда DROP LANGUAGE удаляет определение ранее зарегистрированного процедурного языка. Выполнить команду DROP LANGUAGE может только суперпользователь или владелец этого языка.

Замечание
Большинство процедурных языков были преобразованы в 'расширения', так что теперь их следует удалять командой DROP EXTENSION, а не DROP LANGUAGE.

Параметры

IF EXISTS

Не считать ошибкой, если процедурный язык не существует. В этом случае будет выдано соответствующее уведомление.

имя

Название существующего процедурного языка. Для обратной совместимости имя может быть заключено в одинарные кавычки.

CASCADE

Автоматически удалять объекты, зависящие от процедурного языка (например, функции в языке), и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять процедурный язык, если от него зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Эта команда удаляет процедурный язык plsample:

DROP LANGUAGE plsample;

Совместимость

Команда DROP LANGUAGE отсутствует в стандарте SQL.

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

ALTER LANGUAGE, CREATE LANGUAGE


DROP MATERIALIZED VIEW

DROP MATERIALIZED VIEW - удалить материализованное представление

Синтаксис

DROP MATERIALIZED VIEW [ IF EXISTS ] имя [, ...] [ CASCADE | RESTRICT ]

Описание

Команда DROP MATERIALIZED VIEW удаляет существующее материализованное представление. Для выполнения этой команды пользователь должен быть владельцем материализованного представления.

Параметры

IF EXISTS

Не считать ошибкой, если материализованное представление не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя, которое может быть дополнено схемой, материализованного представления, подлежащего удалению.

CASCADE

Автоматически удалять объекты, зависящие от материализованного представления (например, другие материализованные представления или обычные представления), и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять материализованное представление, если от него зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Эта команда удаляет материализованное представление с именем order_summary:

DROP MATERIALIZED VIEW order_summary;

Совместимость

Команда DROP MATERIALIZED VIEW является расширением QHB.

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

CREATE MATERIALIZED VIEW, ALTER MATERIALIZED VIEW, REFRESH MATERIALIZED VIEW


DROP OPERATOR

DROP OPERATOR - удалить оператор

Синтаксис

DROP OPERATOR [ IF EXISTS ] имя ( { тип_слева | NONE } , { тип_справа | NONE } ) [, ... ] [ CASCADE | RESTRICT ]

Описание

Команда DROP OPERATOR удаляет существующий оператор из базы данных. Для выполнения этой команды пользователь должен быть владельцем оператора.

Параметры

IF EXISTS

Не считать ошибкой, если оператор не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя, которое может быть дополнено схемой, существующего оператора.

тип_слева

Тип данных левого операнда оператора; укажите NONE если оператор не имеет левого операнда.

тип_справа

Тип данных правого операнда оператора; укажите NONE если у оператора нет правого операнда.

CASCADE

Автоматически удалять объекты, зависящие от оператора (например, представления, использующие его), и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять оператор, если от него зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Удаление оператора возведения в степень a^b для типа integer:

DROP OPERATOR ^ (integer, integer);

Удаление левого унарного оператора двоичного дополнения ~b для типа bit:

DROP OPERATOR ~ (none, bit);

Удаление правого унарного оператора вычисления факториала x! для типа bigint:

DROP OPERATOR ! (bigint, none);

Удаление нескольких операторов одной командой:

DROP OPERATOR ~ (none, bit), ! (bigint, none);

Совместимость

Команда DROP OPERATOR отсутствует в стандарте SQL.

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

CREATE OPERATOR, ALTER OPERATOR


DROP OPERATOR CLASS

DROP OPERATOR CLASS - удалить класс операторов

Синтаксис

DROP OPERATOR CLASS [ IF EXISTS ] имя USING индексный_метод [ CASCADE | RESTRICT ]

Описание

Команда DROP OPERATOR CLASS удаляет существующий класс операторов. Для выполнения этой команды пользователь должен быть владельцем класса операторов.

DROP OPERATOR CLASS не удаляет ни один из операторов или функций, на которые связаны с этим классом. Если есть какие-либо индексы, зависящие от класса оператора, вам нужно будет указать CASCADE для того, чтобы удаление было успешно завершено.

Параметры

IF EXISTS

Не считать ошибкой, если класс операторов не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя, которое может быть дополнено схемой, существующего класса операторов.

индексный_метод

Имя метода доступа к индексу, для которого предназначен класс операторов.

CASCADE

Автоматически удалять объекты, зависящие от класса операторов (например, индексы), и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять класс операторов, если от него зависят какие-либо объекты. Это поведение по умолчанию.

Примечания

DROP OPERATOR CLASS не удаляет семейство операторов, содержащее класс, даже если в семействе больше ничего не останется (в частности, в том случае, когда семейство было неявно создано с помощью команды CREATE OPERATOR CLASS ). Пустое семейство операторов безвредно, но из из соображений аккуратности вы можете удалить его командой DROP OPERATOR FAMILY; или, возможно, лучше использовать DROP OPERATOR FAMILY в первую очередь.

Примеры

Удаление класса операторов B-дерева с именем widget_ops:

DROP OPERATOR CLASS widget_ops USING btree;

Эта команда не будет выполнена, если существуют какие-либо индексы, использующие класс операторов. Чтобы удалить такие индексы вместе с классом оператора нужно добавить в команду указание CASCADE.

Совместимость

Команда DROP OPERATOR CLASS отсутствует в стандарте SQL.

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

ALTER OPERATOR CLASS, CREATE OPERATOR CLASS, DROP OPERATOR FAMILY


DROP OPERATOR FAMILY

DROP OPERATOR FAMILY — удалить семейство операторов

Синтаксис

DROP OPERATOR FAMILY [ IF EXISTS ] имя USING индексный_метод [ CASCADE | RESTRICT ]

Описание

Команда DROP OPERATOR FAMILY удаляет существующее семейство операторов. Для выполнения этой команды пользователь должен быть владельцем семейства операторов.

Команда DROP OPERATOR FAMILY удаляет также и все классы операторов, содержащиеся в семействе, но не удаляет ни один из операторов или функций, связанных с семейством. Если существуют какие-либо индексы, зависящие от классов операторов внутри семейства, вам нужно будет указать в CASCADE для успешного завершения команды.

Параметры

IF EXISTS

Не считать ошибкой, если семейство операторов не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя, которое может быть дополнено схемой, существующего семейства операторов.

индексный_метод

Имя метода досутпа к индексу, для которого предназначено семейство операторов.

CASCADE

Автоматически удалять объекты, зависящие от семейства операторов, и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять семейство операторов, если от него зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Удаление семейства операторов B-дерева с именем float_ops:

DROP OPERATOR FAMILY float_ops USING btree;

Эта команда не будет выполнена, если существуют какие-либо индексы, использующие классы операторов внутри семейства. Чтобы удалить такие индексы вместе с семейством операторов нужно добавить указание CASCADE.

Совместимость

Команда DROP OPERATOR FAMILY отсутствует в стандарте SQL.

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

ALTER OPERATOR FAMILY, CREATE OPERATOR FAMILY, ALTER OPERATOR CLASS CREATE OPERATOR CLASS, DROP OPERATOR CLASS


DROP OWNED

DROP OWNED — удалить объекты базы данных, принадлежащие роли

Синтаксис

DROP OWNED BY { имя | CURRENT_USER | SESSION_USER } [, ...] [ CASCADE | RESTRICT ]

Описание

Команда DROP OWNED удаляет все объекты в текущей базе данных, принадлежащие указанным ролям. Любые права, предоставленные данным ролям для объектов в текущей базе данных или для общих объектов (баз данных, табличных пространств), также будут отозваны.

Параметры

имя

Имя роли, объекты которой будут удалены и права которой будут отозваны.

CASCADE

Автоматически удалять объекты, зависящие от затронутых объектов, и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей).

RESTRICT

Запретить удалять объекты, принадлежащие роли, если любые другие объекты базы данных зависят от одного из затронутых объектов. Это значение по умолчанию.

Примечания

DROP OWNED часто используется для подготовки к удалению одной или нескольких ролей. Поскольку DROP OWNED влияет только на объекты в текущей базе данных, обычно необходимо выполнить эту команду в каждой базе данных, содержащей объекты, принадлежащие роли.

С указанием CASCADE эта команда рекурсивно удалит объекты, принадлежащие и другим пользователям.

Команда REASSIGN OWNED является альтернативой DROP OWNED, она переназначает владельца всех объектов базы данных, принадлежащих одной или нескольким ролям. Кроме того REASSIGN OWNED не затрагивает никакие права для других объектов.

Базы данных и табличные пространства, принадлежащие роли(ролям), не будут удалены.

Дополнительную информацию см. в разделе Удаление ролей.

Совместимость

Команда DROP OWNED является расширением QHB.

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

REASSIGN OWNED, DROP ROLE


DROP POLICY

DROP POLICY - удалить политику защиты на уровне строк для таблицы

Синтаксис

DROP POLICY [ IF EXISTS ] имя ON имя_таблицы [ CASCADE | RESTRICT ]

Описание

Команда DROP POLICY удаляет указанную политику из таблицы. Обратите внимание, что если из таблицы удаляется последняя политика, и для таблицы по-прежнему включена защита на уровне строк (с помощью ALTER TABLE), то использоваться будет политика запрета по умолчанию. Для отключения защиты строк для таблицы, независимо от того, существуют ли политики для таблицы или нет, может использоваться команда ALTER TABLE ... DISABLE ROW LEVEL SECURITY.

Параметры

IF EXISTS

Не считать ошибкой, если политика не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя политики, которая должна быть удалена.

имя_таблицы

Имя, которое может быть дополнено схемой, таблицы, для которой включена политика.

CASCADE
RESTRICT

Эти ключевые слова не имеют эффекта, так как нет никаких объектов, которые зависят от политик.

Примеры

Удаление политики p1 из таблицы my_table:

DROP POLICY p1 ON my_table;

Совместимость

Команда DROP POLICY является расширением QHB.

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

CREATE POLICY, ALTER POLICY


DROP PROCEDURE

DROP PROCEDURE - удалить процедуру

Синтаксис

DROP PROCEDURE [ IF EXISTS ] имя [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ] [, ...]
    [ CASCADE | RESTRICT ]

Описание

Команда DROP PROCEDURE удаляет определение существующей процедуры. Для выполнения этой команды пользователь должен быть владельцем процедуры. Типы аргументов процедуры должны быть указаны, так как могут существовать несколько различных процедур с одинаковыми именами и разными списками аргументов.

Параметры

IF EXISTS

Не считать ошибкой, если процедура не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя, которое может быть дополнено схемой, существующей процедуры. Если список аргументов не указан, имя должно быть уникальным в своей схеме.

режим_аргумента

Режим аргумента: IN или VARIADIC. Значение по умолчанию равно IN.

имя_аргумента

Название аргумента. Обратите внимание, что команда DROP PROCEDURE фактически не обращает внимания на имена аргументов, поскольку для идентификации процедуры необходимы только типы данных ее аргументов.

тип_аргумента

Тип (ы) данных аргументов процедуры (при необходимости дополненные схемой), если таковые имеются.

CASCADE

Автоматически удалять объекты, зависящие от процедуры, и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять процедуру, если от нее зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

DROP PROCEDURE do_db_maintenance();

Совместимость

Эта команда соответствует стандарту SQL, со следующими расширениями QHB:

  • Стандарт позволяет удалить командой только одну процедуру.

  • Параметр IF EXISTS

  • Возможность задавать режимы и имена аргументов.

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

CREATE PROCEDURE, ALTER PROCEDURE, DROP FUNCTION, DROP ROUTINE


DROP PUBLICATION

DROP PUBLICATION — удалить публикацию

Синтаксис

DROP PUBLICATION [ IF EXISTS ] имя [, ...] [ CASCADE | RESTRICT ]

Описание

Команда DROP PUBLICATION удаляет существующую публикацию из базы данных.

Публикация может быть удалена только ее владельцем или суперпользователем.

Параметры

IF EXISTS

Не считать ошибкой, если публикация не существует. В этом случае будет выдано соответствующее уведомление.

имя

Название существующей публикации.

CASCADE
RESTRICT

Эти ключевые слова не имеют эффекта, так как нет никаких объектов, которые зависят от публикаций.

Примеры

Удаление публикации:

DROP PUBLICATION mypublication;

Совместимость

Команда DROP PUBLICATION является расширением QHB.

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

CREATE PUBLICATION, ALTER PUBLICATION


DROP ROLE

DROP ROLE - удалить роль в базе данных

Синтаксис

DROP ROLE [ IF EXISTS ] имя [, ...]

Описание

Команда DROP ROLE удаляет указанные роли. Удалять роль суперпользователя, разрешено только суперпользователям; чтобы удалять обычные роли, пользователю достаточно иметь право CREATEROLE.

Роль нельзя удалить, если на нее все еще есть ссылки в любой базе данных кластера; в этом случае возникнет ошибка и роль не будет удалена. Перед удалением роли необходимо удалить все принадлежащие ей объекты (или сменить владельца) и отозвать все права, предоставленные этой роли для других объектов. Для этой цели могут быть применены команды REASSIGN OWNED и DROP OWNED; см. раздел Удаление ролей для получения дополнительной информации.

Однако, нет необходимости удалять членство в ролях, включающее роль; DROP ROLE автоматически отменяет любое членство целевой роли в других ролях, и каких-либо других ролей в целевой роли. Не целевые роли при этом не удаляются и не затрагиваются иным образом.

Параметры

IF EXISTS

Не считать ошибкой, если роль не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя удаляемой роли.

Примечания

QHB включает в себя программу dropuser, которая имеет ту же функциональность, что и эта команда (фактически, она вызывает эту команду), но может быть запущена из командной строки.

Примеры

Удаление роли:

DROP ROLE jonathan;

Совместимость

В стандарте SQL описана команда DROP ROLE, но стандарт позволяет удалять командой только одну роль, и определяет требования к правам, отличные от требований QHB.

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

CREATE ROLE, ALTER ROLE, SET ROLE


DROP ROUTINE

DROP ROUTINE - удалить подпрограмму

Синтаксис

DROP ROUTINE [ IF EXISTS ] имя [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ] [, ...]
    [ CASCADE | RESTRICT ]

Описание

Команда DROP ROUTINE удаляет определение существующей подпрограммы, которая может быть агрегатной функцией, обычной функцией или процедурой. Описание параметров, дополнительные примеры и дополнительные сведения см. в разделах DROP AGGREGATE, DROP FUNCTION и DROP PROCEDURE.

Примеры

Удаление подпрограммы foo для типа integer:

DROP ROUTINE foo(integer);

Эта команда будет работать независимо от того, является ли foo агрегатной функцией, обычной функцией или процедурой.

Совместимость

Эта команда соответствует стандарту SQL, со следующими расширениями QHB:

  • Стандарт позволяет удалить командой только одну подпрограмму.

  • Параметр IF EXISTS

  • Возможность задавать режимы и имена аргументов.

  • Агрегатные функции.

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

DROP AGGREGATE, DROP FUNCTION, DROP PROCEDURE, ALTER ROUTINE

Обратите внимание, что команды CREATE ROUTINE нет.


DROP RULE

DROP RULE - удалить правило перезаписи

Синтаксис

DROP RULE [ IF EXISTS ] имя ON имя_таблицы [ CASCADE | RESTRICT ]

Описание

Команда DROP RULE удаляет правило перезаписи.

Параметры

IF EXISTS

Не считать ошибкой, если правило не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя правила, которое должно быть удалено.

имя_таблицы

Имя( может быть дополнено схемой), таблицы или представления, к которым применяется правило.

CASCADE

Автоматически удалять объекты, зависящие от правила, и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять правило, если от него зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Удаление правила перезаписи newrule:

DROP RULE newrule ON mytable;

Совместимость

Команда DROP RULE является расширением языка QHB, как и вся система перезаписи запросов.

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

CREATE RULE, ALTER RULE


DROP SCHEMA

DROP SCHEMA - удалить схему

Синтаксис

DROP SCHEMA [ IF EXISTS ] имя [, ...] [ CASCADE | RESTRICT ]

Описание

DROP SCHEMA удаляет схемы из базы данных.

Схема может быть удалена только ее владельцем или суперпользователем. Обратите внимание, что владелец может удалить схему (и, следовательно, все содержащиеся в ней объекты), даже если он не владеет некоторыми объектами внутри схемы.

Параметры

IF EXISTS

Не считать ошибкой, если схема не существует. В этом случае должно быть выдано соответствующее уведомление.

имя

Имя схемы.

CASCADE

Автоматически удалять объекты (таблицы, функции и т.д.) которые содержатся в схеме, и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять схему, если она содержит какие-либо объекты. Это значение по умолчанию.

Примечания

С указанием CASCADE команда может удалить объекты в других схемах, а не только в целевой.

Примеры

Удаление схемы mystuff из базы данных вместе со всем, что в ней содержится:

DROP SCHEMA mystuff CASCADE;

Совместимость

DROP SCHEMA полностью соответствует стандарту SQL, за исключением того, что стандарт позволяет удалять только одну схему в одной команде, и указания IF EXISTS, которое является расширением QHB.

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

ALTER SCHEMA, CREATE SCHEMA


DROP SEQUENCE

DROP SEQUENCE - удалить последовательность

Синтаксис

DROP SEQUENCE [ IF EXISTS ] имя [, ...] [ CASCADE | RESTRICT ]

Описание

DROP SEQUENCE удаляет генераторы числовых последовательностей. Последовательность может быть удалена только ее владельцем или суперпользователем.

Параметры

IF EXISTS

Не считать ошибкой, если последовательность не существует. В этом случае должно быть выдано соответствующее уведомление.

имя

Имя (при необходимости дополненное схемой) последовательности.

CASCADE

Автоматически удалять объекты, зависящие от последовательности, и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей).

RESTRICT

Запретить удалять последовательность, если от нее зависят какие-либо объекты. Это значение по умолчанию.

Примеры

Удаление последовательности serial:

DROP SEQUENCE serial;

Совместимость

DROP SEQUENCE соответствует стандарту SQL, за исключением того, что стандарт позволяет удалять только одну последовательность в одной команде, и указания IF EXISTS, которое является расширением QHB.

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

CREATE SEQUENCE, ALTER SEQUENCE


DROP SERVER

DROP SERVER - удалить описание стороннего сервера

Синтаксис

DROP SERVER [ IF EXISTS ] имя [, ...] [ CASCADE | RESTRICT ]

Описание

Команда DROP SERVER удаляет существующее описание стороннего сервера. Для выполнения этой команды пользователь должен быть владельцем стороннего сервера.

Параметры

IF EXISTS

Не считать ошибкой, если сервер не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя существующего сервера.

CASCADE

Автоматически удалять объекты, зависящие от сервера (например, пользовательские сопоставления), и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять сервер, если от него зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Удаление определения сервера foo, если оно существует:

DROP SERVER IF EXISTS foo;

Совместимость

Команда DROP SERVER соответствует стандарту ISO/IEC 9075-9 (SQL/MED). Параметр IF EXISTS является расширением QHB.

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

CREATE SERVER, ALTER SERVER


DROP STATISTICS

DROP STATISTICS — удалить расширенную статистику

Синтаксис

DROP STATISTICS [ IF EXISTS ] имя [, ...]

Описание

Команда DROP STATISTICS удаляет объекты статистики из базы данных. Только владелец объекта статистики, владелец схемы или суперпользователь могут удалить объект статистики.

Параметры

IF EXISTS

Не считать ошибкой, если объект статистики не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя ( может быть дополнено схемой), объекта статистики, который должен быть удален.

Примеры

Удаление двух объектов статистики в разных схемах (если эти объекты отсутствуют, ошибки не будет):

DROP STATISTICS IF EXISTS
    accounting.users_uid_creation,
    public.grants_user_role;

Совместимость

Команда DROP STATISTICS отсутствует в стандарте SQL.

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

ALTER STATISTICS, CREATE STATISTICS


DROP SUBSCRIPTION

DROP SUBSCRIPTION — удалить подписку

Синтаксис

DROP SUBSCRIPTION [ IF EXISTS ] имя [ CASCADE | RESTRICT ]

Описание

Команда DROP SUBSCRIPTION удаляет подписку из кластера базы данных.

Подписка может быть удалена только суперпользователем.

DROP SUBSCRIPTION не может быть выполнена внутри блока транзакций, если подписка связана с слотом репликации. (Вы можете использовать ALTER SUBSCRIPTION, для освобождения слота).

Параметры

имя

Имя подписки, которая должна быть удалена.

CASCADE
RESTRICT

Эти ключевые слова не имеют эффекта, так как нет никаких объектов, которые зависят от подписки.

Примечания

При удалении подписки, связанной со слотом репликации на удаленном узле (типичная ситуация), команда DROP SUBSCRIPTION подключится к удаленному узлу и попытается удалить слот репликации как часть этой операции. Это необходимо для того, чтобы освободить ресурсы, выделенные для подписки на удаленном узле. Если при этом происходит сбой, либо из-за недоступности удалённого узла, либо из-за ошибки при удалении слота репликации, либо вообще из-за его отсутствия, команда DROP SUBSCRIPTION прерывается. Чтобы продолжить работу в такой ситуации, отключите подписку от слота репликации путем выполнения ALTER SUBSCRIPTION ... SET (slot_name = NONE). После этого DROP SUBSCRIPTION больше не будет пытаться выполнять какие-либо действия на удаленном узле. Обратите внимание, что если удаленный слот репликации все еще существует, его следует удалить вручную; в противном случае он будет продолжать резервировать WAL, что может в конечном итоге привести к переполнению диска.

Если подписка связана со слотом репликации, то команда DROP SUBSCRIPTION не может быть выполнена внутри блока транзакций.

Примеры

Удаление подписки:

DROP SUBSCRIPTION mysub;

Совместимость

Команда DROP SUBSCRIPTION является расширением QHB.

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

CREATE SUBSCRIPTION, ALTER SUBSCRIPTION


DROP TABLE

DROP TABLE - удалить таблицу

Синтаксис

DROP TABLE [ IF EXISTS ] имя [, ...] [ CASCADE | RESTRICT ]

Описание

Команда DROP TABLE удаляет таблицы из базы данных. Только владелец таблицы, владелец схемы или суперпользователь могут удалить таблицу. Чтобы удалить содержимое таблицы, не удаляя ее, используйте команды DELETE или TRUNCATE .

Команда DROP TABLE также удаляет все индексы, правила, триггеры и ограничения, которые существуют для целевой таблицы. Однако для удаления таблицы, на которую ссылается представление или ограничение внешнего ключа другой таблицы, должно быть дополнительно указано CASCADE. (CASCADE полностью удалит зависимое представление, но в случае внешнего ключа будет удалено только ограничение внешнего ключа, а не вся таблица с которой он связан).

Параметры

IF EXISTS

Не считать ошибкой, если таблица не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя, которое может быть дополнено схемой, таблицы, подлежащей удалению.

CASCADE

Автоматически удалять объекты, зависящие от таблицы (например, представления), и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять таблицу, если от нее зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Удаление таблиц films и distributors:

DROP TABLE films, distributors;

Совместимость

Эта команда соответствует стандарту SQL, за исключением возможности удалять командой сразу несколько таблиц, а также параметром IF EXISTS, которые являются расширением QHB.

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

ALTER TABLE, CREATE TABLE


DROP TABLESPACE

DROP TABLESPACE - удалить табличное пространство

Синтаксис

DROP TABLESPACE [ IF EXISTS ] имя

Описание

Команда DROP TABLESPACE удаляет табличное пространство из системы.

Табличное пространство может быть удалено только его владельцем или суперпользователем. Перед удалением табличное пространство необходимо очистить от всех объектов базы данных. Необходимо также учесть, что если в текущей базе данных не будет ни одного объекта, находящегося в этом пространстве, в нём вполне могут оставаться объекты других баз данных. Кроме того, если табличное пространство, указано в списке temp_tablespaces любого активного сеанса, в этом пространстве окажутся временные файлы, команда DROP может завершиться ошибкой.

Параметры

IF EXISTS

Не считать ошибкой, если табличное пространство не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя табличного пространства.

Примечания

Команда DROP TABLESPACE пространства не может быть выполнена внутри блока транзакций.

Примеры

Удаление табличного пространства mystuff:

DROP TABLESPACE mystuff;

Совместимость

Команда DROP TABLESPACE является расширением QHB.

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

CREATE TABLESPACE, ALTER TABLESPACE


DROP TEXT SEARCH CONFIGURATION

DROP TEXT SEARCH CONFIGURATION - удалить конфигурацию текстового поиска

Синтаксис

DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] имя [ CASCADE | RESTRICT ]

Описание

Команда DROP TEXT SEARCH CONFIGURATION удаляет существующую конфигурацию текстового поиска. Для выполнения этой команды пользователь должен быть владельцем конфигурации.

Параметры

IF EXISTS

Не считать ошибкой, если конфигурация текстового поиска не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя, которое может быть дополнено схемой, существующей конфигурации текстового поиска.

CASCADE

Автоматически удалять объекты, зависящие от конфигурации текстового поиска, и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять конфигурацию текстового поиска, если от нее зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Удаление конфигурации текстового поиска my_english:

DROP TEXT SEARCH CONFIGURATION my_english;

Эта команда не будет выполнена, если существуют какие-либо индексы, ссылающиеся на конфигурацию в вызовах to_tsvector. Чтобы удалить такие индексы вместе с конфигурацией текстового поиска, нужно указать CASCADE.

Совместимость

Команда DROP TEXT SEARCH отсутствует в стандарте SQL.

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

ALTER TEXT SEARCH CONFIGURATION, CREATE TEXT SEARCH CONFIGURATION


DROP TEXT SEARCH DICTIONARY

DROP TEXT SEARCH DICTIONARY - удалить словарь текстового поиска

Синтаксис

DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] имя [ CASCADE | RESTRICT ]

Описание

Команда DROP TEXT SEARCH DICTIONARY удаляет существующий словарь текстового поиска. Для выполнения этой команды пользователь должен быть владельцем словаря.

Параметры

IF EXISTS

Не считать ошибкой, если словарь текстового поиска не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя (при необходимости дополненное схемой) существующего словаря текстового поиска.

CASCADE

Автоматически удалять объекты, зависящие от словаря текстового поиска, и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять словарь текстового поиска, если от него зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Удалить словарь текстового поиска english:

DROP TEXT SEARCH DICTIONARY english;

Эта команда не будет выполнена, если существуют какие-либо конфигурации текстового поиска, использующие словарь. Чтобы удалить такие конфигурации вместе со словарем нужно указать CASCADE.

Совместимость

Команда DROP TEXT SEARCH DICTIONARY отсутствует в стандарте SQL.

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

ALTER TEXT SEARCH DICTIONARY, CREATE TEXT SEARCH DICTIONARY


DROP TEXT SEARCH PARSER

DROP TEXT SEARCH PARSER - удалить анализатор текстового поиска

Синтаксис

DROP TEXT SEARCH PARSER [ IF EXISTS ] имя [ CASCADE | RESTRICT ]

Описание

Команда DROP TEXT SEARCH PARSER удаляет существующий анализатор текстового поиска. Выполнять команду разрешено только суперпользователям.

Параметры

IF EXISTS

Не считать ошибкой, если анализатор текстового поиска не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя, которое может быть дополнено схемой, существующего анализатора текстового поиска.

CASCADE

Автоматически удалять объекты, зависящие от анализатора текстового поиска, и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять анализатор текстового поиска, если от него зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Удаление анализатора текстового поиска my_parser:

DROP TEXT SEARCH PARSER my_parser;

Эта команда не будет выполнена, если существуют какие-либо конфигурации текстового поиска, использующие анализатор. Чтобы удалить такие конфигурации вместе с анализатором нужно указать CASCADE.

Совместимость

Команда DROP TEXT SEARCH PARSER отсутствует в стандарте SQL.

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

ALTER TEXT SEARCH PARSER, CREATE TEXT SEARCH PARSER


DROP TEXT SEARCH TEMPLATE

DROP TEXT SEARCH TEMPLATE - удалить шаблон текстового поиска

Синтаксис

DROP TEXT SEARCH TEMPLATE [ IF EXISTS ] имя [ CASCADE | RESTRICT ]

Описание

Команда DROP TEXT SEARCH TEMPLATE удаляет существующий шаблон текстового поиска. Выполнять команду разрешено только суперпользователям.

Параметры

IF EXISTS

Не считать ошибкой, если шаблон текстового поиска не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя, которое может быть дополнено схемой, существующего шаблона текстового поиска.

CASCADE

Автоматически удалять объекты, зависящие от шаблона текстового поиска, и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять шаблон текстового поиска, если от него зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Удаление шаблона текстового поиска thesaurus:

DROP TEXT SEARCH TEMPLATE thesaurus;

Эта команда не будет выполнена, если существуют какие-либо словари текстового поиска, использующие шаблон. Чтобы удалить такие словари вместе с шаблоном нужно указать CASCADE.

Совместимость

Команда DROP TEXT SEARCH TEMPLATE отсутствует в стандарте SQL.

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

ALTER TEXT SEARCH TEMPLATE, CREATE TEXT SEARCH TEMPLATE


DROP TRANSFORM

DROP TRANSFORM — удалить трансформацию

Синтаксис

DROP TRANSFORM [ IF EXISTS ] FOR имя_типа LANGUAGE имя_языка [ CASCADE | RESTRICT ]

Описание

Команда DROP TRANSFORM удаляет ранее определенную трансформацию.

Чтобы удалить трансформацию, пользователь должен быть владельцем тип данных для процедурного языка, которые с ней связаны. Такие же требования действуют и при создании трансформации.

Параметры

IF EXISTS

Не считать ошибкой, если трансформация не существует. В этом случае будет выдано соответствующее уведомление.

имя_типа

Имя типа данных трансформации.

имя_языка

Название языка трансформации.

CASCADE

Автоматически удалять объекты, зависящие от трансформации, и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять трансформацию, если от него зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Удаление трансформации для типа hstore и языка plpythonu:

DROP TRANSFORM FOR hstore LANGUAGE plpythonu;

Совместимость

Команда DROP TRANSFORM является расширением QHB.. Дополнительные сведения см. в разделе CREATE TRANSFORM.

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

CREATE TRANSFORM


DROP TRIGGER

DROP TRIGGER - удалить триггер

Синтаксис

DROP TRIGGER [ IF EXISTS ] имя ON имя_таблицы [ CASCADE | RESTRICT ]

Описание

Команда DROP TRIGGER удаляет существующее определение триггера. Для выполнения этой команды пользователь должен быть владельцем таблицы, для которой определен триггер.

Параметры

IF EXISTS

Не считать ошибкой, если триггер не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя триггера, который должен быть удален.

table_name

Имя, которое может быть дополнено схемой, таблицы, для которой определен триггер.

CASCADE

Автоматически удалять объекты, зависящие от триггера, и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять триггер, если от него зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Удаление триггера if_dist_exists в таблице films:

DROP TRIGGER if_dist_exists ON films;

Совместимость

Команда DROP TRIGGER в QHB несовместима со стандартом SQL. В стандарте SQL имена триггеров не являются локальными для таблиц, поэтому синтаксис команды проще: DROP TRIGGER имя.

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

CREATE TRIGGER


DROP TYPE

DROP TYPE - удалить тип данных

Синтаксис

DROP TYPE [ IF EXISTS ] имя [, ...] [ CASCADE | RESTRICT ]

Описание

Команда DROP TYPE удаляет созданный пользователем тип данных. Только владелец типа может его удалить.

Параметры

IF EXISTS

Не считать ошибкой, если тип не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя ( может быть дополнено схемой), типа данных, который требуется удалить.

CASCADE

Автоматически удалять объекты, зависящие от типа (например, столбцы таблицы, функции и операторы), и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять тип, если от него зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Удаление типа данных box:

DROP TYPE box;

Совместимость

Эта команда аналогична соответствующей команде в стандарте SQL, но параметр IF EXISTS является расширением QHB. Обратите внимание, что команда CREATE TYPE и механизм расширения типов в QHB отличаются от стандарта SQL.

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

ALTER TYPE, CREATE TYPE


DROP USER

DROP USER - удалить роль в базе данных

Синтаксис

DROP USER [ IF EXISTS ] имя [, ...]

Описание

Команда DROP USER — это альтернативное написание команды DROP ROLE.

Совместимость

Команда DROP USER является расширением QHB. В стандарте SQL определение пользователей считается зависимым от реализации.

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

DROP ROLE


DROP USER MAPPING

DROP USER MAPPING - удалить сопоставление пользователей для стороннего сервера

Синтаксис

DROP USER MAPPING [ IF EXISTS ] FOR { имя_пользователя | USER | CURRENT_USER | PUBLIC } SERVER имя_сервера

Описание

Команда DROP USER MAPPING удаляет существующее сопоставление пользователя для стороннего сервера.

Владелец стороннего сервера может удалять заданные для этого сервера сопоставления любых пользователей. Кроме того, обычный пользователь может удалить сопоставление для собственного имени, если у него есть право USAGE для сервера.

Параметры

IF EXISTS

Не считать ошибкой, если сопоставление не существует. В этом случае будет выдано соответствующее уведомление.

имя_пользователя

Имя пользователя для сопоставления. Значения CURRENT_USER и USER соответствуют имени текущего пользователя. Значение PUBLIC используется для сопоставления всех текущих и будущих имен пользователей в системе.

имя_сервера

Имя сервера, для которого удаляется сопоставление пользователей.

Примеры

Удаление сопоставления пользователя bob для сервера foo, если оно существует:

DROP USER MAPPING IF EXISTS FOR bob SERVER foo;

Совместимость

Команда DROP USER MAPPING соответствует стандарту ISO/IEC 9075-9 (SQL/MED). Параметр IF EXISTS является расширением QHB.

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

CREATE USER MAPPING, ALTER USER MAPPING


DROP VIEW

DROP VIEW - удалить представление

Синтаксис

DROP VIEW [ IF EXISTS ] имя [, ...] [ CASCADE | RESTRICT ]

Описание

Команда DROP VIEW удаляет существующее представление. Для выполнения этой команды пользователь должен быть владельцем представления.

Параметры

IF EXISTS

Не считать ошибкой, если представление не существует. В этом случае будет выдано соответствующее уведомление.

имя

Имя, которое может быть дополнено схемой, удаляемого представления.

CASCADE

Автоматически удалять объекты, зависящие от представления (например, другие представления), и в свою очередь все объекты, зависящие от этих объектов (см. Отслеживание зависимостей ).

RESTRICT

Запретить удалять представление, если от него зависят какие-либо объекты. Это поведение по умолчанию.

Примеры

Эта команда удаляет представление с именем kinds:

DROP VIEW kinds;

Совместимость

Эта команда соответствует стандарту SQL, за исключением возможности удалять командой сразу несколько представлений, а также парметра IF EXISTS, которые являются расширением QHB.

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

ALTER VIEW, CREATE VIEW


END

END - фиксация текущей транзакции

Синтаксис

END [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ]

Описание

END фиксирует текущую транзакцию. Все изменения, внесенные транзакцией, становятся видимыми для других и гарантированно будут сохранены, если произойдет сбой. Эта команда является расширением QHB, и эквивалентна COMMIT .

Параметры

WORK
TRANSACTION

Необязательные ключевые слова. Не имеют эффекта.

AND CHAIN

Если AND CHAIN указывается, сразу после окончания текущей транзакции начинается новая с теми же характеристиками транзакции (см. SET TRANSACTION), что и только что завершенная. В противном случае новая транзакция не запускается.

Примечания

Используйте команду ROLLBACK для прерывания транзакции.

Попытка выполнить команду END вне транзакции не вызовет ошибки, но вызовет предупреждающее сообщение.

Примеры

Следующая команда фиксирует текущую транзакцию и сохраняет все изменения:

END;

Совместимость

Команда END является расширением QHB, и предоставляет функциональные возможности, эквивалентные COMMIT, которые указаны в стандарте SQL.

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

BEGIN, COMMIT, ROLLBACK


EXECUTE

EXECUTE — выполнить подготовленный оператор

Синтаксис

EXECUTE имя [ ( параметр [, ...] ) ]

Описание

EXECUTE используется для выполнения ранее подготовленного оператора. Поскольку подготовленные операторы существуют только в течение сеанса, они должны создаваться командой PREPARE, выполненной в текущем сеансе ранее.

Если в инструкции PREPARE, создавшей оператор, указаны некоторые параметры, то в оператор EXECUTE должен быть передан совместимый набор параметров, иначе возникает ошибка. Обратите внимание, что (в отличие от функций) подготовленные операторы не перегружаются на основе типа или числа их параметров; имя подготовленного оператора должно быть уникальным в рамках текущего сеанса.

Дополнительные сведения о создании и использовании подготовленных операторов см. PREPARE.

Параметры

имя

Имя подготовленного оператора для выполнения.

параметр

Фактическое значение параметра для подготовленного оператора. Это должно быть выражение, возвращающее значение, совместимое с типом данных этого параметра, как было определено при создании подготовленного оператора.

Выводимая информация

Метка команды, возвращаемая EXECUTE, соответствует подготовленному оператору, а не оператору EXECUTE.

Примеры

Примеры приведены в разделе Примеры документации по оператору PREPARE.

Совместимость

Стандарт SQL включает инструкцию EXECUTE, но она предназначена только для использования во встраиваемом SQL. Эта версия оператора EXECUTE имеет также несколько другой синтаксис.

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

DEALLOCATE, PREPARE


EXPLAIN

EXPLAIN - показать план выполнения оператора

Синтаксис

EXPLAIN [ ( параметр [, ...] ) ] оператор
EXPLAIN [ ANALYZE ] [ VERBOSE ] оператор

Где параметр может быть:

    ANALYZE [ boolean ]
    VERBOSE [ boolean ]
    COSTS [ boolean ]
    SETTINGS [ boolean ]
    BUFFERS [ boolean ]
    TIMING [ boolean ]
    SUMMARY [ boolean ]
    FORMAT { TEXT | XML | JSON | YAML }

Описание

Эта команда отображает план выполнения, который создает планировщик QHB для заданного оператора. План выполнения показывает, как таблица(ы), на которую ссылается оператор, будет сканироваться — простым последовательным сканированием, индексным сканированием и т. д. — и если имеется ссылка на несколько таблиц, то какие алгоритмы объединения будут использоваться для объединения необходимых строк из каждой входной таблицы.

Наиболее важной частью выводимой информации является расчетная стоимость выполнения оператора, которая представляет собой предположение планировщика о том, сколько времени потребуется для выполнения оператора (это значение измеряется в единицах стоимости, которые не имеют точного определения, но обычно это обращение к странице на диске). На самом деле выводятся два числа: начальная стоимость до выдачи первой строки, и общая стоимость выдачи всех всех строк. Для большинства запросов важна общая стоимость, но в таких контекстах, как подзапрос в EXISTS, планировщик выбирает наименьшую стартовую стоимость вместо наименьшей общей стоимости (так как исполнение запроса всё равно завершится сразу после получения одной строки). Кроме того, если вы ограничиваете число строк предложением LIMIT, Планировщик делает соответствующую интерполяцию между двумя этими числами, выбирая наиболее выгодный план.

С параметром ANALYZE оператор будет выполнен, а не только запланирован. При этом в вывод добавляются фактические статистические данные времени выполнения, включая общее затраченное время в каждом узле плана (в миллисекундах) и общее количество строк, которые он фактически вернул. Это полезно для того, чтобы увидеть, близки ли оценки планировщика к реальности.

Важно!!!
Имейте в виду, что с указанием ANALYZE оператор действительно выполняется. Хотя EXPLAIN отбрасывает результат, который вернул бы SELECT, в остальном все действия выполняются как обычно. Если вы хотите выполнить EXPLAIN ANALYZE с командой INSERT, UPDATE, DELETE, CREATE TABLE AS или EXECUTE, не допуская изменения данных этой командой, используйте:

BEGIN;
EXPLAIN ANALYZE ...;
ROLLBACK;

Без скобок для этого оператора можно указать только параметры ANALYZE и VERBOSE и только в таком порядке.

Параметры

ANALYZE

Выполнить команду и показать фактическое время выполнения и другую статистику. По умолчанию этот параметр имеет значение FALSE.

VERBOSE

Вывести дополнительную информацию о плане. В частности, включить список выходных столбцов для каждого узла в дереве плана, имена таблиц и функций, отвечающих требованиям схемы, всегда указывать для переменных в выражениях псевдоним их таблицы, а также выводить имена всех триггеров, для которого отображается статистика. По умолчанию этот параметр имеет значение FALSE.

COSTS

Вывести информацию рассчитанную стоимость запуска и общую стоимость каждого узла плана, а также информацию о предполагаемом количестве строк и предполагаемой ширине каждой строки. По умолчанию этот параметр имеет значение TRUE.

SETTINGS

Вывести информацию о параметрах конфигурации. В частности, вывести параметры, влияющие на планирование запроса со значением, отличным от стандартных значения по умолчанию. По умолчанию этот параметр имеет значение FALSE.

BUFFERS

Вывести информацию об использовании буфера. В частности, вывести число попаданий, блоков прочитанных, загрязненных и записанных в разделяемом и локальном буфере, а также число прочитанных и записанных временных блоков. Попадание (hit) считается ситуация, когда требуемый блок уже находится в кеше и чтения с диска удаётся избежать. Блоки в общем буфере содержат данные из обычных таблиц и индексов; в локальном - содержат данные из временных таблиц и индексов; в то время как временные блоки предназначены для краткосрочного использования при выполнении сортировки, хеширования, материализации и подобных узлов плана. Количество загрязненных блоков (dirtied) показывает, сколько ранее не модифицированных блоков изменила данная операция; в то время как количество записанных блоков (written) указывает на количество ранее загрязненных блоков, вытесненных из кэша этим серверным модулем во время обработки запроса. Количество блоков, показанных для узла верхнего уровня, включает блоки, используемые всеми его дочерними узлами. В текстовом формате печатаются только ненулевые значения. Этот параметр действует только в режиме ANALYZE. По умолчанию FALSE.

TIMING

Вывести фактическое время запуска и время, затраченное в каждом узле на выходе. Накладные расходы многократного чтения системных часов могут значительно замедлить запрос в некоторых системах, поэтому может быть полезно установить этот параметр в FALSE когда требуется только фактическое количество строк, а не точное время. Время выполнения всего оператора всегда измеряется, даже если синхронизация на уровне узла отключена с помощью этого параметра. Этот параметр может использоваться только в режиме ANALYZE. По умолчанию TRUE.

SUMMARY

Включить сводку (например, суммарное время) после плана запроса. Сводная информация включается по умолчанию, когда используется ANALYZE, но этот параметр позволяет получить её и с другими вариантами команды. Время планирования в EXPLAIN EXECUTE включает в себя время, необходимое для извлечения плана из кэша и время, необходимое для повторного планирования, если это необходимо.

FORMAT

Установить формат вывода, который может быть TEXT, XML, JSON или YAML. Нетекстовые форматы содержат ту же информацию, что и TEXT, но больше подходят для программного разбора. По умолчанию этот параметр имеет значение TEXT.

boolean

Указывает, должен ли выбранный параметр быть включен или выключен. Для включения параметра можно написать: TRUE, ON, или 1, и FALSE, OFF, или 0 чтобы отключить его. Значение boolean также может быть опущено, в этом случае предполагается TRUE.

оператор

Любой оператор SELECT, INSERT, UPDATE, DELETE, VALUES , EXECUTE , DECLARE , CREATE TABLE AS или CREATE MATERIALIZED VIEW AS, чей план выполнения вы хотите видеть.

Выводимая информация

Результатом выполнения команды является текстовое описание плана, выбранного для оператора, возможно, дополненное статистикой выполнения. Раздел Использование EXPLAIN описывает предоставленную информацию.

Примечания

Чтобы планировщик запросов QHB мог принимать обоснованные решения при оптимизации запросов, данные в pg_statistic должны быть актуальными для всех таблиц, используемых в запросе. Обычно об этом автоматически заботится Процесс «Автовакуум». Но если в содержимом таблицы недавно произошли существенные изменения, может потребоваться вручную выполнить ANALYZE, а не ждать, пока autovacuum догонит изменения.

Чтобы измерить затраты времени выполнения каждого узла в плане выполнения, текущая реализация EXPLAIN ANALYZE добавляет накладные расходы профилирования в выполнение запроса. В результате выполнение EXPLAIN ANALYZE для запроса иногда может занять значительно больше времени, чем обычное выполнение запроса. Объем накладных расходов зависит от характера запроса, а также используемой платформы. Наихудший случай имеет место для узлов плана, которые сами по себе требуют очень мало времени на выполнение, и в операционных системах, где получение текущего времени относительно длительная операция.

Примеры

Получение плана простого запроса для таблицы, содержащей единственный столбец типа integer, с 10000 строк:

EXPLAIN SELECT * FROM foo;

                       QUERY PLAN
---------------------------------------------------------
 Seq Scan on foo  (cost=0.00..155.00 rows=10000 width=4)
(1 row)

План того же запроса, но выведенный в формате JSON:

EXPLAIN (FORMAT JSON) SELECT * FROM foo;
           QUERY PLAN
--------------------------------
 [                             +
   {                           +
     "Plan": {                 +
       "Node Type": "Seq Scan",+
       "Relation Name": "foo", +
       "Alias": "foo",         +
       "Startup Cost": 0.00,   +
       "Total Cost": 155.00,   +
       "Plan Rows": 10000,     +
       "Plan Width": 4         +
     }                         +
   }                           +
 ]
(1 row)

Если в таблице есть индекс, а в запросе присутствует условие WHERE, для которого полезен этот индекс, EXPLAIN может показать другой план:

EXPLAIN SELECT * FROM foo WHERE i = 4;

                         QUERY PLAN
--------------------------------------------------------------
 Index Scan using fi on foo  (cost=0.00..5.98 rows=1 width=4)
   Index Cond: (i = 4)
(2 rows)

План того же запроса, но в формате YAML:

EXPLAIN (FORMAT YAML) SELECT * FROM foo WHERE i='4';
          QUERY PLAN
-------------------------------
 - Plan:                      +
     Node Type: "Index Scan"  +
     Scan Direction: "Forward"+
     Index Name: "fi"         +
     Relation Name: "foo"     +
     Alias: "foo"             +
     Startup Cost: 0.00       +
     Total Cost: 5.98         +
     Plan Rows: 1             +
     Plan Width: 4            +
     Index Cond: "(i = 4)"    
(1 row)

Рассмотрение формата XML оставлено в качестве упражнения для читателя.

План того же запроса без вывода оценок стоимости:

EXPLAIN (COSTS FALSE) SELECT * FROM foo WHERE i = 4;

        QUERY PLAN
----------------------------
 Index Scan using fi on foo
   Index Cond: (i = 4)
(2 rows)

Пример плана для запроса с агрегатной функцией:

EXPLAIN SELECT sum(i) FROM foo WHERE i < 10;

                             QUERY PLAN
---------------------------------------------------------------------
 Aggregate  (cost=23.93..23.93 rows=1 width=4)
   ->  Index Scan using fi on foo  (cost=0.00..23.92 rows=6 width=4)
         Index Cond: (i < 10)
(3 rows)

Пример использования EXPLAIN EXECUTE для отображения плана выполнения подготовленного запроса:

PREPARE query(int, int) AS SELECT sum(bar) FROM test
    WHERE id > $1 AND id < $2
    GROUP BY foo;

EXPLAIN ANALYZE EXECUTE query(100, 200);

                                                       QUERY PLAN                                                       
------------------------------------------------------------------------------------------------------------------------
 HashAggregate  (cost=9.54..9.54 rows=1 width=8) (actual time=0.156..0.161 rows=11 loops=1)
   Group Key: foo
   ->  Index Scan using test_pkey on test  (cost=0.29..9.29 rows=50 width=8) (actual time=0.039..0.091 rows=99 loops=1)
         Index Cond: ((id > $1) AND (id < $2))
 Planning time: 0.197 ms
 Execution time: 0.225 ms
(6 rows)

Конечно, конкретные цифры, показанные здесь, зависят от фактического содержания соответствующих таблиц. Также обратите внимание, что номера и даже выбранная стратегия запроса могут отличаться в разных выпусках QHB из-за улучшений планировщика. Кроме того, команда ANALYZE использует случайную выборку для оценки статистики данных; поэтому оценки затрат можно изменить после нового запуска ANALYZE , даже если фактическое распределение данных в таблице не изменилось.

Совместимость

Команда EXPLAIN отсутствует в стандарте SQL.

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

ANALYZE


FETCH

FETCH — получить результат запроса через курсор

Синтаксис

FETCH [ direction [ FROM | IN ] ] имя_курсора

Где direction может быть не задано или принимать одно из значений:

    NEXT
    PRIOR
    FIRST
    LAST
    ABSOLUTE число
    RELATIVE число
    число
    ALL
    FORWARD
    FORWARD число
    FORWARD ALL
    BACKWARD
    BACKWARD число
    BACKWARD ALL

Описание

FETCH извлекает строки с помощью ранее созданного курсора.

Курсор связан с определённым положением, что и использует команда FETCH. Положение курсора может быть перед первой строкой результата запроса, на любой конкретной строке результата или после последней строки результата. При создании курсор располагается перед первой строкой. После выборки нескольких строк курсор будет расположен на последней полученной строке. Если *FETCH * выполняется до конца доступных строк, то курсор остается расположенным после последней строки или перед первой строкой, если выборка выполняется назад. После команд FETCH ALL и FETCH BACKWARD ALL всегда будет оставлять курсор, после последней строки или перед первой строкой, соответственно.

Формы NEXT, PRIOR, FIRST, LAST, ABSOLUTE и RELATIVE выбирают одну строку после соответствующего перемещения курсора. Если такой строки нет, то возвращается пустой результат, и курсор остается расположенным перед первой строкой или после последней строки соответствующим образом.

Формы с использованием FORWARD и BACKWARD извлекают указанное число строк, сдвигаясь соответственно вперёд или назад; в результате курсор оказывается на последней выданной строке (или перед/после всех строк, если число превышает количество доступных строк).

Формы RELATIVE 0, FORWARD 0 и BACKWARD 0 действуют одинаково - запрашивают выборку текущей строки без перемещения курсора, то есть повторно выбирая строку, которая была извлечена последней. Это произойдет успешно, если курсор не будет расположен перед первой строкой или после последней строки; в этом случае строка не возвращается.

Замечание

На этой странице описывается использование курсоров на уровне команд SQL. Если вы пытаетесь использовать курсоры внутри функции PL/pgSQL, правила будут отличаться — см. раздел Курсоры.

Параметры

direction

direction определяет направление движения и число выбираемых строк. Может быть один из следующих вариантов:

NEXT

Извлечь следующую строку. Это действие подразумевается по умолчанию, если direction опущено.

PRIOR

Извлечь предыдущую строку.

FIRST

Извлечь первую строку запроса (аналогично ABSOLUTE 1).

LAST

Извлечь последнюю строку запроса (аналогично ABSOLUTE -1).

ABSOLUTE число

Извлечь строку под номером число с начала, либо под номером abs(число) с конца, если число отрицательно. Если число выходит за границы набора строк, курсор размещается перед первой или после последней строки; в частности, с ABSOLUTE 0 курсор оказывается перед первой строкой.

RELATIVE число

Извлечь строку под номером число, считая со следующей вперёд, либо под номером abs(число), считая с предыдущей назад, если число отрицательно. RELATIVE 0 повторно считывает текущую строку, если таковая имеется.

число

Извлечь следующее число строк (аналогично FORWARD число).

ALL

Извлечь все оставшиеся строки (аналогично FORWARD ALL).

FORWARD

Извлечь следующую строку (аналогично NEXT).

FORWARD число

Извлечь следующее число строк. FORWARD 0 повторно выбирает текущую строку.

FORWARD ALL

Извлечь все оставшиеся строки.

BACKWARD

Извлечь предыдущую строку (аналогично PRIOR).

BACKWARD число

Извлечь предыдущее число строк (перемещение назад). BACKWARD 0 повторно извлекает текущую строку.

BACKWARD ALL

Извлечь все предыдущие строки (перемещение назад).

число

число — целочисленная константа, возможно со знаком, определяющая смещение или количество выбираемых строк. Для вариантов FORWARD и BACKWARD указание отрицательного числа равнозначно смене направления FORWARD на BACKWARD и наоборот.

имя_курсора

Имя открытого курсора.

Выводимая информация

При успешном выполнении FETCH возвращает метку команды вида

FETCH число

Где число - количество извлеченных строк (возможно, ноль). Обратите внимание, что в qsql метка команды не выдаётся, так как qsql отображает вместо этого извлеченные строки.

Примечания

Курсор должен быть объявлен с указанием SCROLL, если перемещение курсора в FETCH не ограничивается вариантами FETCH NEXT или FETCH FORWARD с положительным числом. Для простых запросов QHB позволит выполнять обратное перемещение курсора, объявленного без SCROLL, но на такое поведение лучше не полагаться. Если курсор объявлен с указанием NO SCROLL, обратное перемещение не допускается.

Вариант ABSOLUTE нисколько не быстрее, чем переход к нужной строке с относительным перемещением: базовая реализация должна пройти все промежуточные строки в любом случае. Отрицательные абсолютные выборки еще хуже: запрос должен быть прочитан до конца, чтобы найти последнюю строку, а затем вернуться назад к указанной строке. Тем не менее, перемотка к началу запроса (FETCH ABSOLUTE 0) идет быстро.

Определить курсор позволяет команда DECLARE, а переместить его, не читая данные, — команда MOVE.

Примеры

Следующий пример демонстрирует перемещение курсора в таблице:

BEGIN WORK;

-- Создание курсора:
DECLARE liahona SCROLL CURSOR FOR SELECT * FROM films;

-- Получение первых 5 строк через курсор liahona:
FETCH FORWARD 5 FROM liahona;

 code  |          title          | did | date_prod  |   kind   |  len
-------+-------------------------+-----+------------+----------+-------
 BL101 | The Third Man           | 101 | 1949-12-23 | Drama    | 01:44
 BL102 | The African Queen       | 101 | 1951-08-11 | Romantic | 01:43
 JL201 | Une Femme est une Femme | 102 | 1961-03-12 | Romantic | 01:25
 P_301 | Vertigo                 | 103 | 1958-11-14 | Action   | 02:08
 P_302 | Becket                  | 103 | 1964-02-03 | Drama    | 02:28

-- Получение предыдущей строки:
FETCH PRIOR FROM liahona;

 code  |  title  | did | date_prod  |  kind  |  len
-------+---------+-----+------------+--------+-------
 P_301 | Vertigo | 103 | 1958-11-14 | Action | 02:08

-- Закрытие курсора и завершение транзакции:
CLOSE liahona;
COMMIT WORK;

Совместимость

Стандарт SQL определяет команду FETCH для использования только для встраиваемого SQL. Вариант FETCH, описанный здесь, возвращает данные, подобно оператору SELECT, а не помещает их в переменные исполняющей среды. В остальном, FETCH полностью прямо-совместима со стандартом SQL.

Формы FETCH с указанием FORWARD и BACKWARD, а также формы FETCH число и *FETCH ALL *(в которых FORWARD подразумевается) являются расширениями QHB.

В стандарте SQL перед именем курсора допускается только указание FROM; возможность указать IN или опустить оба указания относится к расширениям.

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

CLOSE, DECLARE, MOVE

GRANT

GRANT - определить права доступа

Синтаксис

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] имя_таблицы [, ...]
         | ALL TABLES IN SCHEMA имя_схемы [, ...] }
    TO указание_роли [, ...] [ WITH GRANT OPTION ]

GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( имя_столбца [, ...] )
    [, ...] | ALL [ PRIVILEGES ] ( имя_столбца [, ...] ) }
    ON [ TABLE ] имя_таблицы [, ...]
    TO указание_роли [, ...] [ WITH GRANT OPTION ]

GRANT { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { SEQUENCE имя_последовательности [, ...]
         | ALL SEQUENCES IN SCHEMA имя_схемы [, ...] }
    TO указание_роли [, ...] [ WITH GRANT OPTION ]

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE имя_бд [, ...]
    TO указание_роли [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON DOMAIN имя_домена [, ...]
    TO указание_роли [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN DATA WRAPPER имя_обертки_сторонних_данных [, ...]
    TO указание_роли [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN SERVER имя_сервера [, ...]
    TO указание_роли [, ...] [ WITH GRANT OPTION ]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { { FUNCTION | PROCEDURE | ROUTINE } имя_подпрограммы [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ] [, ...]
         | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA имя_схемы [, ...] }
    TO указание_роли [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE имя_языка [, ...]
    TO указание_роли [, ...] [ WITH GRANT OPTION ]

GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
    ON LARGE OBJECT oid_БО [, ...]
    TO указание_роли [, ...] [ WITH GRANT OPTION ]

GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA имя_схемы [, ...]
    TO указание_роли [, ...] [ WITH GRANT OPTION ]

GRANT { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE табл_пространство [, ...]
    TO указание_роли [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON TYPE имя_типа [, ...]
    TO указание_роли [, ...] [ WITH GRANT OPTION ]

GRANT имя_роли [, ...] TO указание_роли [, ...]
    [ WITH ADMIN OPTION ]
    [ GRANTED BY указание_роли ]

Где указание_роли:

    [ GROUP ] имя_роли
  | PUBLIC
  | CURRENT_USER
  | SESSION_USER

Описание

Команда GRANT имеет два основных варианта: один, предоставляющий права доступа к объектам базы данных (таблице, столбцу, представлению, сторонней таблице, последовательности, базе данных, оберткам сторонних данных, сторонним серверам, функциям, процедурам, процедурным языкам, схемам или табличным пространствам), и второй, предоставляющий членство в роли. Эти варианты во многом похожи, но и имеют достаточно отличий, чтобы быть описанными отдельно.

GRANT для объектов баз данных

Этот вариант команды GRANT предоставляет определенные права доступа к объекту базы данных для одной или нескольких ролей. Эти права добавляются к уже предоставленным, если таковые имеются.

Ключевое слово PUBLIC указывает, что права должны быть предоставлены всем ролям, включая те, которые могут быть созданы позже. PUBLIC может рассматриваться как неявно определенная группа, которая всегда включает все роли. Любая конкретная роль будет иметь сумму прав, предоставленных непосредственно ей, прав, предоставленных любой роли, членом которой она в настоящее время является, и прав, предоставленных PUBLIC.

Если указано WITH GRANT OPTION, получатель права может в свою очередь предоставить его другим лицам. Без этого указания получатель не может этого сделать. Группе PUBLIC право передачи права дать нельзя.

Нет необходимости предоставлять права доступа владельцу объекта (как правило, пользователю, который его создал), так как владелец имеет все права доступа по умолчанию. (Владелец может, однако, отказаться от некоторых своих собственных прав для обеспечения безопасности).

Право удалить объект или каким-либо образом изменить его определение не рассматривается в качестве предоставляемого права; оно присуще владельцу и не может быть предоставлено или отозвано. (Однако аналогичный эффект можно получить, предоставив или отозвав членство в роли, которой принадлежит объект; см. ниже). получает право распоряжения всеми правами для своего объекта.

Возможные права:

SELECT

INSERT

UPDATE

DELETE

TRUNCATE

REFERENCES

TRIGGER

CREATE

CONNECT

TEMPORARY

EXECUTE

USAGE

Особые типы прав, определенные в разделе Права.

TEMP

Альтернативное написание для TEMPORARY.

ALL PRIVILEGES

Предоставление всех права доступа, применимые для объекта. Ключевое слово PRIVILEGES является необязательным в QHB, хотя оно обязательно в стандарте SQL.

Синтаксис FUNCTION распространяется для простых функций, агрегатных функций и оконных функций, но не для процедур; для последних предназначен синтаксис PROCEDURE. В качестве альтернативы, используйте ROUTINE чтобы ссылаться на функции, агрегатные функции, оконные функции или процедуры, независимо от точного типа.

Существует также возможность предоставления прав на все объекты одного и того же типа в рамках одной или нескольких схем. В настоящее время эта функция поддерживается только для таблиц, последовательностей, функций и процедур. ALL TABLES также влияет на представления и сторонние таблицы, как GRANT для конкретного объекта. ALL FUNCTIONS также влияет на агрегатные и оконные функции, но не процедуры, опять же, как GRANT для конкретного объекта. тобы включить процедуры воспользуйтесь формой ALL ROUTINES.

GRANT для ролей

Этот вариант команды GRANT предоставляет членство в роли для одной или нескольких других ролей. Членство в роли имеет важное значение, поскольку оно передает права, предоставленные роли каждому из ее членов.

Получивший членство в роли с указанием WITH ADMIN OPTION участник может, в свою очередь, предоставлять членство в роли другим пользователям, а также отменять членство в роли. Без WITH ADMIN OPTION обычные пользователи не могут этого сделать. Роль не имеет права WITH ADMIN OPTION для самой себя, но она может предоставить или отозвать членство в роли в сеансе базы данных, в котором пользователь сеанса соответствует роли. Суперпользователи баз данных могут предоставлять или отменять членство в любой роли кому угодно. Роли с правом CREATEROLE могут предоставлять или отменять членство в любой роли, которая не является суперпользователем.

В отличие от прав, членство в роли не может быть предоставлено группе PUBLIC. Обратите также внимание, что эта форма команды не допускает избыточное слово GROUP в указании_роли.

Примечания

Команда REVOKE используется для отмены прав доступа.

Понятия пользователей и групп были объединены в единый вид сущности, называемый ролью. Поэтому больше нет необходимости использовать ключевое слово GROUP чтобы определить, является ли участник пользователем или группой. Слово GROUP это все еще разрешена в команде, но оно лишено смысловой нагрузки.

Пользователь может выполнить команды SELECT, INSERT и подобные им со столбцом таблицы, если он обладает этим правом для конкретного столбца или для всей таблицы. Предоставление права на уровне таблицы, а затем отмена права для одного из столбцов этой таблицы, не даст желаемого эффекта: операция с правами на уровне столбцов не затронет право на уровне таблицы.

Если пользователь, не являющийся владельцем объекта, попытается назначить право доступа к объекту (с помощью GRANT), эта команда завершится ошибкой, если у пользователя нет никаких прав доступа к объекту. Если же пользователь имеет некоторые права, команда будет выполняться, но будет предоставлять только те права, которые даны ему с правом передачи. Формы GRANT ALL PRIVILEGES выдадут предупреждающее сообщение, если у пользователя вовсе нет таких прав, в то время как другие формы выдадут предупреждение, если пользователь не имеет прав распоряжаться именно правами, указанными в команде. (В принципе эти утверждения применимы и к владельцу объекта, но поскольку владелец всегда рассматривается как обладатель всех прав, такие ситуации невозможны.).

Следует отметить, что суперпользователи баз данных могут обращаться ко всем объектам, независимо от настроек прав объекта. Это сравнимо с правами пользователя root в системе Unix. Как и в случае с root, неразумно работать под суперпользователем, за исключением тех случаев, когда это абсолютно необходимо.

Если суперпользователь решает выполнить команду GRANT или REVOKE, команда выполняется так, как если бы она была выполнялась владельцем затронутого объекта. В частности, права, предоставленные с помощью такой команды, будут представлены как права, назначенные владельцем объекта. (Для членства в роли, членство будет представлено как назначенное самой ролью).

GRANT и REVOKE также могут выполняться ролью, которая не является владельцем затронутого объекта, но является членом роли, которая владеет объектом, или членом роли, которая обладает правами доступа WITH GRANT OPTION для этого объекта. В этом случае права будут записаны как предоставленные ролью, которая фактически владеет объектом или владеет правами доступа WITH GRANT OPTION. Например, если таблица t1 принадлежит роли g1, членом которой является u1, то u1 может предоставлять права на t1 роли u2, но эти права будут предоставлены как назначенные непосредственно ролью g1. Любой другой член роли g1 сможет отозвать их позже.

Если роль, выполняющая команду GRANT, получила на это необходимые права косвенно через несколько путей членства в роли, то не будет определено, какая именно роль назначила право. В таких случаях рекомендуется использовать SET ROLE, чтобы переключиться на конкретную ролью, которую нужно назначить в качестве выполняющей команду GRANT.

Предоставление прав на таблицу не означает автоматического расширения прав на любые последовательности, используемые таблицей, включая последовательности, связанные со столбцами SERIAL. Разрешения на последовательности должны быть установлены отдельно.

Смотрите раздел Права для получения дополнительной информации о конкретных типах прав, а также о том, как просмотреть права объектов.

Примеры

Следующая команда разрешает всем добавлять записи в таблицу films:

GRANT INSERT ON films TO PUBLIC;

Эта команда даёт пользователю manuel все права для представления kinds:

GRANT ALL PRIVILEGES ON kinds TO manuel;

Учтите, что если её выполнит суперпользователь или владелец представления kinds, эта команда действительно даст субъекту все права, но если её выполнит обычный пользователь, субъект получит только те права, которые даны этому пользователю с правом передачи.

Включение в роль admins пользователя joe:

GRANT admins TO joe;

Совместимость

Согласно стандарту SQL, слово PRIVILEGES в указании ALL PRIVILEGES является обязательным. Стандарт SQL не поддерживает установку прав для более чем одного объекта на команду.

QHB позволяет владельцу объекта отозвать свои обычные права: например, владелец таблицы может сделать таблицу доступной только для чтения для себя, отозвав свои собственные права INSERT, UPDATE, DELETE и TRUNCATE. В соответствии со стандартом SQL это невозможно. Причина заключается в том, что QHB рассматривает права владельца как предоставленные владельцем самим себе; поэтому они и могут отозвать их тоже. В стандарте SQL права владельца предоставляются предполагаемой сущностью «_SYSTEM». Так как владелец объекта отличается от «_SYSTEM», лишить себя этих прав он не может.

В соответствии со стандартом SQL, право с правом передачи можно дать субъекту PUBLIC; QHB поддерживает его только при назначении членства ролей, и при этом только суперпользователи могут использовать его нетривиальным образом.

Стандарт SQL предусматривает следующее: право USAGE распространяется на другие виды объектов: наборы символов, правила сортировки, переводы, преобразования.

В стандарте SQL право USAGE для последовательностей управляет использованием выражения NEXT VALUE FOR, которое эквивалентно функции nextval в QHB. Права SELECT и UPDATE для последовательностей являются расширениями QHB. Применение права USAGE для последовательностей управляет использованием функции currval, так же относится к расширениям .

Права доступа к базам данных, табличным пространствам, схемам и языкам являются расширениями QHB.

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

REVOKE, ALTER DEFAULT PRIVILEGES


IMPORT FOREIGN SCHEMA

IMPORT FOREIGN SCHEMA - импортировать определения таблиц со стороннего сервера

Синтаксис

IMPORT FOREIGN SCHEMA удалённая_схема
    [ { LIMIT TO | EXCEPT } ( имя_таблицы [, ...] ) ]
    FROM SERVER имя_сервера
    INTO локальная_схема
    [ OPTIONS ( параметр 'значение' [, ... ] ) ]

Описание

IMPORT FOREIGN SCHEMA создает сторонние таблицы, представляющие таблицы, существующие на стороннем сервере. Новые сторонние таблицы будут принадлежать пользователю, выполнившему команду, и будут созданы с правильными определениями столбцов и параметров, соответствующих удаленным таблицам.

По умолчанию импортируются все таблицы и представления, существующие в определенной схеме на стороннем сервере. При необходимости список таблиц можно ограничить указанным подмножеством или исключить определенные таблицы. Все новые сторонние таблицы создаются в целевой схеме, которая уже должна существовать.

Чтобы использовать IMPORT FOREIGN SCHEMA, пользователь должен иметь право USAGE на стороннем сервере, а также право CREATE в целевой схеме.

Параметры

удалённая_схема

Удаленная схема для импорта из нее. Что именно представляет собой удалённая схема, зависит от применяемой обертки сторонних данных.

LIMIT TO ( имя_таблицы [, ...] )

Импортировать только сторонние таблицы, соответствующие одному из указанных имен таблиц. Другие таблицы, существующие в сторонней схеме, будут игнорироваться.

EXCEPT ( имя_таблицы [, ...] )

Исключить указанные сторонние таблицы из импорта. Все таблицы, существующие в сторонней схеме, будут импортированы, за исключением перечисленных.

имя_сервера

Сторонний сервер для импорта из него.

локальная_схема

Схема, в которой будут созданы импортируемые сторонние таблицы.

OPTIONS ( параметр 'значение' [, ...] )

Параметры, которые будут использоваться во время импорта. Разрешенные имена и значения параметров являются специфичными для каждой обертки сторонних данных.

Примеры

Импорт определений таблиц из удалённой схемы foreign_films на сервере film_server с созданием сторонних таблиц в локальной схеме films:

IMPORT FOREIGN SCHEMA foreign_films
    FROM SERVER film_server INTO films;

Та же операция, но импортируются только таблицы actors и directors (если они существуют):

IMPORT FOREIGN SCHEMA foreign_films LIMIT TO (actors, directors)
    FROM SERVER film_server INTO films;

Совместимость

Команда IMPORT FOREIGN SCHEMA соответствует стандарту SQL, за исключением параметра OPTIONS, являющегося расширением QHB.

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

CREATE FOREIGN TABLE, CREATE SERVER


INSERT

INSERT - добавить новые строки в таблицу

Синтаксис

[ WITH [ RECURSIVE ] запрос_WITH [, ...] ]
INSERT INTO имя_таблицы [ AS псевдоним ] [ ( имя_столбца [, ...] ) ]
    [ OVERRIDING { SYSTEM | USER } VALUE ]
    { DEFAULT VALUES | VALUES ( { выражение | DEFAULT } [, ...] ) [, ...] | запрос }
    [ ON CONFLICT [ объект_конфликта ] действие_при_конфликте ]
    [ RETURNING * | выражение_результата [ [ AS ] имя_результата ] [, ...] ]

Где допускается объект_конфликта может быть:

    ( { имя_столбца_индекса | ( выражение_индекса ) } [ COLLATE правило_сортировки ] [ класс_операторов ] [, ...] ) [ WHERE предикат_индекса ]
    ON CONSTRAINT имя_ограничения

Где действие_при_конфликте может быть:

    DO NOTHING
    DO UPDATE SET { имя_столбца = { выражение | DEFAULT } |
                    ( имя_столбца [, ...] ) = [ ROW ] ( { выражение | DEFAULT } [, ...] ) |
                    ( имя_столбца [, ...] ) = ( вложенный_SELECT )
                  } [, ...]
              [ WHERE условие ]

Описание

INSERT вставляет новые строки в таблицу. Можно вставить одну или несколько строк, указанных выражениями значений, или ноль или несколько строк, полученных в результате запроса.

Имена целевых столбцов могут быть перечислены в любом порядке. Если список имен столбцов вообще не задан, то по умолчанию используются все столбцы таблицы в их объявленном порядке; либо первые N из них, если только N столбцов поступает от предложения VALUES или запроса. Значения, получаемые от предложения VALUES или запроса, связываются с явно или неявно определённым списком столбцов слева направо.

Каждый столбец, не присутствующий в явном или неявном списке столбцов, будет заполнен значением по умолчанию, если они заданы, либо null, если его нет.

Если выражение для любого столбца выдаёт неправильный тип данных, будет предпринята попытка автоматического преобразования типа.

Предложение ON CONFLICT может использоваться для указания альтернативного действия заменяющее возникновение ошибки при нарушении ограничения уникальности или ограничения-исключения. (См. описание Предложение ON CONFLICT ниже).

С необязательным предложением RETURNING команда INSERT вычислит и возвратит значения каждой строки, фактически вставленной (или обновленной, если был использован ON CONFLICT DO UPDATE). Это в первую очередь полезно для получения значений, которые были присвоенных по умолчанию, таких как последовательного номера записи. Однако в этом предложении можно задать любое выражение со столбцами таблицы. Список RETURNING идентичен синтаксису списка результатов SELECT. Будут возвращены только строки, которые были успешно вставлены или обновлены. Например, если строка была заблокирована, но не обновлена, из-за того, что условие в предложении ON CONFLICT DO UPDATE ... WHERE не удовлетворено, строка не будет возвращена.

Чтобы добавлять строки в таблицу, необходимо иметь право INSERT для неё. Если присутствует предложение ON CONFLICT DO UPDATE, требуется право UPDATE для этой таблицы.

Если указан список столбцов, вам нужно иметь только право INSERT для перечисленных столбцов. Точно так же, с предложением ON CONFLICT DO UPDATE, требуется право UPDATE только для столбцов, которые будут изменены. Однако, предложение ON CONFLICT DO UPDATE требует наличия права SELECT для всех столбцов, значения которых считываются выражениях ON CONFLICT DO UPDATE или в условии.

Для использование предложения RETURNING требуется право SELECT для всех столбцов, упомянутых в RETURNING. Если вы используете запрос для вставки строк, вам конечно же нужно иметь право SELECT для любой таблицы или столбца, используемого в запросе.

Параметры

Добавление

В этом разделе описываются параметры, которые могут использоваться только при вставке новых строк. Параметры используемые исключительно
с предложением ON CONFLICT, описываются отдельно.

запрос_WITH

Предложение WITH позволяет указать один или несколько вложенных запросов, на которые можно ссылаться по имени в запросе INSERT. Смотрите раздел WITH и SELECT для получения дополнительной информации.

Это возможно для самого запрос (SELECT оператор), чтобы также содержать a С пункт. В таком случае оба набора запрос_WITH смогите быть снабжено ссылками внутри запрос, но второй имеет приоритет, так как он более тесно вложен.

имя_таблицы

Имя, которое может быть дополнено схемой, существующей таблицы.

псевдоним

Альтернативное имя для имя_таблицы. Когда указывается псевдоним, он полностью скрывает фактическое имя таблицы. Это особенно полезно, когда в предложении ON CONFLICT DO UPDATE фигурирует таблица с именем excluded, поскольку в противном случае это имя будет отдано специальной таблице, представляющей строки, предназначенные для вставки.

имя_столбца

Имя столбца в таблице с именем имя_таблицы. Имя столбца может быть дополнено именем вложенного поля или индексом в массиве, если это необходимо. (Когда данные вставляются только в некоторые поля столбца составного типа, в другие поля записывается NULL). Обращаясь к столбцу в предложении ON CONFLICT DO UPDATE, включать имя таблицы в ссылку на целевой столбец не нужно. Например, запись INSERT INTO table_name ... ON CONFLICT DO UPDATE SET table_name.col = 1 недопустима (это следует из общего поведения для команды UPDATE ).

OVERRIDING SYSTEM VALUE

Без этого предложения указывать явное значение (отличное от значение DEFAULT) для столбца идентификатора, определенного как GENERATED ALWAYS, не допускается. Это предложение переопределяет данное ограничение.

OVERRIDING USER VALUE

Если указано это предложение, то любые значения, предоставляемые для столбцов идентификаторов, определенных как GENERATED BY DEFAULT, игнорируются, и применяются значения, выдаваемые последовательностью по умолчанию.

Это предложение полезно, например, при копировании значений между таблицами.Команда INSERT INTO tbl2 OVERRIDING USER VALUE SELECT * FROM tbl1 скопирует из tbl1 все столбцы, которые не являются столбцами идентификаторами в tbl2, в то время как значения для столбцов идентификаторов в tbl2 будет генерироваться последовательностями, связанными с tbl2.

DEFAULT VALUES

Все столбцы будут заполнены значениями по умолчанию. (Предложение OVERRIDING в этой форме не допускается).

выражение

Выражение или значение для присвоения соответствующему столбцу.

DEFAULT

Соответствующий столбец будет заполнен значением по умолчанию.

запрос

Запрос (оператор SELECT), который выдаст строки для вставки. Описание его синтаксиса см. в справке SELECT.

выражение_результата

Выражение, вычисляемое и возвращаемое командой INSERT после каждой строки, которая вставляется или обновляется. В этом выражении могут использоваться любые имена столбцов таблицы с именем by имя_таблицы. Чтобы вернуть все столбцы вставленных или обновленных строк достаточно написать * .

имя_результата

Имя, используемое для возвращаемого столбца.

Предложение ON CONFLICT

Необязательное предложение ON CONFLICT указывает альтернативное действие заменяющее возникновение ошибки при нарушении ограничения уникальности или ограничения-исключения. Для каждой отдельной строки, предложенной для вставки, либо вставка продолжается, либо, если нарушается решающее ограничение или индекс, указанный как действие_при_конфликте, выполняется альтернативное действие_при_конфликте. Вариант ON CONFLICT DO NOTHING просто отменяет вставку строки в качестве альтернативного действия. Вариант ON CONFLICT DO UPDATE обновляет существующую строку, которая конфликтует со строкой, предложенной для вставки, в качестве альтернативного действия.

Задаваемый объект_конфликта может выбирать уникальный индекс. Определение объекта, позволяющее выбрать индекс, включает один или несколько столбцов (их определяет имя_столбца_индекса) и/или выражение_индекса и необязательный предикат_индекса. Все уникальные индексы в таблице имя_таблицы, которые, без учета порядка столбцов, содержат именно те столбцы/выражения, определяющие объект_конфликта, выбираются в качестве решающих индексов. Если указывается предикат_индекса, он должен, в качестве дополнительного требования выбора, удовлетворять уникальным индексам. Обратите внимание, что это означает, что неполный уникальный индекс (уникальный индекс без предиката) будет выбран (и, таким образом, будет использован в ON CONFLICT) если он удовлетворяет всем остальным критериям. Если попытка выбора не увенчалась успехом, выдаётся ошибка.

ON CONFLICT DO UPDATE гарантирует атомарный результат команды INSERT или UPDATE; при отсутствии внешней ошибки гарантируется один из этих двух результатов, даже при высокой параллельной активности. Эта операция также известна как UPSERT — «UPDATE или INSERT».

объект_конфликта

Указывает, какие именно конфликты в ON CONFLICT будет предпринято решить альтернативным действием, устанавливая *решающие индексы. Это указание позволяет выполнять выбор уникального индекса, либо явно задает имя ограничение. Для ON CONFLICT DO NOTHING, необязательно указывать объект_конфликта; в этом случае игнорироваться будут все конфликты с любыми ограничениями (и уникальными индексами). Для ON CONFLICT DO UPDATE объект_конфликта должен указываться.

действие_при_конфликте

Параметр действие_при_конфликте задаёт альтернативное действие в случае конфликта. Это может DO NOTHING (не делать ничего) или предложение DO UPDATE (произвести изменение), указывающий точные детали операции UPDATE, которое должно быть выполнено в случае возникновения конфликта. Предложения SET и WHERE в ON CONFLICT DO UPDATE могут обращаться к существующей строке с использованием имени таблицы (или псевдонима), а также к строкам, предложенным для вставки с помощью специальной таблицы excluded. Для чтения столбцов excluded необходимо иметь право SELECT для соответствующих столбцов в целевой таблице.

Обратите внимание, что эффекты действий всех триггеров уровня строк BEFORE INSERT отражаются в значениях excluded, так как эти эффекты могут способствовать исключению строки из вставки.

имя_столбца_индекса

Имя столбца в таблице имя_таблицы. Используется для выбора решающих индексов. Задаётся в формате CREATE INDEX. Чтобы запрос выполнился, для столбца имя_столбца_индекса требуется право SELECT.

выражение_индекса

Подобно указанию имя_столбца_индекса, но используется для выбора индекса по выражениям со столбцами имя_таблицы столбцы, объявленным в определениях индексов (а не простым столбцам). Задаётся в формате CREATE INDEX. Для всех столбцов, к которым обращается выражение_индекса, необходимо иметь право SELECT.

правило_сортировки

Когда указано, устанавливает, что соответствующие имя_столбца_индекса или выражение_индекса должны использовать определенный порядок сортировки для сопоставления во время выбора индекса. Обычно это указание опущено, так как правила сортировки обычно не влияют на то, происходит ли нарушение ограничений. Задаётся в формате CREATE INDEX.

класс_операторов

Когда задан, устанавливает, что соответствующие имя_столбца_индекса или выражение_индекса должны использовать определенный класс оператора, для сопоставления во время выбора индекса. Обычно указание опущено, поскольку семантика равенства часто эквивалентна в разных классах операторов типа, и поэтому достаточно доверять тому, что заданные уникальные индексы имеют адекватное определение равенства. Задаётся в формате CREATE INDEX.

предикат_индекса

Используется для разрешения выбора частичных уникальных индексов. Любые индексы, удовлетворяющие предикату (которые на самом деле не должны быть частичными индексами), могут быть выбраны. Задаётся в формате CREATE INDEX. Для всех столбцов, задействованных в предикате_индекса, требуется право SELECT.

имя ограничения

Явно указывает решающее ограничение по имени, что заменяет неявный выбор ограничения или индекса.

условие

Выражение, которое возвращает значение типа логический. Только строки, для которых это выражение возвращает истинный будет обновляться, хотя все строки будут заблокированы, когда ON CONFLICT DO UPDATE принимаются меры. Обратите внимание, что условие оценивается последним, после того как конфликт был определен в качестве кандидата на обновление.

Обратите внимание, что ограничения-исключения не могут быть решающими в ON CONFLICT DO UPDATE. Во всех случаях, в качестве решающих поддерживаются только неоткладываемые (NOT DEFERRABLE) ограничения и уникальные индексы.

Команда INSERT с предложением ON CONFLICT DO UPDATE является «детерминированной». Это означает, что команда не будет иметь права влиять одну существующую строку более одного раза; в случае такой ситуации возникнет ошибка нарушения мощности множества. троки, предлагаемые для вставки, не должны дублировать друг друга с точки зрения атрибутов, ограничиваемых решающим индексом или ограничением.

Обратите внимание, что в настоящее время ситуация, когда конструкция ON CONFLICT DO UPDATE команды INSERT, применяемой к партиционированной таблице изменяет ключ разбиения в конфликтующей строке так, что эта строка должна быть перенесена в новую партицию.

Совет
Часто предпочтительнее использовать неявный выбор уникального индекса, вместо непосредственного указания ограничения в виде ON CONFLICT ON CONSTRAINT имя_ограничения. Выбор будет продолжать работать правильно, когда нижележащий индекс будет заменен другим более или менее эквивалентным индексом методом наложения, например при использовании CREATE UNIQUE INDEX ... CONCURRENTLY и последующим удалением заменяемого индекса.

Выводимая информация

После успешного завершения команда INSERT возвращает метку команды в виде

INSERT oid число

Здесь число представляет количество добавленных или изменённых строк. Поле oid всегда содержит 0 (раньше это был OID, назначенный вставленной строке, если число был ровно 1 и целевая таблица была объявлена указанием WITH OIDS, и 0 в противном случае; но создание таблицы с характеристикой WITH OIDS больше не поддерживается).

Если команда INSERT содержит предложение RETURNING, результат будет похож на результат оператора SELECT, (с теми же столбцами и значениями, что содержатся в списке RETURNING), полученный для строк, добавленных или изменённых этой командой.

Примечания

Если указанная таблица является партиционированной таблицей, то каждая строка направляется в соответствующую партицию и вставляется в нее. Если указанная таблица является партицией, и какая-либо из входных строк нарушает ограничение этой партиции, происходит ошибка.

Примеры

Добавление одной строки в таблицу films:

INSERT INTO films VALUES
    ('UA502', 'Bananas', 105, '1971-07-13', 'Comedy', '82 minutes');

В этом примере столбец len опускается и, таким образом, получает значение по умолчанию:

INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');

В этом примере для столбца с датой задаётся указание DEFAULT, а не явное значение:

INSERT INTO films VALUES
    ('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes');
INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, DEFAULT, 'Drama');

Добавление строки, полностью состоящей из значений по умолчанию:

INSERT INTO films DEFAULT VALUES;

Добавление нескольких строк с использованием многострочного синтаксиса VALUES:

INSERT INTO films (code, title, did, date_prod, kind) VALUES
    ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
    ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');

В этом примере в таблицу films вставляются некоторые строки из таблицы tmp_films, имеющей ту же структуру столбцов, что и films:

INSERT INTO films SELECT * FROM tmp_films WHERE date_prod < '2004-05-07';

Этот пример демонстрирует добавление данных в столбцы с типом массива:

-- Создание пустого поля 3x3 для игры в крестики-нолики
INSERT INTO tictactoe (game, board[1:3][1:3])
    VALUES (1, '{{" "," "," "},{" "," "," "},{" "," "," "}}');
-- Указания индексов в предыдущей команда могут быть опущены
INSERT INTO tictactoe (game, board)
    VALUES (2, '{{X," "," "},{" ",O," "},{" ",X," "}}');

Добавление одной строки в таблицу distributors и получение последовательного номера, сгенерированного благодаря указанию DEFAULT:

INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
   RETURNING did;

Увеличение счётчика продаж для продавца, занимающегося компанией Acme Corporation, и сохранение всей изменённой строки вместе с текущим временем в таблице журнала:

WITH upd AS (
  UPDATE employees SET sales_count = sales_count + 1 WHERE id =
    (SELECT sales_person FROM accounts WHERE name = 'Acme Corporation')
    RETURNING *
)
INSERT INTO employees_log SELECT *, current_timestamp FROM upd;

Добавить дистрибьюторов или изменить существующие данные должным образом. Предполагается, что в таблице определён уникальный индекс, ограничивающий значения в столбце did. Заметьте, что для обращения к значениям, изначально предлагаемым для добавления, используется специальная таблица excluded:

INSERT INTO distributors (did, dname)
    VALUES (5, 'Gizmo Transglobal'), (6, 'Associated Computing, Inc')
    ON CONFLICT (did) DO UPDATE SET dname = EXCLUDED.dname;

Добавить дистрибьютора или не делать ничего для строк, предложенных для добавления, если уже есть существующая исключающая строка (строка, содержащая конфликтующие значения в столбце или столбцах после срабатывания триггеров перед добавлением строки). В данном примере предполагается, что определён уникальный индекс, ограничивающий значения в столбце did:

INSERT INTO distributors (did, dname) VALUES (7, 'Redline GmbH')
    ON CONFLICT (did) DO NOTHING;

Добавить дистрибьюторов или изменить существующие данные должным образом. В данном примере предполагается, что в таблице определён уникальный индекс, ограничивающий значения в столбце did. Предложение WHERE позволяет ограничить набор фактически изменяемых строк (однако любая существующая строка, не подлежащая изменению, всё же будет заблокирована):

-- Не менять данные существующих дистрибьюторов в зависимости от почтового индекса
INSERT INTO distributors AS d (did, dname) VALUES (8, 'Anvil Distribution')
    ON CONFLICT (did) DO UPDATE
    SET dname = EXCLUDED.dname || ' (formerly ' || d.dname || ')'
    WHERE d.zipcode <> '21201';

-- Указать имя ограничения непосредственно в операторе (связанный индекс
-- применяется для принятия решения о выполнении действия DO NOTHING)
INSERT INTO distributors (did, dname) VALUES (9, 'Antwerp Design')
    ON CONFLICT ON CONSTRAINT distributors_pkey DO NOTHING;

Добавить дистрибьютора, если возможно; в противном случае не делать ничего (DO NOTHING). В данном примере предполагается, что в таблице определён уникальный индекс, ограничивающий значения в столбце did по подмножеству строк, в котором булевский столбец is_active содержит true:

-- Этот оператор может выбрать частичный уникальный индекс по "did"
-- с предикатом "WHERE is_active", а может и просто использовать
-- обычное ограничение уникальности по столбцу "did"
INSERT INTO distributors (did, dname) VALUES (10, 'Conrad International')
    ON CONFLICT (did) WHERE is_active DO NOTHING;

Совместимость

INSERT соответствует стандарту SQL, за исключением того, что предложение RETURNING является расширением QHB, как и возможность использовать WITH с INSERT, а также возможность указать альтернативное действие с помощью ON CONFLICT. Кроме того, случай, в котором список имен столбцов опущен, но не все столбцы получают значения из предложения VALUES или запроса.

Стандарт SQL указывает, что предложение OVERRIDING SYSTEM VALUE может быть указано только в том случае, если существует столбец идентификации, для которого всегда генерируется значение. QHB разрешает это предложение в любом случае и игнорирует его, если оно не применимо.

Возможные ограничения по использованию предложения запрос описаны в разделе SELECT .


LISTEN

LISTEN — ожидать уведомления

Синтаксис

LISTEN канал

Описание

LISTEN регистрирует текущий сеанс в качестве прослушивателя на канале уведомлений с именем канал. Если текущий сеанс уже зарегистрирован в качестве прослушивателя для этого канала уведомлений, ничего не делается.

Всякий раз, когда команда *NOTIFY канал вызывается, либо этим сеансом, либо другим, подключенным к той же базе данных, все сеансы, которые в настоящее время прослушивают этот канал уведомлений, уведомляются, и каждый в свою очередь уведомит свое подключенное клиентское приложение.

Сеанс может быть отменен для данного канала уведомлений с помощью команды UNLISTEN. Регистрация прослушивания канала автоматически очищается по окончании сеанса.

Метод, который клиентское приложение должно использовать для обнаружения событий уведомления, зависит от того, какой программный интерфейс приложения QHB оно использует. С библиотекой libpq проблемы приложения прослушивают как обычную команду SQL, а затем должны периодически вызывать функцию PQnotifies чтобы узнать, были ли получены какие-либо события уведомления. Другие интерфейсы, такие как libpgtcl, предоставляют более высокоуровневые методы для обработки событий notify; действительно, с libpgtcl программист приложения не должен даже выдавать LISTEN или UNLISTEN напрямую. Дополнительную информацию смотрите в документации по используемому интерфейсу.

NOTIFY содержит более подробное обсуждение использования LISTEN and NOTIFY .

Параметры

канал

Наименование канала уведомления (любой идентификатор).

Примечания

LISTEN вступает в силу при фиксации транзакции. Если LISTEN или UNLISTEN выполняется в транзакции, которая позже откатывается, набор каналов уведомлений, которые прослушиваются, остается неизменным.

Транзакция, которая выполнила LISTEN, не может быть подготовлена к двухфазной фиксации.

Примеры

Настройка и выполнение последовательности listen/notify от qsql:

LISTEN virtual;
NOTIFY virtual;
Asynchronous notification "virtual" received from server process with PID 8448.

Совместимость

В стандарте SQL нет инструкции LISTEN.

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

NOTIFY, UNLISTEN


LOAD

LOAD - загрузить файл разделяемой библиотеки

Синтаксис

LOAD 'имя_файла'

Описание

Эта команда загружает файл разделяемой библиотеки в адресное пространство сервера QHB. Если файл уже загружен, команда ничего не делает. Файлы разделяемой библиотеки, содержащие функции на C, автоматически загружаются при первом вызове одной из их функций. Поэтому явно выполнять LOAD обычно требуется только для загрузки библиотек, которые изменяют поведение сервера внедряя свои обработчики, а не предоставляют некоторый набор функций.

Имя файла библиотеки обычно задается как простое имя файла, которое ищется в пути поиска библиотек сервера (задается параметром dynamic_library_path). Кроме того, он может быть задан в качестве полного имени пути. В любом случае стандартное расширение имени файла разделяемой библиотеки платформы может быть опущено.

Не суперпользователи могут применять LOAD только для загрузки файлов библиотек, расположенных в $libdir/plugins/ - указанное имя_файла должно начинаться именно с этой строки. (Ответственность за установку только “безопасных” библиотек лежит на администраторе базы данных).

Совместимость

LOAD является расширением QHB.

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

CREATE FUNCTION


LOCK

LOCK - заблокировать таблицу

Синтаксис

LOCK [ TABLE ] [ ONLY ] имя [ * ] [, ...]  [ IN  режим блокировки ] [ NOWAIT ]  

где режим блокировки:  

    ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE
    | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE

Описание

LOCK TABLE получает блокировку уровня таблицы, ожидая при необходимости освобождения всех конфликтующих блокировок. Если указывается NOWAIT, LOCK TABLE не ожидает освобождения таблицы: если блокировка не может быть получена немедленно, команда прерывается и выдается ошибка. После получения, блокировка удерживается на оставшуюся часть текущей транзакции. (Нет никакой команды UNLOCK TABLE; блокировки всегда освобождаются в конце транзакции).

Когда блокируется представление, все отношения, появляющиеся в запросе определения представления, также рекурсивно блокируются с тем же режимом блокировки.

При автоматическом получении блокировок для команд, ссылающихся на таблицы, QHB всегда использует наименее ограничительный режим блокировки. Команда LOCK TABLE предназначена для случаев, когда может потребоваться более строгая блокировка. Например, предположим, что приложение выполняет транзакцию на уровне изоляции транзакций READ COMMITTED и оно должно получать данные неизменными на протяжении всей транзакции. Для достижения этого вы могли бы получить блокировку в режиме SHARE над таблицей перед запросом. Это предотвратит одновременные изменения данных и обеспечит последующее чтение таблицы, потому что режим блокировки SHARE конфликтует с блокировкой ROW EXCLUSIVE, запрашиваемой при записи, а LOCK TABLE имя IN SHARE MODE будет ждать, пока все параллельные транзакции с блокировкой ROW EXCLUSIVE не будут зафиксированы или отменены. Таким образом, в момент получения такой блокировки, не останется никаких открытых незафиксированных операций записи; кроме того, никто не сможет записывать в таблицу, пока блокировка не будет снята.

Для достижения аналогичного эффекта при выполнении транзакции на уровнях изоляции транзакций REPEATABLE READ или SERIALIZABLE, вы должны выполнить оператор LOCK TABLE перед выполнением первого оператора SELECT или оператором, изменяющим данные. Представление данных для транзакции уровня REPEATABLE READ или SERIALIZABLE будет заморожено в момент, когда начнёт выполняться этот запрос. Если команда LOCK TABLE выполняется в транзакции позже, она так же исключает параллельную запись, но она не будет гарантировать, что транзакция будет считывать, последнем зафиксированные значения.

Если транзакция такого рода должна изменить данные в таблице, то она должна использовать режим блокировки SHARE ROW EXCLUSIVE вместо SHARE. Это гарантирует, что в один момент времени будет выполняться только одна транзакция такого типа. Без этого ограничения возможна взаимная блокировка: обе транзакции могут получить блокировки SHARE, и после этого не смогут получить блокировку ROW EXCLUSIVE для того чтобы выполнить изменения. (Обратите внимание, что собственные блокировки транзакции никогда не конфликтуют, поэтому транзакция может получить блокировку ROW EXCLUSIVE, когда она владеет блокировкой SHARE — но не тогда, когда блокировку SHARE удерживает другая транзакция). Чтобы избежать взаимоблокировок, убедитесь, что все транзакции запрашивают блокировки одних и тех же объектах в одном и том же порядке, и если для одного объекта запрашиваются блокировки с разными режимами блокировки, то транзакции всегда должны сначала запрашивать наиболее строгую блокировку.

Дополнительную информацию о режимах блокировки и стратегиях блокировки можно найти в разделе Явная блокировка.

Параметры

имя

Имя, которое может быть дополнено схемой, существующей таблицы для блокировки. Если перед именем таблицы указывается ONLY, то блокируется только эта таблица. Если ONLY не указан, то блокируются таблица и все ее потомки (если таковые имеются). Можно указать необязательное указание * после имени таблицы, чтобы явно указать, что блокировка затрагивает и все таблицы-потомки.

Команда LOCK TABLE a, b; эквивалентна LOCK TABLE a; LOCK TABLE b;. Таблицы блокируются одна за другой в порядке, указанном в команде LOCK TABLE.

режим блокировки

Режим блокировки определяет, с какими блокировками эта блокировка конфликтует. Режимы блокировки описаны в разделе Явная блокировка.

Если режим блокировки не указан, то применяется самый строгий режим ACCESS EXCLUSIVE.

NOWAIT

Указывает, что LOCK TABLE не должна ожидать освобождения конфликтующих блокировок: если указанные блокировки не могут быть получены немедленно без ожидания, транзакция прерывается.

Примечания

LOCK TABLE ... IN ACCESS SHARE MODE требует права SELECT к целевой таблице. LOCK TABLE ... IN ROW EXCUSIVE MODE требует прав INSERT, UPDATE, DELETE или* TRUNCATE* к целевой таблице. Все другие формы LOCK требуют прав UPDATE, DELETE, или TRUNCATE к целевой таблице.

Пользователь, выполняющий блокировку представления, должен иметь соответствующие права для этого представления. Кроме того, владелец представления должен иметь соответствующие права доступа к нижележащим базовым отношениям, но пользователь, выполняющий блокировку, не нуждается в каких-либо правах на базовые отношения.

LOCK TABLE бесполезна вне блока транзакций: блокировка будет удерживаться только до завершения инструкции. Поэтому QHB сообщает об ошибке, если LOCK используется вне блока транзакций. Используйте BEGIN и COMMIT (или ROLLBACK ) для определения блока транзакций.

LOCK TABLE имеет дело только с блокировками уровня таблицы, и поэтому имена режимов с участием ROW не вполне корректны. Эти имена режимов обычно следует читать как указывающие на намерение пользователя получить блокировки на уровне строк в заблокированной таблице. Также, ROW EXCLUSIVE - это разделяемая блокировка таблицы. Имейте в виду, что для LOCK TABLE все режимы блокировки имеют одинаковую семантику, отличаясь только правилами, определяющими, какие режимы конфликтуют друг с другом. Для получения информации о том, как получить фактическую блокировку уровня строки, см. раздел Блокировка на уровне строк и Предложение блокировки в справочной документации по SELECT.

Примеры

Получить блокировку SHARE для первичного ключа таблицы при выполнении операций вставки в подчинённую таблицу:

BEGIN WORK;  
LOCK TABLE films IN SHARE MODE;  
SELECT id FROM films  
    WHERE name = 'Star Wars: Episode I - The Phantom Menace';  
-- Будет выполнен откат, если запись не будет возвращена  
INSERT INTO films_user_comments VALUES  
    (id, 'GREAT! I was waiting for it for so long!');
COMMIT WORK;

Установление блокировки SHARE ROW EXCLUSIVE в таблице первичного ключа перед выполнением операции удаления:

BEGIN WORK;
LOCK TABLE films IN SHARE ROW EXCLUSIVE MODE;
DELETE FROM films_user_comments WHERE id IN
    (SELECT id FROM films WHERE rating < 5);
DELETE FROM films WHERE rating < 5;
COMMIT WORK;

Совместимость

В стандарте SQL нет команды LOCK TABLE, вместо этого в нём используется команда SET TRANSACTION для указания уровней изоляции в транзакциях. QHB поддерживает и этот вариант; смотрите дополнительную информацию в разделе SET TRANSACTION.

За исключением ACCESS SHARE, ACCESS EXCLUSIVE и SHARE UPDATE EXCLUSIVE, режимы блокировки d QHB и синтаксис LOCK TABLE блокировки совместимы с теми, которые присутствуют в СУБД Oracle.


MOVE

MOVE - переместить курсор

Синтаксис

MOVE [ direction [ FROM | IN ] ] имя_курсора

Где direction может быть не задано или принимать одно из значений:

    NEXT
    PRIOR
    FIRST
    LAST
    ABSOLUTE число
    RELATIVE число
    число
    ALL
    FORWARD
    FORWARD число
    FORWARD ALL
    BACKWARD
    BACKWARD число
    BACKWARD ALL

Описание

MOVE перемещает курсор без извлечения каких-либо данных. MOVE работает точно так же, как команда FETCH, за исключением того, что она только позиционирует курсор и не возвращает строки.

Параметры команды MOVE идентичны параметрам команды FETCH; сведения о синтаксисе и использовании см. разделе FETCH.

Выводимая информация

После успешного завершения команда MOVE возвращает метку команды в виде

MOVE число

Где число это число строк, которое вернула бы команда FETCH с теми же параметрами (возможно, ноль).

Примеры

BEGIN WORK;
DECLARE liahona CURSOR FOR SELECT * FROM films;

-- Skip the first 5 rows:
MOVE FORWARD 5 IN liahona;
MOVE 5

-- Fetch the 6th row from the cursor liahona:
FETCH 1 FROM liahona;
 code  | title  | did | date_prod  |  kind  |  len
-------+--------+-----+------------+--------+-------
 P_303 | 48 Hrs | 103 | 1982-10-22 | Action | 01:37
(1 row)

-- Close the cursor liahona and end the transaction:
CLOSE liahona;
COMMIT WORK;

Совместимость

В стандарте SQL нет команды MOVE.

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

CLOSE, DECLARE, FETCH


NOTIFY

NOTIFY - генерация уведомления.

Синтаксис

NOTIFY канал [ , сообщение ]

Описание

Команда NOTIFY отправляет событие уведомления вместе с необязательной строкой "сообщение" каждому клиентскому приложению, которое ранее выполнялось LISTEN канал для указанного имени канала в текущей базе данных. Уведомления отображаются для всех пользователей.

NOTIFY предоставляет простой механизм межпроцессной связи для набора процессов, обращающихся к одной и той же базе данных QHB. Строка полезных данных может быть отправлена вместе с уведомлением, а механизмы более высокого уровня для передачи структурированных данных могут быть построены с помощью таблиц в базе данных для передачи дополнительных данных от уведомителя к прослушивателю(ям).

Информация, передаваемая клиенту для события уведомления, включает имя канала уведомления, идентификатор PID серверного процесса сеанса уведомления и строку полезных данных, которая является пустой строкой, если она не была указана.

Выбор подходящих имён каналов и их назначения — дело проектировщика базы данных. Обычно имя канала совпадает с именем некоторой таблицы в базе данных, и событие по существу означает: “я изменил эту таблицу, взгляните на нее, чтобы увидеть, что нового”. Но никакая такая ассоциация не навязывается командами NOTIFY и LISTEN. Например, проектировщик базы данных может использовать несколько различных имен каналов для передачи сигналов о различных видах изменений в одной таблице. Кроме того, строка полезной нагрузки может использоваться для различения различных случаев.

Когда NOTIFY используется для сигнализации о появлении изменений в определенной таблице, полезным методом программирования является помещение NOTIFY в триггер оператора, который запускается обновлениями таблицы. Таким образом, уведомление происходит автоматически при изменении таблицы, и программист приложения не может случайно забыть сделать это.

NOTIFY взаимодействует с транзакциями SQL несколькими важными способами. Во-первых, если NOTIFY выполняется внутри транзакции, уведомляющие события не доставляются до тех пор, пока транзакция не будет зафиксирована. Это уместно, так как если транзакция прервана, все команды внутри нее не имеют никакого эффекта, включая NOTIFY. Но это может привести в замешательство, если вы ожидаете, что события уведомления будут доставлены немедленно. Во-вторых, если сеанс прослушивания получает сигнал уведомления, пока он находится в транзакции, событие уведомления не будет доставлено своему подключенному клиенту сразу после завершения транзакции (либо зафиксировано, либо прервано). Опять же, рассуждение состоит в том, что если уведомление было доставлено в рамках транзакции, которая позже была прервана, можно было бы захотеть, чтобы уведомление было отменено каким — то образом, но сервер не может “забрать” уведомление, как только он отправил его клиенту. Таким образом, события уведомлений доставляются только между транзакциями. Результатом этого является то, что приложения, использующие NOTIFY для сигнализации в режиме реального времени следует стараться, чтобы их транзакции были короткими.

Если одно и то же имя канала сигнализируется несколько раз из одной транзакции с одинаковыми строками полезных данных, сервер баз данных может принять решение о доставке только одного уведомления. С другой стороны, уведомления с различными строками полезной нагрузки всегда будут доставляться как отдельные уведомления. Аналогично, уведомления от различных транзакций никогда не будут складываться в одно уведомление. За исключением удаления более поздних экземпляров повторяющихся уведомлений, NOTIFY гарантирует, что уведомления от одной и той же транзакции будут доставлены в том порядке, в котором они были отправлены. Также гарантируется, что сообщения от различных транзакций доставляются в том порядке, в котором они были совершены.

Часто бывает, что клиент, выполнивший NOTIFY, ожидает уведомления на этом же канале. В этом случае он получит обратно событие уведомления, так же, как и все другие сеансы прослушивания. В зависимости от логики приложения это может привести к бесполезной работе, например, чтению таблицы базы данных для поиска тех же обновлений, которые только что были записаны в этом сеансе. Можно избежать такой дополнительной работы, заметив, совпадает ли PID процесса сервера уведомляющего сеанса (предоставленный в сообщении о событии уведомления) с PID собственного сеанса (доступным из libpq). Когда они одинаковы, событие уведомления - это собственная нотификация, возвращающаяся назад, и ее можно игнорировать.

Параметры

канал

Название канала уведомлений, который будет оповещен (любой идентификатор).

сообщение

Строка "сообщение", передаваемая вместе с уведомлением. Она должна задаваться простой текстовой константой. В стандартной конфигурации её длина должна быть меньше 8000 байт. (Если требуется передать двоичные данные или большой объём информации, лучше поместить их в таблицу базы данных и передать ключ этой записи.)

Примечания

Существует очередь, которая содержит уведомления, которые были отправлены, но еще не обработаны всеми сеансами прослушивания. Если эта очередь становится полной, транзакции, вызывающие NOTIFY, не смогут выполнить фиксацию. Очередь довольно большая (8 ГБ в стандартной установке) и должна быть достаточно большой для почти каждого случая использования, но если в сеансе выполняется LISTEN, а затем продолжается очень длительная транзакция, очередь не очищается. Как только эта очередь заполняется наполовину, в журнал записываются предупреждения, в которых указывается, какой сеанс препятствует очистке очереди. В этом случае следует добиться завершения текущей транзакции в указанном сеансе, чтобы очередь была очищена.

Функция pg_notification_queue_usage возвращает долю очереди, которая в настоящее время занята ожидающими уведомления. Дополнительную информацию смотрите в разделе Расширенные функции SQL.

Транзакция, которая выполнила NOTIFY, не может быть подготовлена к двухфазной фиксации.

pg_notify

Чтобы отправить уведомление, вы также можете использовать функцию

pg_notify(text, text)

Функция принимает имя канала в качестве первого аргумента, а полезную нагрузку (сообщение) - во втором. Эта функция намного проще в использовании, чем команда NOTIFY, если вам нужно работать с изменяемыми именами каналов и полезными нагрузками.

Примеры

Настройка и выполнение последовательности listen/notify от qsql:

LISTEN virtual;
NOTIFY virtual;
Asynchronous notification "virtual" received from server process with PID 8448.
NOTIFY virtual, 'This is the payload';
Asynchronous notification "virtual" with payload "This is the payload" received
from server process with PID 8448.

LISTEN foo;
SELECT pg_notify('fo' || 'o', 'pay' || 'load');
Asynchronous notification "foo" with payload "payload" received from server
process with PID 14728.

Совместимость

В стандарте SQL нет инструкции NOTIFY.

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

LISTEN, UNLISTEN

PREPARE

PREPARE — подготовить оператор для исполнения

Синтаксис

PREPARE имя [ ( тип_данных [, ...] ) ] AS оператор

Описание

PREPARE создает подготовленный оператор. Подготовленный оператор - это объект на стороне сервера, который можно использовать для оптимизации производительности. При выполнении инструкции PREPARE указанный оператор разбирается, анализируется и перезаписывается. При последующем выполнении команды EXECUTE подготовленный оператор планируется и исполняется. Это разделение труда позволяет избежать повторяющейся работы по повторному разбору запроса, при этом позволяет выбрать наилучший план выполнения в зависимости от определённых значений параметров.

Подготовленные операторы могут принимать параметры: значения, которые подставляются в оператор при его выполнении. При создании подготовленного оператора к этим параметрам можно обращаться по порядковому номеру, используя запись $1, $2. При необходимости можно указать соответствующий список типов данных параметров. Если тип данных параметра не указан или объявлен как неизвестный(unknown), тип выводится из контекста, при первом обращении к этому параметру (если это возможно). При выполнении оператора фактические значения параметров передаются команде EXECUTE. Смотрите раздел EXECUTE для получения дополнительной информации об этом.

Подготовленные операторы существуют только в течение текущего сеанса работы с базой данных. Когда сеанс заканчивается, система забывает подготовленный оператор , поэтому его необходимо воссоздать перед повторным использованием. Это также означает, что один подготовленный оператор не может использоваться одновременно несколькими клиентами базы данных; однако каждый клиент может создать свой собственный подготовленный оператор для использования. Подготовленные операторы можно очистить вручную с помощью команды DEALLOCATE.

Подготовленные операторы потенциально обладают наибольшим преимуществом производительности, когда один сеанс используется для выполнения большого количества однотипных операторов. Разница в производительности будет особенно существенной, если операторы сложны для планирования или перезаписи, например, если запрос включает соединение многих таблиц или требует применения нескольких правил. Если оператор относительно прост в планировании и переписывании, но относительно дорог для выполнения, преимущество производительности подготовленных операторов будет менее заметным.

Параметры

имя

Произвольное имя, данное этому конкретному подготовленному оператору. Оно должно быть уникальным в пределах одного сеанса и впоследствии используется для выполнения или освобождения ранее подготовленного оператора.

тип_данных

Тип данных параметра для подготовленного оператора. Если тип данных конкретного параметра не определен или указан как unknown, он будет выведен из контекста, при первом обращении к этому параметру. Для обращения к параметрам в самом подготовленном операторе используется запись $1, $2.

оператор

Любой оператор SELECT, INSERT, UPDATE, DELETE или VALUES.

Примечания

Подготовленный оператор может быть выполнен либо с общим планом, либо со специализированным . Общий план является одинаковым для всех выполнений, в то время как специализированный план создается для конкретного выполнения с использованием значений параметров, заданных в этом вызове. Использование общего плана позволяет избежать накладных расходов на планирование, но в некоторых ситуациях выполнение специализированного плана будет гораздо более эффективным, поскольку планировщик может подстроиться под значения параметров. (Конечно, если подготовленный оператор не имеет параметров, специализированный план не имеет смысла, и всегда используется общий план).

По умолчанию (то есть, когда plan_cache_mode установлен в auto), сервер автоматически выберет, следует ли использовать общий или специализированный план для подготовленного оператора с параметрами. Текущее правило состоит в том, что первые пять исполнений выполняются с специализированными планами и рассчитывается средняя расчетная стоимость этих планов. Затем создается общий план,и его расчетная стоимость сравнивается со средней стоимостью специализированного плана. Последующие выполнения используют общий план, если его стоимость по сравнению со стоимостью специализированных, не настолько велика, чтобы делать повторное перепланирование.

Эту логику можно переопределить, заставляя сервер использовать либо только общие, либо специализированные планы, установив для параметра plan_cache_mode значение force_generic_plan или force_custom_plan соответственно. Этот параметр в первую очередь полезен, если оценка стоимости общего плана по какой-либо причине плохо работает, что позволяет выбрать его, даже если его фактическая стоимость намного больше, чем у специализированного плана.

Чтобы узнать план запроса, который выбирает QHB для подготовленного оператора, используйте команду EXPLAIN, например

EXPLAIN EXECUTE имя(значения_параметров);

Если используется общий план, он будет содержать символы параметров $n, в то время как специализированный план будет иметь фактические значения параметров, подставленные в него.

Дополнительную информацию о планировании запросов и статистике, собранной QHB для этой цели, смотрите в документации по команде ANALYZE.

Хотя основной целью подготовленных операторов является предотвращение повторного разбора и планирования оператора, QHB будет принудительно заново анализировать и планировать выполнение оператора всякий раз, когда объекты базы данных, используемые в операторе, подвергаются изменениям определения (DDL) с момента предыдущего использования подготовленного оператора. Кроме того, если значение search_path изменяется от одного использования к другому, оператор будет повторно разобран с новым search_path. С этими правилами использование подготовленного оператора по сути почти не отличается от выполнения одного и того же запроса снова и снова, но с преимуществом производительности, если определения объектов не изменяются, особенно если оптимальный план остается тем же самым из раза в раз. Примером случая, когда различия всё же могут проявиться, является то, что если оператор обращается к таблице по неполному имени, а затем новая таблица с таким же именем создается в схеме, стоящей в пути search_path раньше, автоматический пересмотр запроса не происходит, так как ни один объект, используемый в операторе, не изменился. Однако, если какое-то другое изменение вызывает повторный анализ, при последующем выполнении запроса будет задействована новая таблица.

Получить список всех доступных в сеансе подготовленных операторов можно, обратившись к системному представлению pg_prepared_statements.

Примеры

Создание подготовленного оператора для команды INSERT, который затем выполняется:

PREPARE fooplan (int, text, bool, numeric) AS
    INSERT INTO foo VALUES($1, $2, $3, $4);
EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);

Создание подготовленного оператора для команды SELECT, который затем выполняется:

PREPARE usrrptplan (int) AS
    SELECT * FROM users u, logs l WHERE u.usrid=$1 AND u.usrid=l.usrid
    AND l.date = $2;
EXECUTE usrrptplan(1, current_date);

В этом примере тип данных второго параметра не указывается, так что он выводится из контекста, в котором используется $2.

Совместимость

Стандарт SQL включает инструкцию PREPARE, но она предназначена только для использования во встраиваемом SQL. Эта версия инструкции PREPARE также использует несколько иной синтаксис.

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

DEALLOCATE, EXECUTE


PREPARE TRANSACTION

PREPARE TRANSACTION - подготовить текущую транзакцию к двухфазной фиксации

Синтаксис

PREPARE TRANSACTION id_транзакции

Описание

PREPARE TRANSACTION подготавливает текущую транзакцию к двухфазной фиксации. После выполнения этой команды транзакция больше не связана с текущим сеансом; вместо этого ее состояние полностью сохраняется на диске, и существует очень высокая вероятность того, что она может быть успешно зафиксирована, даже если сбой базы данных происходит до запроса фиксации.

После подготовки транзакция может быть впоследствии зафиксирована или откачена с помощью COMMIT PREPARED или ROLLBACK PREPARED соответственно. Эти команды могут быть выполнены из любого сеанса, а не только из того, в котором эта транзакция создавалась.

С точки зрения сеанса, выполняющего команду PREPARE TRANSACTION не отличается от команды ROLLBACK: после ее выполнения нет активной текущей транзакции, и эффекты подготовленной транзакции больше не видны. (Последствия станут видимыми снова, если транзакция будет зафиксирована).

Если команда PREPARE TRANSACTION по какой-либо причине завершается неудачно, команда действует как ROLLBACK: текущая транзакция отменяется.

Параметры

id_транзакции

Произвольный идентификатор, который позже идентифицирует эту транзакцию для COMMIT PREPARED или ROLLBACK PREPARED . Идентификатор должен быть записан в виде строковой константы и иметь длину менее 200 байт. Он не должен совпадать с идентификатором, используемым для любой текущей подготовленной транзакции.

Примечания

PREPARE TRANSACTION не предназначена для использования в приложениях или интерактивных сеансах. Его цель заключается в том, чтобы позволить внешнему менеджеру транзакций выполнять атомарные глобальные транзакции охватывающие несколько несколько баз данных или других транзакционных ресурсов. Если вы не разрабатываете собственный менеджер транзакций, вы, вероятно, не должны использовать PREPARE TRANSACTION.

Эта команда должна использоваться внутри блока транзакций. Начинает блок транзакции команда BEGIN.

В настоящее время команда PREPARE не способна подготавливать транзакцию, в которой выполнялись какие-либо операции с временными таблицами или временным пространством имен сеанса, создавались какие-либо курсоры WITH HOLD, или выполнялись команды LISTEN, UNLISTEN, или NOTIFY . Эти функции слишком тесно связаны с текущим сеансом, чтобы быть полезными в транзакции, которую необходимо подготовить.

Если транзакция изменила какие-либо параметры времени выполнения командой SET (без указания LOCAL), их значения сохраняются после PREPARE TRANSACTION и не будут затронуты более поздним выполнением команд COMMIT PREPARED или ROLLBACK PREPARED . Таким образом, в этом отношении PREPARE TRANSACTION действует скорее как COMMIT, чем как ROLLBACK.

Все доступные в настоящее время подготовленные транзакции перечислены в системном представлении pg_prepared_xacts.

Внимание

Оставлять транзакции в подготовленном состоянии на длительное время неразумно. Это будет препятствовать способности VACUUM высвобождать пространство, и в крайних случаях может привести к отключению базы данных для предотвращения зацикливания ID транзакций (см. раздел Предотвращение ошибок wraparound идентификатора транзакции ). Имейте в виду также, что транзакция продолжает удерживать все свои блокировки. Предполагаемое использование этой функции заключается в том, что подготовленная транзакция обычно фиксируется или откатывается, как только внешний менеджер транзакций убедится, что другие базы данных также готовы к фиксации.

Если вы не настроили внешний менеджер транзакций для отслеживания подготовленных транзакций и обеспечения их своевременного закрытия, лучше всего отключить функцию подготовки транзакций, установив значение max_prepared_transactions равным нулю. Это предотвратит случайное создание подготовленных транзакций, которые затем могут быть забыты и в конечном итоге вызвать проблемы.

Примеры

Текущая транзакция подготавливается для двухфазной фиксации, при этом ей назначается идентификатор foobar:

PREPARE TRANSACTION 'foobar';

Совместимость

PREPARE TRANSACTION является расширением QHB. Она предназначена для использования внешними системами управления транзакциями, некоторые из которых охвачены стандартами (например, X/Open XA), но сторона SQL этих систем не стандартизирована.

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

COMMIT PREPARED, ROLLBACK PREPARED

REASSIGN OWNED

REASSIGN OWNED - изменить владельца объектов базы данных, принадлежащих роли базы данных

Синтаксис

REASSIGN OWNED BY { старая_роль | CURRENT_USER | SESSION_USER } [, ...]
               TO { новая_роль | CURRENT_USER | SESSION_USER }

Описание

REASSIGN OWNED указывает системе сменить владельца объектов базы данных, принадлежащих одной из старых_ролей, на новую роль.

Параметры

старая_роль

Название роли. Права собственности на все объекты в текущей базе данных и на все общие объекты (базы данных, табличные пространства), принадлежащие этой роли, будут переназначены на новая_роль.

новая_роль

Имя роли, которая будет сделана новым владельцем затронутых объектов.

Примечания

Команда REASSIGN OWNED часто используется для подготовки к удалению одной или нескольких ролей. Поскольку REASSIGN OWNED не влияет на объекты в других базах данных, обычно необходимо выполнить эту команду в каждой базе данных, содержащей объекты, принадлежащие удаляемой роли.

Для выполнения команды REASSIGN OWNED требуется членство как в исходной, так и в целевой роли.

Команда DROP OWNED является альтернативой, которая просто удаляет все объекты базы данных, принадлежащие одной или нескольким ролям.

Команда REASSIGN OWNED не влияет ни на какие права, предоставленные пользователю старая_роль на объекты, которые им не принадлежат. Кроме того, это не влияет на права по умолчанию, созданные с помощью команды ALTER DEFAULT PRIVILEGES. Отозвать эти права можно, воспользовавшись командой DROP OWNED.

Дополнительную информацию см. разделе Удаление ролей.

Совместимость

Команда REASSIGN OWNED является расширением QHB.

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

DROP OWNED, DROP ROLE, ALTER DATABASE


REFRESH MATERIALIZED VIEW

REFRESH MATERIALIZED VIEW - заменить содержимое материализованного представления

Синтаксис

REFRESH MATERIALIZED VIEW [ CONCURRENTLY ] имя
    [ WITH [ NO ] DATA ]

Описание

REFRESH MATERIALIZED VIEW полностью заменяет содержимое материализованного представления. Для выполнения этой команды текущий пользователь должен быть владельцем материализованного представления. Старое содержимое удаляется. Если задается (или по умолчанию) WITH DATA нижележащий запрос выполняется для предоставления новых данных, и материализованное представление остается в состоянии сканирования. Если указывается WITH NO DATA, новые данные не выдаются, а материализованное представление остается в несканируемом состоянии.

CONCURRENTLY и WITH NO DATA не могут быть не указаны вместе.

Параметры

CONCURRENTLY

Обновить материализованное представление без блокировки параллельных выборок из него. Без этой опции обновление, которое влияет на большое количество строк, будет иметь тенденцию использовать меньше ресурсов и завершаться быстрее, но может блокировать другие соединения, которые пытаются читать из материализованного представления. Этот режим может быть быстрее в тех случаях, когда затрагивается небольшое количество строк.

Этот параметр разрешен только в том случае, если имеется хотя бы один UNIQUE индекс на материализованном представлении, который использует только имена столбцов и включает все строки; то есть он не должен быть индексом выражения или включать пункт WHERE .

Этот параметр нельзя использовать, если материализованное представление еще не заполнено.

Даже с этим параметром в один момент времени допускается только одно обновление (REFRESH) материализованного представления.

имя

Имя, которое может быть дополнено схемой, материализованного представления для обновления.

Примечания

Хотя индекс по умолчанию для операций CLUSTER команда REFRESH MATERIALIZED VIEW сохраняет, и не упорядочивает генерируемые строки по нему. Если вы хотите, чтобы данные были упорядочены при создании, вы должны использовать ORDER BY предложение в определяющем запросе.

Примеры

Эта команда заменяет содержимое материализованного представления order_summary, используя запрос из определения материализованного представления, и оставляет его в сканируемом состоянии:

REFRESH MATERIALIZED VIEW order_summary;

Эта команда освобождает пространство, связанное с материализованным представлением annual_statistics_basis, и оставляет это представление в несканируемом состоянии:

REFRESH MATERIALIZED VIEW annual_statistics_basis WITH NO DATA;

Совместимость

REFRESH MATERIALIZED VIEW является расширением QHB.

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

CREATE MATERIALIZED VIEW, ALTER MATERIALIZED VIEW, DROP MATERIALIZED VIEW

REINDEX

REINDEX - перестроить индекс

Синтаксис

REINDEX [ ( VERBOSE ) ] { INDEX | TABLE | SCHEMA | DATABASE | SYSTEM } [ CONCURRENTLY ] имя

Описание

REINDEX перестраивает индекс, обрабатывая данные, хранящиеся в таблице индекса, заменяя старую копию индекса. Существует несколько сценариев, в которых можно использовать REINDEX:

  • Индекс был поврежден и его содержимое стало некорректным. Хотя в теории этого никогда не должно произойти, на практике индексы могут быть повреждены из-за ошибок программного обеспечения или аппаратных сбоев. В таких случаях REINDEX предоставляет метод восстановления.

  • Индекс стал "раздутым", то есть он содержит много пустых или почти пустых страниц. Это может произойти с индексами B-дерева в QHB при определенных необычных сценариях использования. REINDEX предоставляет возможность сократить объём, занимаемый индексом записывая новую версию индекса без «мёртвых» страниц. Дополнительную информацию смотрите в разделе Регулярная переиндексация.

  • Вы изменили параметр хранения (например, fillfactor) для индекса и хотите убедиться, что изменение вступило в силу.

  • Если построение индекса завершается неудачно в режиме CONCURRENTLY , этот индекс остаётся в «нерабочем» состоянии. Такие индексы бесполезны, но используя REINDEX их легко перестроить. Обратите внимание, что перестраивать индекс в неблокирующем режиме может только команда REINDEX INDEX.

Параметры

INDEX

Перестраивает указанный индекс.

TABLE

Перестраивает все индексы указанной таблицы. Если таблица имеет дополнительная таблицу "TOAST", то она также будет переиндексирована.

SCHEMA

Перестраивает все индексы указанной схемы. Если таблица этой схемы имеет дополнительная таблицу "TOAST", то она также будет переиндексирована. Также обрабатываются индексы в общих системных каталогах. Эта форма REINDEX не может быть выполнена внутри блока транзакций.

DATABASE

Перестраивает все индексы в текущей базе данных. Также обрабатываются индексы в общих системных каталогах. Эта форма REINDEX не может быть выполнена внутри блока транзакций.

SYSTEM

Перестраивает все индексы в системных каталогах в текущей базе данных. Индексы в общих системных каталогах будут обработаны. Индексы в пользовательских таблицах не обрабатываются. Эта форма REINDEX не может быть выполнена внутри блока транзакций.

имя

Имя конкретного индекса, таблицы или базы данных, подлежащих переиндексации. Имена индексов и таблиц могут быть дополнены схемой. В настоящее REINDEX DATABASE и REINDEX SYSTEM могут переиндексировать только текущую базу данных, поэтому параметр должен соответствовать имени текущей базы данных.

CONCURRENTLY

Если используется этот параметр, QHB будет перестраивать индекс, не устанавливая никаких блокировок, которые предотвращают параллельные вставки, обновления или удаления в таблице; в то время как стандартное перестроение индекса блокирует запись (но не чтение) в таблице, до своего завершения. Существует несколько предупреждений, которые следует учитывать при использовании этого параметра — см. раздел Неблокирующее перестроение индексов.

VERBOSE

Выводит отчет о ходе работы по мере переиндексации каждого индекса.

Примечания

Если вы подозреваете повреждение индекса в пользовательской таблице, вы можете перестроить этот индекс или все индексы в таблице, используя REINDEX INDEX или REINDEX TABLE .

Все становится сложнее, если вам нужно восстановить поврежденный индекс в системной таблице. В этом случае важно, чтобы система сама не использовала этот подозрительный индекс. (В этом случае вы можете обнаружить, что серверные процессы будут отказывают при запуске из-за зависимости от поврежденных индексов). Для безопасного восстановления сервер должен быть запущен с параметром -P, который отключает использование индексов при поиске в системных каталогах.

Один из способов сделать это - выключить сервер и запустить QHB в однопользовательском режиме, с параметром -P в командной строке. Затем можно выполнить REINDEX DATABASE, REINDEX SYSTEM, REINDEX TABLE или REINDEX INDEX, в зависимости от того, что вы хотите восстановить. Если вы сомневаетесь, используйте команду REINDEX SYSTEM чтобы перестроить все системные индексы в базе данных. завершите однопользовательский сеанс сервера и перезапустите сервер в обычном режиме. Дополнительную информацию о том, как работать с сервером в однопользовательском интерфейсе, смотрите на справочной странице QHB.

Кроме того, можно запустить обычный экземпляр сервера, но добавить в параметры командной строки -P. В разных клиентах это может делаться по-разному, но во всех клиентах на базе libpq можно установить для переменной окружения PGOPTIONS значение -P до запуска клиента. Обратите внимание, что хотя этот метод не требует блокировки других клиентов, все же было бы разумно запретить другим пользователям подключаться к поврежденной базе данных до завершения восстановления.

Действие REINDEX подобно удалению и повторному созданию индекса в том, что содержимое индекса перестраивается с нуля. Тем не менее, блокировки при этом устанавливаются другие. Команда REINDEX блокирует операции записи, но не чтение из родительской таблицы индекса. Она также устанавливает исключительную блокировку на обрабатываемый индекс, которая блокирует чтение при котором задействуется этот индекс. DROP INDEX, напротив, мгновенно устанавливает исключительную блокировку на родительской таблице, блокируя как запись, так и чтение. Последующая CREATE INDEX блокирует запись, но не чтение; поскольку индекс отсутствует, при чтении не будет попыток обращения к нему, что означает, что не будет никакой блокировки, но выполняться чтение будет как дорогостоящее последовательное сканирование.

Для перестраивания одного индекса или таблицы текущий пользователь должен быть владельцем этого индекса или таблицы. Для переиндексирования схемы или базы данных текущий пользователь должен быть владельцем этой схемы или базы данных. Обратите внимание, что таким образом, не только суперпользователи могут перестраивать индексы таблиц, принадлежащих другим пользователям. Однако из этих правил есть исключение — когда команду REINDEX DATABASE, REINDEX SCHEMA или REINDEX SYSTEM выполняет не суперпользователь, индексы общих каталогов будут пропущены, если только пользователь не владеет каталогом (как правило, это так). Конечно, суперпользователи всегда могут переиндексировать всё без ограничений.

Переиндексирование партиционированных таблиц или партиционированных индексов не поддерживается. Вместо этого каждую партицию можно переиндексировать отдельно.

Неблокирующее перестроение индексов

Перестроение индекса может помешать регулярной работе базы данных. Обычно QHB блокирует таблицу, индекс которой перестраивается, на запись, и выполняет всю операцию перестройки индекса за одно сканирование таблицы. Другие транзакции по-прежнему могут читать таблицу, но при попытке вставки, обновления или удаления строк в таблице они будут блокироваться до завершения перестроения индекса. Это может иметь серьезные последствия, если система является производственной базы данных. Индексирование очень больших таблиц может занять много часов, и даже для небольших таблиц перестройка индекса может заблокировать запись в таблицы на время, которое будет неприемлемо большим для производственной системы.

QHB поддерживает перестроение индексов с минимальной блокировкой записи. Этот режим вызывается путем указания CONCURRENTLY команды REINDEX. При использовании этого параметра QHB должна выполнить два сканирования таблицы для каждого индекса, который необходимо перестроить, и дождаться завершения всех существующих транзакций, которые потенциально могут использовать индекс. Этот метод требует в целом большего количества действий, чем стандартное перестроение индекса, и занимает значительно больше времени для завершения, поскольку нужно дождаться незавершенных транзакций, которые могут изменить индекс. Однако, поскольку он позволяет продолжить обычные операции во время перестроения индекса, этот метод полезен для перестроения индексов в производственной среде. Конечно, дополнительная загрузка процессора, памяти и ввода-вывода, наложенная перестроением индекса, может замедлить другие операции.

При неблокирующем переиндексировании выполняются следующие шаги. Каждый шаг выполняется в отдельной транзакции. Если необходимо перестроить несколько индексов, то каждый шаг выполняется для всех индексов, прежде чем перейти к следующему шагу.

  1. В каталог добавляется новое определение временного индекса pg_index. Это определение будет использоваться для замены старого индекса.Чтобы предотвратить любые изменения в схеме во время обработки выполняется блокировка SHARE UPDATE EXCLUSIVE на уровне сеанса, для переиндексируемых индексов, а также связанных с ними таблиц,

  2. Первый проход для построения индекса выполняется для каждого нового индекса. После того, как индекс построен, его флаг pg_index.indisready переключается в "true", чтобы этот индекс был готов к добавлениям, и таким образом он становится видимым для других сеансов сразу после окончания построившей его транзакции. Этот шаг выполняется в отдельной транзакции для каждого индекса.

  3. Затем выполняется второй проход для внесения в индекс кортежей, которые были добавлены во время выполнения первого прохода. Этот шаг также выполняется в отдельной транзакции для каждого индекса.

  4. Все ограничения, относящиеся к индексу, переключаются на определение нового индекса, а также изменяются имена индексов. В этот момент, флаг pg_index.indisvalid переключается в "true“ для нового индекса и в "false" для старого, и производится сброс кеша, в результате чего все сеансы, которые ссылались на старый индекс, получают новую информацию.

  5. Старые индексы имеют pg_index.indisready сбрасываются в "false", чтобы предотвратить любые новые вставки кортежей, как только завершатся текущие запросы, которые могут ссылаться на старый индекс.

  6. Старые индексы удаляются. Блокировки SHARE UPDATE EXCLUSIVE уровня сеанса, установленные для индексов и таблиц, снимаются.

Если при перестроении индексов возникает проблема, например нарушение уникальности в уникальном индексе, команда REINDEX завершится ошибкой, но оставит после себя «нерабочий» новый индекс в дополнение к уже существующему. Этот индекс будет игнорироваться запросами, поскольку он может быть неполным; однако он все равно будет обновляться при изменении данных, что повлечёт дополнительные издержки. Команда qsql \d сообщит о таком индексе, как NOT VALID:

qhb=# \d tab
       Table "public.tab"
 Column |  Type   | Modifiers
--------+---------+-----------
 col    | integer |
Indexes:
    "idx" btree (col)
    "idx_ccnew" btree (col) INVALID

Рекомендуемым методом восстановления в таких случаях является удаление такого индекса и повторная попытка выполнить REINDEX CONCURRENTLY. Создаваемый в процессе переиндексации новый индекс получает имя с окончанием ccnew, а переименованный старый индекс, который может сохраниться, если его не удастся удалить, — имя с окончанием ccold. Некорректные индексы могут быть удалены с помощью команды DROP INDEX, включая индексы TOAST.

Обычные построения индексов позволяют другим Обычное построениям индексов в одной и той же таблице выполняться одновременно, но одновременно в таблице может выполняться только одно неблокирующее построение индексов. В обоих случаях никакие другие изменения схемы таблицы в это время не разрешаются. Другое отличие состоит в том, что обычная команда REINDEX TABLE или REINDEX INDEX может выполняться в блоке транзакций, но не REINDEX CONCURRENTLY.

REINDEX SYSTEM не поддерживает указание CONCURRENTLY, так как системные каталоги не могут быть переиндексированы в неблокирующем режиме.

Кроме того, индексы связанные с ограничениями-исключениями не могут быть переиндексированы в неблокирующем режиме. Если явно указать имя такого индекса в команде, будет выдана ошибка. Если таблица или база данных с с такими индексами переиндексируются в неблокирующем режиме, эти индексы будут пропущены. (Можно переиндексировать такие индексы без опции CONCURRENTLY ).

Примеры

Перестроение одного индекса:

REINDEX INDEX my_index;

Перестроение всех индексов таблицы my_table:

REINDEX TABLE my_table;

Перестроение всех индексов в определённой базе данных, в предположении, что целостность системных индексов под сомнением:

$ export PGOPTIONS="-P"
$ psql broken_db
...
broken_db=> REINDEX DATABASE broken_db;
broken_db=> \q

Перестроение индексов таблицы, допускающее одновременные операции чтения и записи с затрагиваемыми в процессе переиндексации отношениями:

REINDEX TABLE CONCURRENTLY my_broken_table;

Совместимость

В стандарте SQL нет команды REINDEX.

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

CREATE INDEX, DROP INDEX


RELEASE SAVEPOINT

RELEASE SAVEPOINT - высвободить ранее определенную точку сохранения

Синтаксис

RELEASE [ SAVEPOINT ] имя_точки_сохранения

Описание

RELEASE SAVEPOINT высвобождает точку сохранения, ранее определенную в текущей транзакции.

Высвобождение точки сохранения делает ее неприменимой в качестве точки отката, но никаких других проявлений, видимых для пользователя, эта команда не имеет. Она не отменяет действие команд, выполненных после установки точки сохранения. (Для этого предназначена команда ROLLBACK TO SAVEPOINT). Высвобождение точки сохранения, когда она больше не нужна, позволяет системе восстановить некоторые ресурсы до завершения транзакции.

RELEASE SAVEPOINT также высвобождает все точки сохранения, которые были установлены после установки именованной точки сохранения.

Параметры

имя_точки_сохранения

Имя точки сохранения для высвобождения.

Примечания

Указание имени точки сохранения, которое ранее не было определено, является ошибкой.

Невозможно освободить точку сохранения, когда транзакция находится в прерванном состоянии.

Если несколько точек сохранения имеют одинаковое имя, освобождается только та, которая была определена последней.

Примеры

Этот пример показывает, как установить и затем уничтожить точку сохранения:

BEGIN;
    INSERT INTO table1 VALUES (3);
    SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (4);
    RELEASE SAVEPOINT my_savepoint;
COMMIT;

Данная транзакция вставит значения 3 и 4.

Совместимость

Команда RELEASE SAVEPOINT соответствует стандарту SQL. Стандарт указывает, что ключевое слово SAVEPOINT является обязательным, но QHB позволяет его опустить.

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

BEGIN, COMMIT, ROLLBACK , ROLLBACK TO SAVEPOINT, SAVEPOINT


RESET

RESET - восстановление значения параметра времени выполнения до значения по умолчанию.

Синтаксис

RESET параметр_конфигурации
RESET ALL

Описание

RESET восстанавливает параметры времени выполнения до их значений по умолчанию. RESET - это альтернативное написание команды

SET параметр_конфигурации TO DEFAULT

Смотрите раздел SET для получения дополнительной информации.

Значение по умолчанию определяется как значение, которое имел бы параметр, если бы для него никогда в текущем сеансе не выполнялась бы команда SET. Фактическим источником этого значения может быть скомпилированное значение по умолчанию, файл конфигурации, параметры командной строки или параметры по умолчанию для каждой базы данных или для каждого пользователя. Это немного отличается от определения его как “значение, которое параметр имел при запуске сеанса”, потому что если значение пришло из файла конфигурации, оно будет сброшено к тому, что указано в файле конфигурации в настоящий момент. Смотрите дополнительную информацию в главе Конфигурация сервера.

Транзакционное поведение команды RESET совпадает с RESET: его эффекты будут отменены откатом транзакции.

Параметры

параметр_конфигурации

Имя настраиваемого параметра времени выполнения. Доступные параметры описаны в главе Конфигурация сервера и на странице SET.

ALL

Сбрасывает все настраиваемые параметры времени выполнения до значений по умолчанию.

Примеры

Установить переменную конфигурации timezone в значение по умолчанию:

RESET timezone;

Совместимость

Команда RESET - является расширением QHB.

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

SET, SHOW


REVOKE

REVOKE - отозвать права доступа

Синтаксис

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] имя_таблицы [, ...]
         | ALL TABLES IN SCHEMA имя_схемы [, ...] }
    FROM указание_роли [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | REFERENCES } ( имя_столбца [, ...] )
    [, ...] | ALL [ PRIVILEGES ] ( имя_столбца [, ...] ) }
    ON [ TABLE ] имя_таблицы [, ...]
    FROM указание_роли [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { SEQUENCE имя_последовательности [, ...]
         | ALL SEQUENCES IN SCHEMA имя_схемы [, ...] }
    FROM указание_роли [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE имя_бд [, ...]
    FROM указание_роли [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON DOMAIN имя_домена [, ...]
    FROM указание_роли [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN DATA WRAPPER имя_обертки_сторонних_данных [, ...]
    FROM указание_роли [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN SERVER имя_сервера [, ...]
    FROM указание_роли [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { EXECUTE | ALL [ PRIVILEGES ] }
    ON { { FUNCTION | PROCEDURE | ROUTINE } имя_функции [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ] [, ...]
         | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA имя_схемы [, ...] }
    FROM указание_роли [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE имя_языка [, ...]
    FROM указание_роли [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
    ON LARGE OBJECT oid_БО [, ...]
    FROM указание_роли [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA имя_схемы [, ...]
    FROM указание_роли [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE табл_пространство [, ...]
    FROM указание_роли [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON TYPE имя_типа [, ...]
    FROM указание_роли [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ ADMIN OPTION FOR ]
    имя_роли [, ...] FROM указание_роли [, ...]
    [ GRANTED BY указание_роли ]
    [ CASCADE | RESTRICT ]

Где указание_роли:

    [ GROUP ] имя_роли
  | PUBLIC
  | CURRENT_USER
  | SESSION_USER

Описание

Команда REVOKE отменяет ранее предоставленные права доступа для одной или нескольких ролей. Ключевое слово PUBLIC обозначает неявно определённую группу всех ролей.

См. Описание команды GRANT для определения типов прав.

Обратите внимание, что любая конкретная роль будет иметь сумму прав, предоставленных непосредственно ей, прав, предоставленных любой роли, членом которой она в настоящее время является, и прав, предоставленных группе PUBLIC. Таким образом, например, удаление у роли PUBLIC права SELECT не обязательно означает, что все роли потеряют права SELECT для объекта: те, кто получил право непосредственно или через другую роль, все равно будут иметь право SELECT. Аналогично, удаление у пользователя права SELECT
может не повлиять на его возможность пользоваться правом SELECT, если это право выдано группе PUBLIC или другой роли, у которой есть это право, и в которую пользователь включен.

Если указано GRANT OPTION FOR, отзывается только право передачи права, а не само право. В противном случае и право, и возможность предоставления будут отменены.

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

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

При отзыве членства в роли, указание GRANT OPTION меняется на ADMIN OPTION, но поведение очень похоже. Обратите также внимание, что эта форма команды не принимает избыточное слово GROUP в указании_роли.

Примечания

Пользователь может отозвать только те права, которые были предоставлены непосредственно им. Если, например, пользователь A предоставил право с правом передачи пользователю B, а пользователь B, в свою очередь, предоставил его пользователю C, то пользователь A не может отозвать право непосредственно от C. Вместо этого пользователь A может отозвать право передачи у пользователя B и использовать параметр CASCADE, чтобы право в свою очередь было отозвано у пользователя C. В другом примере, если и A и B предоставили одно и то же право пользователю C, A может отозвать переданное им право, но если В свое не отзовет, пользователь C все равно будет иметь это право.

Если команду REVOKE пытается выполнить не владелец заданного объекта, то команда завершится ошибкой, если у пользователя нет никаких прав доступа к этому объекту. Если же у пользователя есть некоторые права, команда будет выполняться, но будут отменены только те права, которые даны ему с правом распоряжения ими. Формы REVOKE ALL PRIVILEGES будут выдавать предупреждающее сообщение, если у пользователя нет никаких прав, в то время как другие формы выдадут предупреждение, если пользователь не имеет права распоряжаться именно правами, указанными в команде. (В принципе эти утверждения применимы и к владельцу объекта, но ему разрешено распоряжаться всем правами, поэтому такие ситуации невозможны).

Если суперпользователь выполняет команду GRANT или REVOKE, команда выполняется так, как если бы она выполнялась владельцем заданного объекта. Поскольку все права в конечном счете исходят от владельца объекта (возможно, косвенно через цепочки или через право распоряжением правом), суперпользователь может отозвать все права, но это может потребовать использования CASCADE как уже говорилось выше.

Команда REVOKE также может быть выполнена ролью, которая не является владельцем заданного объекта, но является членом роли, которой принадлежит объект, или членом роли, обладающей правами доступа WITH GRANT OPTION для объекта. В этом случае команда выполняется так, как если бы она была выполнялась содержащей ролью, которая фактически владеет объектом или имеет права доступа WITH GRANT OPTION. Например, если таблица t1 принадлежит роли g1, членом которой является роль u1, то u1 может отзывать права на t1 которые записаны как предоставленные ролью g1. В том числе это могут быть права, данные ролью u1, а также другими членами роли g1.

Если роль, выполняющая команду REVOKE, получила права косвенно через несколько путей членства в ролях, не будет определено, какая именно роль будет выбрана для выполнения команды. В таких случаях рекомендуется использовать команду SET ROLE, чтобы переключиться на конкретную роль, которую вы хотите выполнить команду REVOKE. Невыполнение этого требования может привести к отмене прав, отличных от тех, которые вы намеревались, или вообще ничего не отменить.

Смотрите раздел Права для получения дополнительной информации о конкретных типах прав, а также о том, как проверять права объектов.

Примеры

Удаление у группы public права добавлять данные в таблицу films:

REVOKE INSERT ON films FROM PUBLIC;

Удаление у пользователя manuel всех прав для представления kinds:

REVOKE ALL PRIVILEGES ON kinds FROM manuel;

Заметьте, что на самом деле это означает «Удаление все права, которые были выданы мной».

Исключение из членов роли admins пользователя joe:

REVOKE admins FROM joe;

Совместимость

Примечания по совместимости команды GRANT применяются аналогично для REVOKE . Ключевое слово RESTRICT или CASCADE требуется в соответствии со стандартом, но QHB предполагает RESTRICT по умолчанию.

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

GRANT, ALTER DEFAULT PRIVILEGES


ROLLBACK

ROLLBACK - прервать текущую транзакцию

Синтаксис

ROLLBACK [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ]

Описание

ROLLBACK откатывает текущую транзакцию и приводит к тому, что все изменения, сделанные транзакцией, будут отброшены.

Параметры

WORK
TRANSACTION

Необязательные ключевые слова. Не имеют никакого эффекта.

AND CHAIN

Если указывается AND CHAIN , то сразу после окончания текущей транзакции начинается новая с теми же характеристиками, что и только что завершенная (см. раздел SET TRANSACTION). В противном случае новая транзакция не начинается.

Примечания

Используйте COMMIT для успешного завершения и фиксации транзакции.

При выполнении ROLLBACK вне блока транзакций будет выдано предупреждение, и больше ничего не произойдет.Однако ROLLBACK AND CHAIN вне блока транзакции вызывает ошибку.

Примеры

Отмена всех изменений:

ROLLBACK;

Совместимость

Команда ROLLBACK соответствует стандарту SQL. Форма ROLLBACK TRANSACTION является расширением QHB.

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

BEGIN, COMMIT, ROLLBACK TO SAVEPOINT


ROLLBACK PREPARED

ROLLBACK PREPARED - отменить транзакцию, которая ранее была подготовлена для двухфазной фиксации

Синтаксис

ROLLBACK PREPARED id_транзакции

Описание

ROLLBACK PREPARED откатывает транзакцию,которая находится в подготовленном состоянии (prepared).

Параметры

id_транзакции

Идентификатор транзакции, которую нужно откатить.

Примечания

Чтобы откатить подготовленную транзакцию, текущий пользователь должен быть тем же пользователем, который выполнял транзакцию изначально, либо суперпользователем. Но при этом не обязательно работать в том же сеансе, где выполнялась транзакция.

Эта команда не может быть выполнена внутри блока транзакций. Подготовленная транзакция откатывается немедленно.

Все доступные в настоящее время подготовленные транзакции перечислены в системном представлении pg_prepared_xacts.

Примеры

Откат транзакции, имеющей идентификатор foobar:

ROLLBACK PREPARED 'foobar';

Совместимость

ROLLBACK PREPARED является расширением QHB. Она предназначена для использования внешними системами управления транзакциями, некоторые из которых охватываются стандартами (например, X/Open XA), но сторона SQL этих систем не стандартизирована.

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

PREPARE TRANSACTION, COMMIT PREPARED


ROLLBACK TO SAVEPOINT

ROLLBACK TO SAVEPOINT — откат к точке сохранения

Синтаксис

ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] имя_точки_сохранения

Описание

Откат всех команд, выполненных после установки точки сохранения. Точка сохранения остается действительной и при необходимости можно снова откатиться к ней позже.

ROLLBACK TO SAVEPOINT неявно уничтожает все точки сохранения, которые были установлены после заданной точки сохранения.

Параметры

имя_точки_сохранения

Точка сохранения, к которой нужно откатиться.

Примечания

Используйте команду RELEASE SAVEPOINT чтобы уничтожить точку сохранения, не отменяя действия команд, выполненных после ее установки.

Указание имени точки сохранения, которое не было установлено, является ошибкой.

Курсоры имеют несколько нетранзакционное поведение по отношению к точкам сохранения. Любой курсор, открытый внутри точки сохранения, будет закрыт при откате точки сохранения. Если ранее открытый курсор был перемещён командой FETCH или MOVE внутри точки сохранения, которая затем откатывается назад, Курсор остается в том положении, в которой он остался после FETCH (т. е. движение курсора, вызванное FETCH, не откатывается). Также при откате не отменяется и закрытие курсора. Однако другие побочные эффекты, вызванные запросом курсора (например, побочные действия вызываемых запросом изменчивых функций)отменяются, если они происходят после точки сохранения, к которой затем происходит откат. Курсор, выполнение которого приводит к прерыванию транзакции, переводится в нерабочее состояние и не может быть выполнен, поэтому , хотя транзакция может быть восстановлена с помощью ROLLBACK TO SAVEPOINT, курсор больше не может использоваться.

Примеры

Отмена действия команд, выполненных после установки точки сохранения my_savepoint:

ROLLBACK TO SAVEPOINT my_savepoint;

Откат к точке сохранения не отражается на положении курсора:

BEGIN;

DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2;

SAVEPOINT foo;

FETCH 1 FROM foo;
 ?column? 
----------
        1

ROLLBACK TO SAVEPOINT foo;

FETCH 1 FROM foo;
 ?column? 
----------
        2

COMMIT;

Совместимость

Стандарт SQL указывает, что ключевое слово SAVEPOINT является обязательным, но QHB и Oracle позволяют его опустить. SQL позволяет только WORK, но не TRANSACTION, в качестве избыточного слова после ROLLBACK. Кроме того, в SQL есть дополнительное предложение AND [ NO ] CHAIN, которое в настоящее время не поддерживается QHB. В остальном эта команда соответствует стандарту SQL.

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

BEGIN, COMMIT, RELEASE SAVEPOINT, ROLLBACK, SAVEPOINT


SAVEPOINT

SAVEPOINT - определение новой точки сохранения в текущей транзакции

Синтаксис

SAVEPOINT имя_точки_сохранения

Описание

SAVEPOINT устанавливает новую точку сохранения в текущей транзакции.

Точка сохранения - это специальная метка внутри транзакции, которая позволяет выполнить откат всех команд, выполняемых после того, как она была установлена, восстанавливая состояние транзакции до того, каким оно было на момент установки точки сохранения.

Параметры

имя_точки_сохранения

Имя, которое нужно присвоить новой точке сохранения.

Примечания

Используйте команду ROLLBACK TO SAVEPOINT для отката к точке сохранения. Используйте RELEASE SAVEPOINT для уничтожения точки сохранения, сохраняя изменения, произведённые после того, как она была установлена.

Точки сохранения можно установить только внутри блока транзакции. В транзакции может быть определено несколько точек сохранения.

Примеры

Чтобы установить точку сохранения, а затем отменить действие всех команд, выполненных после ее создания:

BEGIN;
    INSERT INTO table1 VALUES (1);
    SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (2);
    ROLLBACK TO SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (3);
COMMIT;

Вышеуказанная транзакция вставит в таблицу значения 1 и 3, но не 2.

Этот пример показывает, как установить и затем уничтожить точку сохранения:

BEGIN;
    INSERT INTO table1 VALUES (3);
    SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (4);
    RELEASE SAVEPOINT my_savepoint;
COMMIT;

Данная транзакция вставит значения 3 и 4.

Совместимость

Стандарт SQL требует, чтобы точка сохранения уничтожалась автоматически при установки другой точки сохранения с тем же именем. В QHB сохраняется старая точка сохранения, хотя при откате или освобождении будет использоваться только самая последняя. (Освобождение новой точки сохранения с помощью RELEASE SAVEPOINT приведет к тому, что старая точка сохранения снова станет доступной для команд ROLLBACK TO SAVEPOINT и RELEASE SAVEPOINT). В остальном команда SAVEPOINT полностью соответствует стандарту.

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

BEGIN, COMMIT, RELEASE SAVEPOINT, ROLLBACK, ROLLBACK TO SAVEPOINT


SECURITY LABEL

SECURITY LABEL - определение или изменение метки безопасности, примененную к объекту

Синтаксис

SECURITY LABEL [ FOR провайдер ] ON
{
  TABLE имя_объекта |
  COLUMN имя_таблицы.имя_столбца |
  AGGREGATE имя_агрегатной_функции ( сигнатура_агрегатной_функции ) |
  DATABASE имя_объекта |
  DOMAIN имя_объекта |
  EVENT TRIGGER имя_объекта |
  FOREIGN TABLE имя_объекта
  FUNCTION имя_функции [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ] |
  LARGE OBJECT oid_большого_объекта |
  MATERIALIZED VIEW имя_объекта |
  [ PROCEDURAL ] LANGUAGE имя_объекта |
  PROCEDURE имя_процедуры [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ] |
  PUBLICATION имя_объекта |
  ROLE имя_объекта |
  ROUTINE имя_подпрограммы [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ] |
  SCHEMA имя_объекта |
  SEQUENCE имя_объекта |
  SUBSCRIPTION имя_объекта |
  TABLESPACE имя_объекта |
  TYPE имя_объекта |
  VIEW имя_объекта
} IS 'метка'

Где сигнатура_агрегатной_функции:

* |
[ режим_аргумента ] [ имя_аргумента ] тип_аргумента [ , ... ] |
[ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [ , ... ] ] ORDER BY [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [ , ... ]

Описание

SECURITY LABEL применяет метку безопасности к объекту базы данных. С объектом базы данных можно связать произвольное количество меток безопасности, по одной на каждого провайдера. Провайдеры меток - это загружаемые модули, которые регистрируются с помощью функции register_label_provider.

Заметка
register_label_provider это не SQL-функция; она может быть вызвана только из кода C, загруженного в серверную часть.

Провайдер меток определяет, является ли данная метка допустимой и допустимо ли присвоить эту метку данному объекту. Какой смысл вкладывается в данную метку, тоже определяет провайдер меток. QHB не накладывает никаких ограничений на то, как провайдер меток должен интерпретировать метки безопасности; он просто предоставляет механизм их хранения. На практике это средство предназначено для обеспечения интеграции с системами обязательного контроля доступа на основе меток (MAC), такими как SE-Linux. Такие системы принимают все решения по управлению доступом на основе меток объектов, а не на традиционных концепциях избирательного управления доступом (DAC), таких как пользователи и группы.

Параметры

имя_объекта
имя_таблицы.имя_столбца
имя_агрегатной_функции
имя_функции
имя_процедуры
имя_подпрограммы

Имя маркеруемого объекта. Имена таблиц, агрегатных и обычных функций, доменов, сторонних таблиц, процедур, подпрограмм, последовательностей, типов и представлений могут быть дополнены именем схемы.

провайдер

Имя провайдера, с которым должна быть связана эта метка. Указанный провайдер должен быть загружен и должен быть готов к предложенной операции маркировки. Если загружен только один провайдер, имя провайдера может быть опущено для краткости.

режим_аргумента

Режим аргумента функции, процедуры или агрегатной функции: IN, OUT, INOUT или VARIADIC. Если этот параметр опущен, значение по умолчанию равно IN. Обратите внимание, что SECURITY LABEL на самом деле не обращает никакого внимания на OUT аргументы, так как только входные аргументы необходимы для определения идентичности функции. Так что достаточно перечислить IN, INOUT, и VARIADIC аргументы.

имя_аргумента

Имя аргумента функции, процедуры или агрегатной функции. Обратите внимание, что SECURITY LABEL на самом деле не обращает никакого внимания на имена аргументов, поскольку для определения идентификатора функции необходимы только типы данных аргументов.

тип_аргумента

Тип данных аргумента функции, процедуры или агрегата.

oid_большого_объекта

OID большого объекта.

PROCEDURAL

Это слово не несёт смысловой нагрузки.

метка

Новая метка безопасности, записанная как строковая константа; либо NULL чтобы удалить метку безопасности.

Примеры

Следующий пример показывает, как можно изменить метку безопасности для таблицы.

SECURITY LABEL FOR selinux ON TABLE mytable IS 'system_u:object_r:sepgsql_table_t:s0';

Совместимость

В стандарте SQL нет команды SECURITY LABEL.


SELECT

SELECT, TABLE, WITH - получение строк из таблицы или представления

Синтаксис

[ WITH [ RECURSIVE ] запрос_WITH [, ...] ]
SELECT [ ALL | DISTINCT [ ON ( выражение [, ...] ) ] ]
    [ * | выражение [ [ AS ] имя_результата ] [, ...] ]
    [ FROM элемент_FROM [, ...] ]
    [ WHERE условие ]
    [ GROUP BY элемент_группирования [, ...] ]
    [ HAVING условие [, ...] ]
    [ WINDOW имя_окна AS ( определение_окна ) [, ...] ]
    [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] выборка ]
    [ ORDER BY выражение [ ASC | DESC | USING оператор ] [ NULLS { FIRST | LAST } ] [, ...] ]
    [ LIMIT { число | ALL } ]
    [ OFFSET начало [ ROW | ROWS ] ]
    [ FETCH { FIRST | NEXT } [ число ] { ROW | ROWS } ONLY ]
    [ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF имя_таблицы [, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ]

Где элемент_FROM может содержать:

    [ ONLY ] имя_таблицы [ * ] [ [ AS ] псевдоним [ ( псевдоним_столбца [, ...] ) ] ]
                [ TABLESAMPLE метод_выборки ( аргумент [, ...] ) [ REPEATABLE ( затравка ) ] ]
    [ LATERAL ] ( выборка ) [ AS ] псевдоним [ ( псевдоним_столбца [, ...] ) ]
    имя_запроса_WITH [ [ AS ] псевдоним [ ( псевдоним_столбца [, ...] ) ] ]
    [ LATERAL ] имя_функции ( [ аргумент [, ...] ] )
                [ WITH ORDINALITY ] [ [ AS ] псевдоним [ ( псевдоним_столбца [, ...] ) ] ]
    [ LATERAL ] имя_функции ( [ аргумент [, ...] ] ) [ AS ] псевдоним ( определение_столбца [, ...] )
    [ LATERAL ] имя_функции ( [ аргумент [, ...] ] ) AS ( определение_столбца [, ...] )
    [ LATERAL ] ROWS FROM( имя_функции ( [ аргумент [, ...] ] ) [ AS ( определение_столбца [, ...] ) ] [, ...] )
                [ WITH ORDINALITY ] [ [ AS ] псевдоним [ ( псевдоним_столбца [, ...] ) ] ]
    элемент_FROM [ NATURAL ] тип_соединения элемент_FROM [ ON условие_соединения | USING ( столбец_соединения [, ...] ) ]

Где элемент_группирования может содержать:

    ( )
    выражение
    ( выражение [, ...] )
    ROLLUP ( { выражение | ( выражение [, ...] ) } [, ...] )
    CUBE ( { выражение | ( выражение [, ...] ) } [, ...] )
    GROUPING SETS ( элемент_группирования [, ...] )

Где запрос_WITH может содержать:

    имя_запроса_WITH [ ( имя_столбца [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( выборка | values | insert | update | delete )

TABLE [ ONLY ] имя_таблицы [ * ]

Описание

SELECT извлекает строки из перечня таблиц, возможно пустого. Общая обработка SELECT выглядит следующим образом:

  1. Вычисляются все запросы в списке WITH. Они фактически служат временными таблицами, к которым можно обращаться в списке FROM. Запрос WITH, на который в FROM обращаются более одного раза, вычисляется только один раз, если иное не указано в параметре NOT MATERIALIZED. (См. Предложение WITH ниже).

  2. Вычисляются все элементы в списке FROM. (Каждый элемент в списке FROM - это реальная или виртуальная таблица). Если в списке
    указано более одного элемента, они объединяются перекрестным соединением. (См. Предложение FROM ниже).

  3. Если указано предложение WHERE, все строки, которые не удовлетворяют условию, исключаются из результата. (См. Предложение WHERE ниже).

  4. Если указывается GROUP BY, любо, если вызываются агрегатные функции, то вывод объединяется в группы строк, соответствующие одному или нескольким значениям, и вычисляются результаты агрегатных функций. Если присутствует предложение HAVING, оно исключает группы, не удовлетворяющие данному условию. (См. Предложение GROUP BY и Предложение HAVING ниже).

  5. Вычисляются фактические выходные строки по заданным в SELECT выражениям для каждой выбранной строки или группы строк. (См. Список SELECT ниже).

  6. SELECT DISTINCT удаляет повторяющиеся строки из результата. SELECT DISTINCT ON удаляет строки, соответствующие всем указанным выражениям. SELECT ALL (значение по умолчанию) возвращает все строки-кандидаты, включая дубликаты. (См. Предложение DISTINCT ниже).

  7. Операторы UNION, INTERSECT и EXCEPT объединяют выходные данные нескольких операторов SELECT в один результирующий набор. Оператор UNION возвращает все строки, находящиеся в одном или обоих результирующих наборах. Оператор INTERSECT возвращает все строки, которые строго находятся в обоих результирующих наборах. Оператор EXCEPT возвращает строки, которые находятся в первом результирующем наборе, но не во втором. Во всех трех случаях повторяющиеся строки исключаются, если только явно не задан оператор ALL. Необязательный оператор DISTINCT может быть добавлен, чтобы явно указать, что требуется устранение повторяющихся строк. Заметьте, что DISTINCT - это поведение по умолчанию, хотя в самом SELECT подразумевается ALL по умолчанию. (См. Предложение UNION, Предложение INTERSECT и Предложение EXCEPT ниже).

  8. Если указывается предложение ORDER BY, возвращаемые строки сортируются в указанном порядке. Если ORDER BY не задается, строки возвращаются в любом порядке, который система считает наиболее быстрым для получения. (См. Предложение ORDER BY ниже).

  9. Если указаны предложения LIMIT (или FETCH FIRST) или OFFSET, инструкция SELECT возвращает только подмножество результирующих строк. (См. Предложение LIMIT ниже).

  10. Если указано FOR UPDATE, FOR NO KEY UPDATE, FOR SHARE или FOR KEY SHARE, оператор SELECT блокирует выбранные строки от одновременных обновлений. (См. Предложение блокировки ниже). Для всех столбцов, задействованных в команде SELECT, необходимо иметь право SELECT. Использование блокировок FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE или FOR KEY SHARE требует права UPDATE (по крайней мере, для одного столбца каждой таблицы, выбранной для блокировки таким образом).

Параметры

Предложение WITH

Предложение WITH позволяет указать один или несколько подзапросов, на которые можно ссылаться по имени в основном запросе. Подзапросы действуют как временные таблицы или представления на протяжении выполнения всего основного запроса. Каждый подзапрос может представлять собой оператор SELECT, TABLE, VALUES, INSERT, UPDATE или DELETE. При использовании в WITH операторов, изменяющих данные (INSERT, UPDATE или DELETE), обычно добавляется предложение RETURNING. Обратите внимание, что именно результат RETURNING, а не нижележащая таблица, изменяемая запросом, формирует временную таблицу, которую затем читает основной запрос. Если RETURNING опущено, оператор тем не менее выполняется, но он не выдает никаких выходных данных, поэтому на него нельзя ссылаться в качестве таблицы в основном запросе.

Имя (без схемы) должно быть указано для каждого запроса WITH. При необходимости можно указать список имен столбцов; если этот список опущен, имена столбцов выводятся из подзапроса.

Если указано RECURSIVE, подзапрос SELECT может ссылаться сам на себя по имени. Такой подзапрос должен иметь вид

нерекурсивная_часть UNION [ ALL | DISTINCT ] рекурсивная_часть

где рекурсивная_часть должна появиться только в правой части от UNION. Для каждого запроса допускается только одна рекурсивная ссылка. Рекурсивные операторы изменяющие данные не поддерживаются, но вы можете использовать результаты рекурсивного запроса SELECT в таких операторах. См. раздел Запросы WITH для примера.

Ещё одна особенность RECURSIVE заключается в том, что запросы WITH не должны быть упорядоченными: запрос может ссылаться на другой, который находится в списке после него. (Однако циклические ссылки или взаимная рекурсия не поддерживаются). Без RECURSIVE запросы в WITH могут ссылаться только на запросы того же уровня в WITH, находящиеся ранее в списке WITH.

Основной запрос и все запросы WITH, условно говоря, выполняются одновременно. Это означает, что действие оператора изменяющего данные в WITH не будет видно из других частей запроса, кроме как при чтении его вывода в RETURNING. Если два таких оператора изменения данных пытаются изменить одну и ту же строку, результат будет неопределённым.

Ключевое свойство запросов WITH в том, что они обычно вычисляются только один раз для всего основного запроса, даже если основной запрос ссылается на них более одного раза. В частности, операторы изменения данных гарантированно выполняются один и только один раз, независимо от того, будет ли их результат прочитан основным запросом и в каком объёме.

Однако, добавив для запроса WITH пометку NOT MATERIALIZED можно отказаться от этой гарантии. В таком случае, запрос WITH может быть свернут в основной запрос так же, как если бы это был простой SELECT внутри предложения FROM основного запроса. Это приводит к дублированию вычислений, если основной запрос ссылается на запрос в WITH более одного раза; но если для каждого такого использования требуется только несколько строк из всего результата запроса WITH, указание NOT MATERIALIZED, позволяющее оптимизировать запросы совместно, в целом может оказаться выгодным. NOT MATERIALIZED игнорируется в запросе WITH, если он является рекурсивным или не свободен от побочных эффектов (т. е. когда не является простым SELECT без изменчивых функций).

По умолчанию запрос WITH без побочных эффектов включается в основной запрос, если он используется ровно один раз в его предложении FROM. Это позволяет совместно оптимизировать два уровня запросов в ситуациях, когда это должно быть семантически незаметно. Однако, сворачивание может быть предотвращено, если пометить запрос WITH как MATERIALIZED. Это может быть полезно, например, если предложение WITH используется в качестве преграды для оптимизатора, чтобы предотвратить выбор плохого плана планировщиком.

Дополнительную информацию смотрите в разделе Запросы WITH.

Предложение FROM

Предложение FROM указывает одну или несколько исходных таблиц, служащих источником данных для SELECT. Если указано несколько источников, результатом является декартово произведение (перекрестное соединение) всех строк. Но обычно в запрос добавляются уточняющие условия (через WHERE) чтобы ограничить возвращаемый набор строк небольшим подмножеством декартова произведения.

Предложение FROM может содержать следующие элементы:

имя_таблицы

Имя, которое может быть дополнено схемой, существующей таблицы или представления. Если перед именем таблицы указывается ONLY, сканируется только эта таблица. Если ONLY не указано, сканируются таблица и все ее потомки (если таковые имеются). После имени таблицы можно также добавить необязательное указание *, чтобы явно обозначить, что блокировка затрагивает и все дочерние таблицы.

псевдоним

Псевдоним, заменяющий имя для элемента списка FROM. Псевдоним используется для краткости или для устранения неоднозначности с замкнутыми соединения ми (где одна и та же таблица сканируется несколько раз). Когда задается псевдоним, он полностью скрывает фактическое имя таблицы или функции; например, задано FROM foo AS f, остальная часть запроса SELECT должна обращаться к этому элементу FROM по имени f, а не foo. Если задан псевдоним таблицы, список псевдонимов столбцов также может быть записан для обеспечения замены имен для одного или нескольких столбцов таблицы.

TABLESAMPLE метод_выборки ( аргумент [, ...] ) [ REPEATABLE ( затравка ) ]

Предложение TABLESAMPLE после имя_таблицы указывает на то, что указанный метод_выборки должен использоваться для получения подмножества строк в этой таблице. Этот метод_выборки предшествует применению любых других фильтров, таких как в предложении WHERE. Стандартное дистрибутив QHB включает два метода выборки, BERNOULLI и SYSTEM, и другие методы выборки могут быть установлены в базе данных с помощью расширений.

Методы выборки BERNOULLI и SYSTEM принимают единственный аргумент, который определяет, какая доля таблицы должна попасть в выборку, выраженная в процентах от 0 до 100. Этот аргумент может быть любым выражением со значением типа real. (Другие методы выборки могут принимать другие аргументы). Эти два метода возвращают случайную выборку таблицы, которая будет содержать приблизительно указанный процент строк таблицы. Метод BERNOULLI сканирует всю таблицу и выбирает или игнорирует отдельные строки независимо с заданной вероятностью. Метод SYSTEM делает выборку на уровне блоков, для каждого блока определяя шанс его задействовать; возвращаются все строки в каждом выбранном блоке. Метод SYSTEM значительно быстрее метода BERNOULLI, когда выбирается небольшой процентстрок, но может выдавать возвращать менее случайную выборку таблицы в результате эффектов кучности.

В необязательном предложении REPEATABLE определяется аргумент затравка - число или выражение, используемое для генерации случайных чисел в рамках метода выборки. Значением затравки может быть любое отличное от NULL число с плавающей запятой. Два запроса, в которых указаны одинаковые значения затравки и аргумента выдадут одну и ту же выборку таблицы при условии неизменности содержимого таблицы. Но с разными значениями затравки обычно дают разные выборки. В отсутствие предложения REPEATABLE для каждого запроса выбирается новая случайная выборка, основанная на затравке сгенерированной системой. Обратите внимание, что некоторые дополнительные методы выборки не принимают предложение REPEATABLE, и выдают разные выборки при каждом использовании.

выборка

Предложение FROM может содержать вложенный запрос SELECT. Это действует так, как если бы его выходные данные были созданы как временная таблица на время выполнения основной команды SELECT. Обратите внимание, что вложенный SELECT должен быть заключен в круглые скобки, и для него должен быть задан псевдоним. Здесь также можно использовать команду VALUES.

имя_запроса_WITH

На запрос WITH можно ссылаться по имени, как если бы имя запроса было именем таблицы. (На самом деле, запрос WITH скрывает любую реальную таблицу с тем же именем для целей основного запроса. При необходимости можно обратиться к реальной таблице с тем же именемъ, указав имя таблицы в схеме. Для этого имени можно задать псевдоним так же, как и для имени таблицы.

имя_функции

В предложении FROM могут содержаться вызовы функций. (Это особенно полезно для функций, возвращающих результирующие множества, но можно использовать любую функцию). Это действует так, как если бы выходные данные функции были созданы как временная таблица на время выполнения основной команды SELECT. Когда к вызову функции добавляется необязательное предложение WITH ORDINALITY, после всех выдаваемых функцией столбцов функции добавляется новый столбец с номерами строк.

Для функции можно задать псевдоним так же, как и для таблицы. Если псевдоним задан, то также можно задать список псевдонимов столбцов, для предоставления альтернативных имен для одного или нескольких атрибутов составного типа результата функции, включая имя столбца, добавленного предложением ORDINALITY, если оно присутствует.

Несколько вызовов функций могут быть объединены в одном элементе предложения FROM, если заключить их в конструкцию ROWS FROM( ... ). Результатом такого элемента будет конкатенация первых строк из каждой функции, затем вторых строк из каждой функции и т. д. Если какие-то функции выдают меньше строк, чем другие, то отсутствующие данные заменяются значением null, так что общее количество возвращаемых строк всегда такое же, как для функции, которая выдала наибольшее количество строк.

Если функция была определена как возвращающая тип данных record, для неё нужно указать псевдоним или ключевое слово AS, а затем список определений столбцов в форме ( имя_столбца тип_данных [, ... ]). Список определений столбцов должен соответствовать фактическому количеству и типам столбцов, возвращаемых функцией.

Если при использовании синтаксиса ROWS FROM( ... ), одной из функций требуется список определений столбцов, предпочтительно поместить список определений столбцов после вызова функции внутри ROWS FROM( ... ). Список определений столбцов можно поместить после конструкции ROWS FROM( ... ) только если если вызывается всего одна функция, а предложение WITH ORDINALITY отсутствует.

Для того чтобы использовать WITH ORDINALITY вместе со списком определений столбцов необходимо использовать запись ROWS FROM( ... ) и поместить список определений столбцов внутрь ROWS FROM( ... ).

тип_соединения

Один из

  • [INNER ] JOIN

  • LEFT [OUTER ] JOIN

  • RIGHT [OUTER ] JOIN

  • FULL [OUTER ] JOIN

  • CROSS JOIN

Для типов соединений INNER и OUTER, должно быть указано условие соединения, а именно одно из предложений NATURAL, ON условие_соединения или USING (столбец_соединения [, ...]). См. описания для них ниже. Для CROSS JOIN ни одно из этих предложений не допускается.

Предложение JOIN объединяет в себе два элемента списка FROM, которые для удобства будем называть "таблицами", хотя на самом деле они могут быть любого типа, допустимого в качестве элемента FROM. При необходимости используйте круглые скобки для определения порядка вложенности. При отсутствии круглых скобок, предложение JOIN обрабатывается слева направо. В любом случае JOIN связывает элементы сильнее, чем разделяющие запятые в списке FROM.

CROSS JOIN и INNER JOIN формируют простое декартово произведение, такой же результат, что можно получить, указав две таблицы на верхнем уровне FROM, но ограниченное возможным условием соединения(если таковое имеется). Предложение CROSS JOIN эквивалентно INNER JOIN ON (TRUE), то есть никакие строки не удаляются по условию. Эти типы соединения введены исключительно для удобства записи, так как они не делают ничего, что вы не могли бы сделать с помощью простого FROM и WHERE.

LEFT OUTER JOIN возвращает все строки ограниченного декартова произведения (т. е. все объединенные строки, попадающие под условие соединения), плюс все строки в таблице слева, для которых не находится строк в таблице справа, удовлетворяющих условию соединения. Левая строка дополняется значениями NULL справа до полной ширины объединенной таблицы. Обратите внимание, только условие самого предложения JOIN учитывается при принятии решения о том, какие строки двух таблиц соответствуют друг другу. И только затем применяются внешние условия.

Напротив, RIGHT OUTER JOIN возвращает все соединенные строки, а также одну строку для каждой строки справа, не имеющей соответствия слева (дополненные значениями NULL слева). Это предложение введено для удобства, так как вы можете преобразовать его в LEFT OUTER JOIN изменив положение левой и правой таблиц.

FULL OUTER JOIN возвращает все соединенные строки плюс все строки слева, не имеющие соответствия справа (дополненные значениями NULL справа), плюс все строки справа, не имеющие соответствия слева (дополненные значениями NULL слева).

ON условие_соединения

Аргумент условие_соединения является выражением, возвращающим значение типа boolean (как в предложении WHERE), и указывает, какие строки при соединении считаются сопоставимыми.

USING ( столбец_соединения [, ...] )

Предложение вида USING ( a, b, ... ) представляет собой сокращённую форму записи ON таблица_слева.a = таблица_справа.a AND таблица_слева.b = таблица_справа.b .... Также, USING подразумевает, что только один из каждой пары эквивалентных столбцов будет включен в в результат соединения, а не оба.

NATURAL

NATURAL является сокращённой формой USING со списком, который содержит все столбцы в двух таблицах, имеющие одинаковые имена. Если нет одинаковых имен столбцов, NATURAL эквивалентно ON TRUE.

LATERAL

Ключевое слово LATERAL может предшествовать вложенному запросу SELECT в списке FROM. Оно позволяет в этом вложенном SELECT обращаться к столбцам элементов FROM, которые появляются перед ним в списке FROM. (Без LATERAL, каждый вложенный подзапрос SELECT обрабатывается независимо и поэтому не может перекрестно ссылаться на другие элементы списка FROM.)

LATERAL может также предшествовать вызову функции в списке FROM, но в данном случае оно будет избыточным, потому что выражения с функциями могут ссылаться на предыдущие элементы списка FROM в любом случае.

Элемент LATERAL может быть указан и в верхнем уровне списка FROM, и в дереве JOIN. В последнем случае он может ссылаться на любые элементы, которые находятся в левой части JOIN, от которого он находится справа.

Когда элемент FROM содержит ссылки LATERAL, запрос будет выполнен следующим образом: для каждой строки ОТ элемент, предоставляющий столбец(ы) с перекрестной ссылкой, или набор строк из нескольких FROM элементы, обеспечивающие столбцы, то LATERAL элемент вычисляется с использованием этой строки или значений набора строк столбцов. Результирующие строки объединяются, как обычно, со строками, из которых они были вычислены. Эта процедура повторяется для каждой строки или набора строк из исходных таблиц.

Исходная таблица(ы) столбца должна быть связана с элементом LATERAL соединением INNER или LEFT, иначе не образуется однозначно определенного набора строк, из которого можно было бы вычислить набор строк для LATERAL. Таким образом, хотя такая конструкция, как X RIGHT JOIN LATERAL Y является синтаксически допустимой, фактически Y не может обращаться к X.

Предложение WHERE

Необязательное предложение WHERE имеет общую форму

WHERE условие

где условие это любое выражение, которое выдает результат типа boolean. Любая строка, которая не удовлетворяет этому условию, будет исключена из результата. Строка удовлетворяет условию, если она возвращает true, когда вместо ссылок на переменные подставляются фактические значения строки.

Предложение GROUP BY

Необязательное предложение GROUP BY имеет общую форму

GROUP BY элемент_группирования [, ...]

GROUP BY собирает в одну строку все выбранные строки, имеющие одинаковые значения для выражений группировки. Таким выражением использованным внутри элемента_группирования может быть имя входного столбца, либо имя или порядковый номер выходного столбца (из списка элементов SELECT) либо произвольное выражение, сформированное из значений входных столбцов. В случае неоднозначности, имя в GROUP BY будет интерпретироваться как имя входного столбца, а не имя выходного столбца.

Если в элементе группирования задаётся GROUPING SETS, ROLLUP или CUBE, то предложение GROUP BY в целом определяет некоторое количество независимых наборов группирования. Эффект от этого эквивалентен объединению подзапросов (с UNION ALL) с отдельными наборами группирования в их предложениях GROUP BY. Дополнительные сведения об обработке наборов группирования см. в разделе GROUPING SETS, CUBE и ROLLUP.

Агрегатные функции, если они используются, вычисляются по всем строкам, составляющим каждую группу, выдавая отдельное значение для каждой группы. (Если указаны агрегатные функции, но нет предложения GROUP BY, запрос выполняется как если бы была одна группа, содержащая все выбранные строки). Набор строк, подаваемых в каждую агрегатную функцию, может быть дополнительно отфильтрован путем добавления предложения FILTER к вызову агрегатной функции; смотрите раздел Агрегатные выражения для получения дополнительной информации. С предложением FILTER на вход агрегатной функции будут поступать только строки, соответствующие фильтру.

Когда указано предложение GROUP BY или какая-либо агрегатная функция, выражения в списке SELECT не могут обращаться к негруппируемым столбцам, кроме как в агрегатных функциях или когда негруппируемый столбец функционально зависит от группируемых столбцов, так как в противном случае в негруппируемом столбце, нужно было бы вернуть более одного возможного значения. Функциональная зависимость появляется, если группируемые столбцы (или их подмножество) являются первичным ключом таблицы, содержащей не негруппируемый столбец.

Имейте в виду, что все агрегатные функции вычисляются перед вычислением любых "скалярных" выражений в предложении HAVING или списоке SELECT . Это означает, что, например, выражение CASE не может использоваться для вычисления агрегатной функции; см. Правила вычисления выражений.

В настоящий момент, указания FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE и FOR KEY SHARE не могут быть заданы вместе с GROUP BY.

Предложение HAVING

Необязательное предложение HAVING имеет общую форму

HAVING условие

где условие задаётся так же, как и в предложении WHERE.

Предложение HAVING исключает из результата строки групп, которые не удовлетворяют условию. HAVING отличается от WHERE: WHERE фильтрует отдельные строки перед применением GROUP BY, в то время как HAVING фильтрует уже группы строк, созданных с помощью GROUP BY. Каждый столбец, указанный в условие должен однозначно ссылаться на группируемый столбец, если только ссылка не находится внутри агрегатной функции или негруппируемый столбец функционально зависит от группируемых.

Наличие предложения HAVING превращает запрос в группируемый, даже если отсутствует предложение GROUP BY. То же самое происходит, когда запрос содержит агрегатные функции, но нет предложения GROUP BY. Все выбранные строки считаются образующими одну группу, а в списке SELECT и предложении HAVING можно обращаться к столбцам таблицы только из агрегатных функций. Такой запрос будет выдавать только одну строку, если результат условия HAVING истинно (true), и ноль строк, если это не так.

В настоящий момент, указания FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE и FOR KEY SHARE не могут быть заданы вместе с HAVING.

Предложение WINDOW

Необязательное предложение WINDOW имеет общую форму

WINDOW имя_окна AS ( определение_окна ) [, ...]

где имя_окна это имя, на которое можно ссылаться из предложения OVER или последующих определений окон, а определение_окна это:

[ имя_существующего_окна ]
[ PARTITION BY выражение [, ...] ]
[ ORDER BY выражение [ ASC | DESC | USING оператор ] [ NULLS { FIRST | LAST } ] [, ...] ]
[ предложение_рамки ]

Если имя_существующего_окна указано, то оно должно ссылаться на предшествующую запись в списке WINDOW; новое окно копирует предложение разбиения из этой записи, а также предложение сортировки, если таковое имеется. В этом случае для нового окна нельзя указать свое собственное предложение PARTITION BY, но можно определить предложение ORDER BY, только если его не было у копируемого окна. Новое окно всегда использует свое собственное предложение рамки; в копируемом окне предложение рамки не должно быть указано.

Элементы списка PARTITION BY интерпретируется во многом так же, как элементы предложения GROUP BY, за исключением того, что они всегда являются простыми выражениями и никогда не являются именем или номером выходного столбца. Другое отличие заключается в том, что эти выражения могут содержать вызовы агрегатных функций, которые не разрешены в обычном предложении GROUP BY. Они разрешены здесь, потому что формирование окна происходит после группировки и агрегации.

Аналогично, элементы списка ORDER BY интерпретируется во многом так же, как элементы предложения ORDER BY, за исключением того, что выражения всегда принимаются как простые выражения и никогда как имя или номер выходного столбца.

Необязательное предложение_рамки определяет рамку окна для оконных функций, которые зависят от рамки (не все они зависят). Рамка окна представляет собой набор связанных строк для каждой строки запроса (называемой текущей строкой ). В качестве предложение_рамки может быть одним из:

{ RANGE | ROWS | GROUPS } начало_рамки [ исключение_рамки ]
{ RANGE | ROWS | GROUPS } BETWEEN начало_рамки AND конец_рамки [ исключение_рамки ]

где начало_рамки и конец_рамки может быть одним из:

UNBOUNDED PRECEDING
смещение PRECEDING
CURRENT ROW
смещение FOLLOWING
UNBOUNDED FOLLOWING

и исключение_рамки может быть одним из

EXCLUDE CURRENT ROW
EXCLUDE GROUP
EXCLUDE TIES
EXCLUDE NO OTHERS

Если конец_рамки не указан, то по умолчанию подразумевается CURRENT ROW. Ограничения заключаются в том, что в качестве начала_рамки не может быть указано UNBOUNDED FOLLOWING, а конец_рамки не может быть указан как UNBOUNDED PRECEDING, и конец_рамки не может появиться в приведенном выше списке указаний начало_рамки AND конец_рамки перед началом_рамки - например, синтаксис RANGE BETWEEN CURRENT ROW AND смещение PRECEDING не допускается.

Рамка окна образуется по умолчанию предложением RANGE UNBOUNDED PRECEDING, что то же самое, что и RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW; оно устанавливает рамку, так чтобы она включала все строки от начала раздела до последней строки, родственной текущей (строка, которая согласно указанному для окна предложению ORDER BY считаются эквивалентной текущей; все строки являются родственными, если предложение ORDER BY отсутствует). В целом, UNBOUNDED PRECEDING означает, что рамка начинается с первой строки раздела, и по аналогии UNBOUNDED FOLLOWING означает, что рамка заканчивается последней строкой раздела, независимо от того, какой установлен режим RANGE, ROWS или GROUPS. В режиме ROWS указание CURRENT ROW означает, что рамка начинается или заканчивается текущей строкой; но в режиме RANGE или GROUPS это означает, что рамка начинается или заканчивается первой или последней строкой, родственной текущей строке, согласно ORDER BY. Параметры смещение PRECEDING и смещение FOLLOWING различаются по значению в зависимости от режима рамки. В режиме ROWS смещение является целым числом, указывающим, что начало рамки позиционируется перед текущей строкой, а конец рамки — после текущей строки. В режиме GROUPS, смещение является целым числом, указывающим, что рамка начинается или заканчивается, относительно группы строк родственных текущей, где группа родственных строк - это группа строк, эквивалентных в соответствии с предложением ORDER BY для данного окна. В режиме RANGE, для указания смещения требуется, чтобы в определении окна присутствовал ровно один столбец ORDER BY. Тогда рамка содержит те строки, где значение упорядочивающего столбца не превышает смещение меньше чем (для PRECEDING) или больше чем (для FOLLOWING) значение упорядочивающего столбца текущей строки. В этих случаях тип данных выражения смещение зависит от типа данных упорядочивающего столбца. Для числовых столбцов он обычно имеет тот же числовой тип, а для столбцов с типом дата/время — тип interval. Во всех этих случаях значение смещения должно быть отличным от NULL и неотрицательным. Кроме того, не смотря на то, что смещение не обязательно должно быть простой константой, оно не может содержать переменные, агрегатные или оконные функции.

Параметр исключение_рамки позволяет исключать из рамки строки, окружающие текущую строку, даже если они должны быть включены в соответствии с параметрами начала и конца рамки. Предложение EXCLUDE CURRENT ROW исключает текущую строку из рамки. EXCLUDE GROUP исключает из рамки текущую строку и родственные ей. EXCLUDE TIES исключает из рамки только строки родственные текущей строке, но не саму текущую строку. EXCLUDE NO OTHERS просто указывает явно поведение по умолчанию, не исключать ни текущую строку, ни родственные ей.

Будьте осторожны, в режиме ROWS могут выдаваться непредсказуемые результаты, если согласно порядку, указанному в ORDER BY, строки сортируются неоднозначно. Режимы RANGE и GROUPS предназначены для обеспечения того, чтобы строки, являющиеся родственными в порядке ORDER BY, обрабатывается одинаково: все строки данной родственной группы попадут в одну рамку или исключены из нее.

Назначение предложения WINDOW - управление поведением оконных функций, фигурирующих в запросе, в Список SELECT или Предложение ORDER BY. Эти функции могут ссылаться на элементы WINDOW по имени в своих предложениях OVER. Однако элементы WINDOW не обязательно задействовать в запросе; если они не используется в запросе, они просто игнорируется. Можно использовать оконные функции без каких-либо элементов WINDOW, так как в вызове оконной функции можно указать свое определение окна непосредственно в предложении OVER. Тем не менее, предложение WINDOW позволяет сократить текст запроса, когда одно и то же определение окна требуется для более чем одной оконной функции.

В настоящий момент, указания FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE и FOR KEY SHARE не могут быть заданы вместе с WINDOW.

Функции окон подробно описаны в Руководство по оконным функциям, Вызовы оконных функций и Обработка оконных функций.

Список SELECT

Список SELECT (между ключевыми словами SELECT и FROM) задает выражения, которые формируют выходные строки оператора SELECT. Выражения могут (и обычно это делают) ссылаться на столбцы, вычисленные в предложении FROM.

Так же, как и в таблице, каждый выходной столбец SELECT имеет имя. В простом SELECT это имя используется только для обозначения столбца для отображения, но когда SELECT является подзапросом большего запроса, имя рассматривается большим запросом как имя столбца виртуальной таблицы, созданной подзапросом. Чтобы указать имя, используемое для выходного столбца, нужно написать AS выходное_имя после выражения столбца. (Вы можете не указывать слово AS, но только если желаемое выходное имя не совпадает с ключевыми словами QHB (см. Ключевые слова SQL). Для защиты от возможных будущих добавлений ключевых слов рекомендуется всегда либо писать AS, либо заключать имя в двойные кавычки.) Если вы не зададите имя столбца, QHB автоматически выберет имя. Если выражение столбца является простой ссылкой на столбец, то выбранное имя совпадет с именем этого столбца. В более сложных случаях может использоваться имя функции или типа, либо система может сгенерировать имя, например ?column?.

Имя выходного столбца может использоваться для обращения к его значению в предложениях ORDER BY и GROUP BY, но не в предложениях WHERE или HAVING; там вы должны написать все выражение вместо имени.

Вместо выражения в выходной список может быть записано *, что будет обозначать все столбцы выбранных строк. Кроме того, вы можете написать имя_таблицы.* краткое обозначение для столбцов, получаемых из этой таблицы. В этих случаях невозможно указать новые имена с помощью AS; имена выходных столбцов будут совпадать с именами столбцов таблицы.

Согласно стандарту SQL, выражения в выходном списке должны быть вычислены перед применением DISTINCT, ORDER BY, или LIMIT. Это очевидно необходимо при использовании DISTINCT, так как в противном случае неясно, какие значения должны выдаваться как уникальные. Однако во многих случаях это удобнее, если выходные выражения вычисляются после ORDER BY и LIMIT; особенно если выходной список содержит какие-либо изменчивые или дорогостоящие функции. В этом случае порядок вычисления функций является более интуитивным, а для строк, которые не попадут в результат, не будут производиться вычисления. QHB будет фактически вычислять выходные выражения после сортировки и ограничения, если эти выражения не фигурируют в DISTINCT, ORDER BY или GROUP BY. (В качестве примера, в запросе SELECT f(x) FROM tab ORDER BY 1 функция f(x), несомненно, должна вычисляться перед сортировкой). Выходные выражения, содержащие возвращающие множества функции, фактически вычисляются после сортировки и перед ограничением количества строк, так что LIMIT будет отбрасывать строки, выдаваемые функцией, возвращающей множество.

Предложение DISTINCT

Если указывается SELECT DISTINCT, то все повторяющиеся строки исключаются из результирующего набора (сохраняется одна строка из каждой группы дубликатов). SELECT ALL указывает на обратное: все строки сохраняются; это поведение по умолчанию.

SELECT DISTINCT ON ( выражение [, ...] ) сохраняет только первую строку каждого набора строк, в которых заданные выражение даёт одинаковые значения. Выражение DISTINCT ON интерпретируются с использованием тех же правил, что ORDER BY (смотрите выше). Обратите внимание, что “первая строка” каждого набора непредсказуема, если не указано ORDER BY
для обеспечения того, чтобы нужная строка появилась первой. Например:

SELECT DISTINCT ON (location) location, time, report
    FROM weather_reports
    ORDER BY location, time DESC;

извлекает самый последний отчет о погоде для каждого местоположения. Но если бы мы им не воспользовались ORDER BY чтобы принудительно установить нисходящий порядок значений времени для каждого местоположения, мы бы получили отчет от непредсказуемого времени для каждого местоположения.

Выражение(я) DISTINCT ON должно соответствовать самому левому выражению в ORDER BY. Предложение ORDER BY обычно содержит дополнительные выражения, определяющие желаемый приоритет строк внутри каждой группы DISTINCT ON.

В настоящий момент указания FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE и FOR KEY SHARE не могут быть заданы вместе с DISTINCT.

Предложение UNION

Предложение UNION имеет общую форму:

оператор_SELECT UNION [ ALL | DISTINCT ] оператор_SELECT

Где оператор_SELECT это любой подзапрос SELECT без предложений ORDER BY, LIMIT, FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE, или FOR KEY SHARE. (ORDER BY и LIMIT можно присоединить к вложенному выражению, если оно заключено в круглые скобки. Без скобок, эти предложения будут восприняты для применения к результату UNION, а не к выражению в его правой части.)

Оператор UNION вычисляет объединение набора строк, возвращенных указанными запросами SELECT. Строка находится в объединении двух результирующих наборов, если она появляется по крайней мере в одном из результирующих наборов. Два оператора SELECT, представляющие прямые операнды объекта UNION, должны отдавать одинаковое количество столбцов, и соответствующие столбцы должны иметь совместимые типы данных.

Результат UNION не содержит каких-либо повторяющихся строк, если только не указано слово ALL. ALL предотвращает устранение дубликатов. (Следовательно, UNION ALL обычно значительно быстрее, чем UNION; поэтому следует использовать ALL когда это возможно). Можно написать DISTINCT, чтобы явно указать, что повторяющиеся строки должны быть удалены (это поведение по умолчанию).

Несколько операторов UNION в одном запросе SELECT вычисляются слева направо, если не указан другой порядок, который может быть определен круглыми скобками.

В настоящий момент указания FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE и FOR KEY SHARE не могут быть заданы ни для результата с UNION, ни для любого из подзапросов UNION.

Предложение INTERSECT

Предложение INTERSECT имеет общую форму:

оператор_SELECT INTERSECT [ ALL | DISTINCT ] оператор_SELECT

Где оператор_SELECT это любой подзапрос SELECT без предложений ORDER BY, LIMIT, FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE, или FOR KEY SHARE.

Оператор INTERSECT вычисляет пересечение множество строк, возвращаемых соответствующими запросами SELECT. Строка находится в пересечении двух результирующих наборов, если она появляется в обоих результирующих наборах.

Результат INTERSECT не содержит каких-либо повторяющихся строк, если не указан параметр ALL. С ALL строка, повторяющаяся m раз в левой таблице и n раз в правой, будет выдана в результирующем наборе min(m,n) раз. Можно написать DISTINCT, чтобы явно указать, что повторяющиеся строки должны быть удалены (это поведение по умолчанию).

Несколько операторов INTERSECT в одном запросе SELECT вычисляются слева направо, если не указан другой порядок, который может быть определен круглыми скобками. INTERSECT связывает свои подзапросы сильнее, чем UNION. Это значит, что A UNION B INTERSECT C будет восприниматься как A UNION (B INTERSECT C).

В настоящий момент указания FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE и FOR KEY SHARE не могут быть заданы ни для результата с INTERSECT, ни для любого из подзапросов INTERSECT.

Предложение EXCEPT

Предложение EXCEPT имеет общую форму:

оператор_SELECT EXCEPT [ ALL | DISTINCT ] оператор_SELECT

Где оператор_SELECT это любой подзапрос SELECT без предложений ORDER BY, LIMIT, FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE, или FOR KEY SHARE.

Оператор EXCEPT вычисляет набор строк, которые находятся в результате выполнения левого запроса SELECT, но не в результате выполнения правого.

Результат EXCEPT не содержит каких-либо повторяющихся строк, если не указан параметр ALL. С ALL строка, повторяющаяся m раз в левой таблице и n раз в правой, будет выдана в результирующем наборе max(m-n,0) раз. Можно написать DISTINCT, чтобы явно указать, что повторяющиеся строки должны быть удалены (это поведение по умолчанию).

Несколько операторов EXCEPT в одном запросе SELECT вычисляются слева направо, если не указан другой порядок, который может быть определен круглыми скобками. EXCEPT связывает свои подзапросы также сильно, как UNION.

В настоящий момент указания FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE и FOR KEY SHARE не могут быть заданы ни для результата с EXCEPT, ни для любого из подзапросов EXCEPT.

Предложение ORDER BY

Необязательное предложение ORDER BY имеет общую форму:

ORDER BY выражение [ ASC | DESC | USING оператор ] [ NULLS { FIRST | LAST } ] [, ...]

Предложение ORDER BY указывает, что результирующие строки запроса должны быть отсортированы в соответствии с указанными выражениями. Если значения двух строк равны по самому левому выражению, то они сравниваются по следующему выражению и так далее. Если их значения равны в соответствии со всеми указанными выражениями, они возвращаются в порядке, определяемом от реализации.

В качестве выражения может быть указано имя или порядковый номер выходного столбца (элемент списка SELECT), либо произвольное выражение, сформированное из значений входного столбца.

Порядковый номер это последовательный номер (нумерация слева направо) позиции выходного столбца. Эта функция позволяет определить порядок сортировки по столбцу, который не имеет уникального имени. Это не абсолютно необходимо, потому что всегда можно назначить имя выходному столбцу с помощью предложения AS.

Также в предложении ORDER BY можно использовать произвольные выражения, в том числе и столбцы, которые не отображаются в списке результатов SELECT. Таким образом, следующий запрос вполне корректен:

SELECT name FROM distributors ORDER BY code;

Однако здесь есть ограничение, если предложение ORDER BY применяется к результату предложений UNION, INTERSECT или EXCEPT, в нем можно указывать только имя или номер выходного столбца, но не выражение.

Если выражение ORDER BY -это простое имя, которое соответствует как имени выходного столбца, так и имени входного столбца, ORDER BY будет интерпретировать его как имя выходного столбца. Это противоположность тому выбору, который сделает GROUP BY в такой же ситуации. Это несоответствие допущено для совместимости со стандартом SQL.

Дополнительно можно добавить ключевое слово ASC (по возрастанию) или DESC (по убыванию) после любого выражения в предложении ORDER BY. Если не указано, по умолчанию предполагается ASC. Кроме того, можно указать имя специфического оператора сортировки в предложении USING. Оператор сортировки должен быть членом «меньше-чем» или «больше-чем»
некоторого семейства операторов B-дерева. ASC обычно эквивалентно: USING <?, а DESC эквивалентно: USING >. (Но создатель определяемого пользователем типа данных может по-другому определить порядок сортировки по умолчанию, и установить соответствие операторам с другими именами).

Если указывается NULLS LAST, значения NULL окажутся в результате сортировки после всех NOT NULL значений; если указывается NULLS FIRST, значения NULL окажутся в результате сортировки перед всеми NOT NULL значениями. Если ни то, ни другое не указано, по умолчанию подразумевается NULLS LAST когда ASC указано явно или подразумевается, и наоборот NULLS FIRST когда DESC указано (таким образом, по умолчанию считается, что значения NULL больше значений не NULL). С предложением USING порядок NULL по умолчанию зависит от того, является ли заданный оператор оператором «меньше-чем» или «больше-чем».

Обратите внимание, что параметры сортировки применяются только к выражению, за которым они следуют; например ORDER BY x, y DESC не то же самое, что ORDER BY x DESC, y DESC.

Данные символьных строк сортируются в соответствии с правилом сортировки, установленным для сортируемого столбца. Это поведение может быть переопределено при необходимости, путем включения предложения COLLATE в выражение, например так: ORDER BY mycolumn COLLATE "en_US". Дополнительную информацию смотрите в разделах Применение правил сортировки и Поддержка правил сортировки.

Предложение LIMIT

Предложение LIMIT состоит из двух независимых вложенных предложений:

LIMIT { число | ALL }
OFFSET начало

Где число задает максимальное количество строк, которое должно быть выдано, в то время как начало указывает количество строк, которые необходимо пропустить прежде чем начать выдавать строки. Если указаны оба значения, сначала строки пропускаются в количестве, заданном значением начало, а потом следующие строки выдаются в количестве, не превышающем значения число.

Если в результате вычисления выражения число оказывается NULL, предложение
обрабатывается как LIMIT ALL, то есть, без ограничения числа строк. Если начало принимает значение NULL, оно обрабатывается так же, как OFFSET 0.

SQL: 2008 представил другой синтаксис для получения того же результата, который также поддерживает QHB. Это:

OFFSET начало { ROW | ROWS }
FETCH { FIRST | NEXT } [ число ] { ROW | ROWS } ONLY

В этом синтаксисе стандарт требует чтобы значение начало или число,
было буквальной константой, параметром или именем переменной; QHB разрешает использовать другие выражения, но они обычно должны быть заключены в круглые скобки, чтобы избежать неоднозначности. Если число опускается в предложении FETCH, по умолчанию принимается зачение 1. Слова ROW и ROWS, а также FIRST и NEXT являются незначащими, и не влияют на поведение этих предложений. Согласно стандарту, предложение OFFSET должно предшествовать предложению FETCH, если оба присутствуют; но QHB менее строг и позволяет любой порядок.

При использовании LIMIT, имеет смысл использовать и предложение ORDER BY, чтобы результирующие строки выдавались в определённом порядке. В противном случае вы получите непредсказуемое подмножество строк запроса — вы можете запросить строки с десятой по двадцатую, но в каком порядке? Порядок будет неизвестен, если вы не укажете ORDER BY.

Планировщик запросов учитывает ограничение LIMIT при создании плана запроса, поэтому очень вероятно, что вы получите разные планы (и значит разный порядок строк) в зависимости от того, какие значения указаны для LIMIT и OFFSET. Таким образом, различные значения LIMIT/OFFSET при выборе различных подмножеств результата запроса приведут к несогласованным результатам, если вы не установите предсказуемый порядок сортировки результатов с помощью ORDER BY. Это не ошибка, а это неотъемлемое следствие того факта, что SQL не гарантирует вывод результатов запроса в некотором порядке, если только не указывается явно ORDER BY для определения порядка.

Возможно даже, что при повторном выполнении одного и того же запроса с LIMIT будут получены разные подмножества строк таблицы, если нет предложения ORDER BY, для принудительного выбора детерминированного подмножества. Это опять же не ошибка; детерминированность результатов просто не гарантируется в таком случае.

Предложение блокировки

Предложениями блокировки являются операторы FOR UPDATE, FOR NO KEY UPDATE, FOR SHARE и FOR KEY SHARE; они влияют на то, как SELECT блокирует строки по мере их получения из таблицы.

Блокирующее предложение имеет общую форму

FOR вариант_блокировки [ OF имя_таблицы [, ...] ] [ NOWAIT | SKIP LOCKED ]

где вариант_блокировки может быть одним из

UPDATE
NO KEY UPDATE
SHARE
KEY SHARE

Для получения дополнительной информации о каждом режиме блокировки на уровне строк см. раздел Блокировка на уровне строк.

Чтобы операция не ожидала фиксации других транзакций, используйте указание NOWAIT или SKIP LOCKED. С NOWAIT оператор сообщает об ошибке, а не ждет, если выбранная строка не может быть заблокирована немедленно. С SKIP LOCKED, все выбранные строки, которые не могут быть немедленно заблокированы, пропускаются. Пропуск заблокированных строк формирует несогласованное представление данных, поэтому этот вариант не подходит для общего применения, но может быть использован для предотвращения конфликта блокировок при обращении множества потребителей к таблице типа очереди. Обратите внимание, что указания NOWAIT и SKIP LOCKED можно применить только к блокировке (ам) уровня строк - необходимая блокировка ROW SHARE уровня таблицы по-прежнему запрашивается обычным способом (см. главу Параллельный контроль). Вы можете использовать команду LOCK с указанием NOWAIT, если вам нужно запросить блокировку уровня таблицы без ожидания.

Если в предложении блокировки заданы определенные имена таблиц, то будут блокироваться только строки, поступающие из этих таблиц; любые другие таблицы, указанные в SELECT, будут прочитаны как обычно. Предложение блокировки без списка таблиц влияет на все таблицы, указанные в операторе. Если предложение блокировки применяется к представлению или подзапросу, оно влияет на все таблицы, используемые в представлении или подзапросе. Но эти предложения не применяются к запросам WITH, на которые ссылается основной запрос. Если вы хотите, чтобы блокировка строк происходила в пределах запроса WITH, укажите предложение блокировки непосредственно в этом запросе WITH.

Можно указать в запросе несколько предложений блокировки, если необходимо указать различное поведение блокировки для разных таблиц. При этом, если одна и та же таблица упоминается (или неявно затрагивается) более чем в одном предложении блокировки, то блокировка устанавливается так, как если бы было указано только самое сильное из них. Аналогично, таблица обрабатывается в режиме NOWAIT, если он указан в любом из предложений, затрагивающих ее. В противном случае,м таблица обрабатывается в режиме SKIP LOCKED, если он указан в любом из предложений, затрагивающих ее.

Предложения блокировки нельзя использовать в контекстах, где возвращаемые строки не могут быть четко связаны с отдельными строками таблицы; например, они не могут использоваться при агрегировании.

Когда предложение блокировки появляется на верхнем уровне запроса SELECT, блокируются именно те строки, которые возвращаются запросом; в случае запроса объединения блокируются те строки, которые участвуют в возвращаемых строках объединения. Кроме того, строки, удовлетворяющие условиям запроса на момент создания создания снимка запроса, будут заблокированы, хотя они не будут возвращены, если они были обновлены с момента снимка и больше не удовлетворяют условиям запроса. Если используется LIMIT, блокировка останавливается, как только было возвращено достаточное количество строк, чтобы удовлетворить пределу (но обратите внимание, что строки, пропускаемые указанием OFFSET, будут блокироваться). Аналогично, если предложение блокировки используется в запросе курсора, то блокируются только строки, фактически извлеченные или пройденные курсором.

Когда предложение блокировки появляется в подзапросе SELECT, блокируются те строки, которые будут возвращены внешним запросом от подзапроса. Этих строк может оказаться меньшее количество, чем предполагает анализ только подзапроса, поскольку условия из внешнего запроса могут способствовать оптимизации выполнения подзапроса. Например,

SELECT * FROM (SELECT * FROM mytable FOR UPDATE) ss WHERE col1 = 5;

будет блокировать только строки, c col1 = 5, при том, что в такой записи условие не относится к подзапросу.

В предыдущих версиях не удавалось сохранить блокировку, которая была обновлена более поздней точкой сохранения. Например, этот код:

BEGIN;
SELECT * FROM mytable WHERE key = 1 FOR UPDATE;
SAVEPOINT s;
UPDATE mytable SET ... WHERE key = 1;
ROLLBACK TO s;

не удалось бы сохранить блокировку FOR UPDATE после ROLLBACK TO. Это было исправлено в версии 9.3 PostgreSQL.

Внимание

Команда SELECT, запущенная с уровнем изоляции транзакций READ COMMITTED с использованием ORDER BY и предложением блокировки, возможно, будет возвращать строки не по порядку. Это связано с тем, что ORDER BY применяется в первую очередь. Команда сортирует результат, но затем может быть заблокирована, при попытке получить блокировку одной или нескольких строк. Как только блокировка SELECT будет снята, некоторые значения сортируемых столбцов могут быть изменены, что приведет к тому, что порядок может быть нарушен (хотя они были упорядочены с точки зрения исходных значений столбцов). При необходимости обойти эту проблему, можно поместив FOR UPDATE/SHARE в подзапрос, например

SELECT * FROM (SELECT * FROM mytable FOR UPDATE) SS ORDER BY column1;

Обратите внимание, что этот запрос приведет к блокировке всех строк таблицы MyTable, но если бы предложение FOR UPDATE было указано на верхнем уровне, были бы заблокированы только фактически возвращенные строки. Это может значительно влиять на производительность, особенно если ORDER BY совмещено с LIMIT или другими ограничениями. Таким образом, этот метод рекомендуется только в том случае, если ожидаются параллельные обновления сортируемых столбцов и требуется строго отсортированный результат.

На уровнях изоляции транзакций REPEATABLE READ и SERIALIZABLE это приведет к ошибке сериализации (с SQLSTATE 40001), поэтому нет никакой возможности получения строк не по порядку на этих уровнях изоляции.

Команда TABLE

Команда

TABLE имя

равнозначна

SELECT * FROM имя

Команда TABLE может использоваться как команда верхнего уровня или как вариант более краткой записи внутри сложных запросов. С командой TABLE могут быть использованы только предложения WITH, UNION, INTERSECT, EXCEPT, ORDER BY, LIMIT, OFFSET, FETCH и предложения блокировки FOR; предложение WHERE и любые формы агрегирования не могут быть использованы.

Примеры

Соединение таблицы films с таблицей distributors:

SELECT f.title, f.did, d.name, f.date_prod, f.kind
    FROM distributors d, films f
    WHERE f.did = d.did

       title       | did |     name     | date_prod  |   kind
-------------------+-----+--------------+------------+----------
 The Third Man     | 101 | British Lion | 1949-12-23 | Drama
 The African Queen | 101 | British Lion | 1951-08-11 | Romantic
 ...

Суммирование значений столбца len (продолжительность) для всех фильмов и группирование результатов по столбцу kind (типу фильма):

SELECT kind, sum(len) AS total FROM films GROUP BY kind;

   kind   | total
----------+-------
 Action   | 07:34
 Comedy   | 02:58
 Drama    | 14:28
 Musical  | 06:42
 Romantic | 04:38

Суммирование значений столбца len для всех фильмов, группирование результатов по столбцу kind и вывод только тех групп, общая продолжительность которых меньше 5 часов:

SELECT kind, sum(len) AS total
    FROM films
    GROUP BY kind
    HAVING sum(len) < interval '5 hours';

   kind   | total
----------+-------
 Comedy   | 02:58
 Romantic | 04:38

Следующие два запроса демонстрируют равнозначные способы сортировки результатов по содержимому второго столбца (name):

SELECT * FROM distributors ORDER BY name;
SELECT * FROM distributors ORDER BY 2;


 did |       name
-----+------------------
 109 | 20th Century Fox
 110 | Bavaria Atelier
 101 | British Lion
 107 | Columbia
 102 | Jean Luc Godard
 113 | Luso films
 104 | Mosfilm
 103 | Paramount
 106 | Toho
 105 | United Artists
 111 | Walt Disney
 112 | Warner Bros.
 108 | Westward

Следующий пример показывает объединение таблиц distributors и actors, ограниченное именами, начинающимися с буквы W в каждой таблице. Интерес представляют только неповторяющиеся строки, поэтому ключевое слово ALL опущено.

distributors:               actors:
 did |     name              id |     name
-----+--------------        ----+----------------
 108 | Westward               1 | Woody Allen
 111 | Walt Disney            2 | Warren Beatty
 112 | Warner Bros.           3 | Walter Matthau
 ...                         ...

SELECT distributors.name
    FROM distributors
    WHERE distributors.name LIKE 'W%'
UNION
SELECT actors.name
    FROM actors
    WHERE actors.name LIKE 'W%';

      name
----------------
 Walt Disney
 Walter Matthau
 Warner Bros.
 Warren Beatty
 Westward
 Woody Allen

Этот пример показывает, как использовать функцию в предложении FROM, со списком определений столбцов и без него:

CREATE FUNCTION distributors(int) RETURNS SETOF distributors AS $$
    SELECT * FROM distributors WHERE did = $1;
$$ LANGUAGE SQL;

SELECT * FROM distributors(111);
 did |    name
-----+-------------
 111 | Walt Disney

CREATE FUNCTION distributors_2(int) RETURNS SETOF record AS $$
    SELECT * FROM distributors WHERE did = $1;
$$ LANGUAGE SQL;

SELECT * FROM distributors_2(111) AS (f1 int, f2 text);
 f1  |     f2
-----+-------------
 111 | Walt Disney

Пример функции с добавленным столбцом нумерации:

SELECT * FROM unnest(ARRAY['a','b','c','d','e','f']) WITH ORDINALITY;
 unnest | ordinality
--------+----------
 a      |        1
 b      |        2
 c      |        3
 d      |        4
 e      |        5
 f      |        6
(6 rows)

Этот пример показывает, как использовать простое предложение WITH:

WITH t AS (
    SELECT random() as x FROM generate_series(1, 3)
  )
SELECT * FROM t
UNION ALL
SELECT * FROM t

         x          
--------------------
  0.534150459803641
  0.520092216785997
 0.0735620250925422
  0.534150459803641
  0.520092216785997
 0.0735620250925422

Обратите внимание, что запрос WITH выполняется всего один раз, поэтому мы получаем два одинаковых набора по три случайных значения.

В этом примере WITH RECURSIVE применяется для поиска всех подчинённых Мери (непосредственных или косвенных) и вывода их уровня косвенности в таблице с информацией только о непосредственных подчинённых:

WITH RECURSIVE employee_recursive(distance, employee_name, manager_name) AS (
    SELECT 1, employee_name, manager_name
    FROM employee
    WHERE manager_name = 'Mary'
  UNION ALL
    SELECT er.distance + 1, e.employee_name, e.manager_name
    FROM employee_recursive er, employee e
    WHERE er.employee_name = e.manager_name
  )
SELECT distance, employee_name FROM employee_recursive;

Обратите внимание, что это типичная форма рекурсивных запросов: начальное условие, последующий UNION, а затем рекурсивная часть запроса. Убедитесь в том, что рекурсивная часть запроса в конце концов перестанет возвращать строки, иначе запрос окажется в бесконечном цикле. (За другими примерами обратитесь к Разделу Запросы WITH) В этом примере используется LATERAL для применения функции get_product_names(), возвращающей множество, для каждой строки таблицы manufacturers:

SELECT m.name AS mname, pname
FROM manufacturers m, LATERAL get_product_names(m.id) pname;

Производители, с которыми в данный момент не связаны никакие продукты, не попадут в результат, так как это внутреннее соединение. Если бы мы захотели включить названия и этих производителей, можно сделать так:

SELECT m.name AS mname, pname
FROM manufacturers m LEFT JOIN LATERAL get_product_names(m.id) pname ON true;

Совместимость

Конечно, оператор SELECT совместим со стандартом SQL. Но есть некоторые расширения и некоторые отсутствующие функции.

Необязательное предложение FROM

QHB позволяет опустить предложение FROM. Что позволяет простое использование для вычисления результатов простых выражений:

SELECT 2+2;

 ?column?
----------
        4

Некоторые другие базы данных SQL не могут сделать это, кроме как путем введения фиктивной таблицы с одной строкой, из которой нужно сделать SELECT.

Обратите внимание, что если предложение FROM не указано, запрос не может ссылаться ни на какие таблицы базы данных. Например, недопустим следующий запрос:

SELECT distributors.* WHERE distributors.name = 'Westward';

Пустые списки SELECT

Список выходных выражений после SELECT может быть пустым, создавая таблицу результатов без столбцов. Это недопустимый синтаксис в соответствии со стандартом SQL. QHB допускает его, так как это согласуется с возможностью иметь таблицы без столбцов. Однако пустой список не допускается, когда используется DISTINCT.

Необязательное ключевое слово AS

В стандарте SQL необязательное ключевое слово AS может быть опущено перед именем выходного столбца, когда новое имя столбца является допустимым именем столбца (то есть не таким, как любое зарезервированное ключевое слово). QHB более строг: AS требуется, если новое имя столбца соответствует любому ключевому слову вообще, зарезервировано оно или нет. Рекомендуемая практика заключается в использовании AS или заключении имен выходных столбцов в кавычки, чтобы предотвратить любой возможный конфликт в будущем при добавлении ключевых слов.

В списке FROM и стандарт SQL, и QHB позволяют пропускать AS перед псевдонимом, который является незарезервированным ключевым словом. Но это нецелесообразно для имен выходных столбцов из-за синтаксической неоднозначности.

ONLY и наследование

Стандарт SQL требует заключать имя таблицы в круглые скобки при написании ONLY, например SELECT * FROM ONLY (tab1), ONLY (tab2) WHERE ... QHB считает эти скобки необязательными. QHB допускает добавлять в конце *, чтобы явно указать что дочерние таблицы включаются в рассмотрение, в отличие от поведения с ONLY. Стандарт SQL этого не допускает.

(Эти соображения применяются ко всем командам SQL, поддерживающим параметр ONLY).

Ограничения предложения TABLESAMPLE

Предложение TABLESAMPLE в настоящее время принимается только для обычных таблиц и материализованных представлений. Согласно стандарту SQL его должно быть возможно применить к любым элементам списка FROM.

Вызовы функций в предложении FROM

QHB позволяет записывать вызов функции непосредственно в качестве элемента списка FROM. В стандарте SQL было бы необходимо обернуть такой вызов функции во вложенный SELECT; то есть запись FROM функция(...) псевдоним примерно равнозначна записи FROM LATERAL (SELECT функция(...)) псевдоним. Обратите внимание, что указание LATERAL считается неявным; это связано с тем, что стандарт требует поведения LATERAL для элемента UNNEST() в предложении FROM. QHB обрабатывает UNNEST() так же, как и другие функции, возвращающие множества.

Пространства имён в GROUP BY и ORDER BY

В стандарте SQL-92, предложение ORDER BY может ссылаться только на имена или номера выходных столбцов, в то время как предложение GROUP BY может ссылаться только на только выражения, основанные на именах входных столбцов. QHB расширяет оба предложения, позволяя также применять другие варианты (но он использует интерпретацию стандарта, если есть неоднозначность). QHB также позволяет указывать произвольные выражения в обоих предложениях. Обратите внимание, что имена, фигурирующие в выражениях, всегда будут приниматься как имена входных столбцов, а не имена выходных.

В SQL:1999 и более поздних стандартах введено немного другое определение,которое не полностью совместимо с SQL-92. В большинстве случаев, однако, QHB будет интерпретировать выражение ORDER BY или GROUP BY так, как требует SQL:1999.

Функциональные зависимости

QHB распознает функциональную зависимость (позволяет пропускать столбцы из GROUP BY) только в том случае, если первичный ключ таблицы включен в список GROUP BY. Стандарт SQL задает дополнительные условия, которые должны быть учтены.

LIMIT и OFFSET

Предложения LIMIT и OFFSET являются специфичным синтаксисом QHB, также используемым в MySQL. Стандарт SQL: 2008 для той же цели вводит предложения OFFSET ... FETCH {FIRST|NEXT} ..., рассмотренные ранее в Предложение LIMIT. Этот синтаксис также используется IBM DB2. (Приложения, написанные для Oracle, часто используют обходной путь, включая автоматически генерируемый столбец rownum, который отсутствует в QHB, чтобы реализовать эффект этих предложений).

FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE, FOR KEY SHARE

Хотя предложение блокировки FOR UPDATE есть в стандарте SQL, стандарт позволяет его использовать только в предложении DECLARE CURSOR . QHB же позволяет его использовать в любом запросе SELECT, а также подзапросах SELECT, но это является расширением. Варианты FOR NO KEY UPDATE, FOR SHARE и FOR KEY SHARE, а также NOWAIT и SKIP LOCKED не отображены в стандарте.

Изменение данных в WITH

QHB позволяет использовать INSERT, UPDATE и DELETE в в качестве запросов WITH. Этого нет в стандарте SQL.

Нестандартные предложения

DISTINCT ON ( ... ) является расширением стандарта SQL.

ROWS FROM( ... ) является расширением стандарта SQL.

Указания MATERIALIZED и NOT MATERIALIZED предложения WITH также относятся к расширениям стандарта SQL.


SELECT INTO

SELECT INTO - создать таблицу из результатов запроса

Синтаксис

[ WITH [ RECURSIVE ] запрос_WITH [, ...] ]
SELECT [ ALL | DISTINCT [ ON ( выражение [, ...] ) ] ]
    * | выражение [ [ AS ] имя_результата ] [, ...]
    INTO [ TEMPORARY | TEMP | UNLOGGED ] [ TABLE ] новая_таблица
    [ FROM элемент_FROM [, ...] ]
    [ WHERE условие ]
    [ GROUP BY выражение [, ...] ]
    [ HAVING условие [, ...] ]
    [ WINDOW имя_окна AS ( определение_окна ) [, ...] ]
    [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] выборка ]
    [ ORDER BY выражение [ ASC | DESC | USING оператор ] [ NULLS { FIRST | LAST } ] [, ...] ]
    [ LIMIT { число | ALL } ]
    [ OFFSET начало [ ROW | ROWS ] ]
    [ FETCH { FIRST | NEXT } [ число ] { ROW | ROWS } ONLY ]
    [ FOR { UPDATE | SHARE } [ OF имя_таблицы [, ...] ] [ NOWAIT ] [...] ]

Описание

SELECT INTO создает новую таблицу и заполняет ее данными, вычисленными с помощью запроса. Данные не возвращаются клиенту, как это происходит с обычным SELECT. Столбцы новой таблицы имеют имена и типы данных, связанные с выходными столбцами SELECT.

Параметры

sTEMPORARY** или TEMP

Если этот параметр указан, таблица создается как временная таблица. Дополнительные сведения см. в разделе CREATE TABLE.

UNLOGGED

Если указано, таблица создается как нежурналируемая таблица. Дополнительные сведения см. в разделе CREATE TABLE.

новая_таблица

Имя, которое может быть дополнено схемой, создаваемой таблицы.

Все остальные параметры подробно описаны в разделе SELECT.

Примечания

Команда SELECT INTO функционально аналогична CREATE TABLE AS. Однако рекомендуется использовать CREATE TABLE AS, поскольку форма SELECT INTO не поддерживается в ECPG или PL/pgSQL, поскольку они интерпретируют предложение INTO по-своему. Кроме того, CREATE TABLE AS, предлагает больший набор функций, чем SELECT INTO.

В отличие от CREATE TABLE AS, команда SELECT INTO не позволяет указывать такие свойства, как метод доступа к таблице с помощью указания USING метод или табличное пространство таблицы с помощью TABLESPACE табл_пространство. Поэтому используйте команду CREATE TABLE AS при такой необходимости. Таким образом, для новой таблицы выбирается метод доступа к таблице по умолчанию. Дополнительную информацию смотрите в разделе default_table_access_method.

Примеры

Создание таблицы films_recent, содержащей только последние записи из таблицы films:

SELECT * INTO films_recent FROM films WHERE date_prod >= '2002-01-01';

Совместимость

Стандарт SQL применяет команду SELECT INTO для передачи скалярных значений клиентской программе, а не для создания новой таблицы. Именно это применение описано в ECPG и PL/pgSQL (см. PL/pgSQL ). В QHB использует SELECT INTO для создания таблиц по историческим причинам. Лучше всего использовать CREATE TABLE AS для этой цели в новом коде.

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

CREATE TABLE AS


SET

SET - изменить параметр времени выполнения

Синтаксис

SET [ SESSION | LOCAL ] параметр_конфигурации { TO | = } { значение | 'значение' | DEFAULT }
SET [ SESSION | LOCAL ] TIME ZONE { часовой_пояс | LOCAL | DEFAULT }

Описание

Команда SET изменяет параметры конфигурации времени выполнения. Многие из параметров времени выполнения, перечисленные в главе Конфигурация сервера, могут быть изменены с помощью SET "на лету". (Но некоторые из них требуют для изменения прав суперпользователя, а другие не могут быть изменены после запуска сервера или сеанса). Команда SET влияет только на значение параметра, используемое в текущем сеансе.

Если команда SET (или эквивалентная SET SESSION ) выполняется внутри транзакции, которая позже прерывается, эффект команды SET исчезает при откате транзакции. Если же окружающая транзакция фиксируется, эффект будут сохраняться до конца сеанса, если его не переопределит другая команда SET.

Эффект от выполнения SET LOCAL сохраняется только до конца текущей транзакции, независимо от того, фиксируется она или нет. Особый случай это использование SET с последующей SET LOCAL в пределах одной транзакции: SET LOCAL будет сохраняться до конца транзакции, но после этого (если транзакция зафиксирована) восстановится значение, заданное командой SET.

Эффект от выполнения SET или SET LOCAL также отменяется при откате к точке сохранения, которая установлена раньше, чем указание на выполнение команды.

Если SET LOCAL используется в функции, параметр SET для которой устанавливает значение той же переменной (см. CREATE FUNCTION), эффект действия SET LOCAL исчезает при выходе из функции; то есть, в любом случае значение, действующее при вызове функции, восстанавливается. Это позволяет устанавливать значение SET LOCAL для динамических или неоднократных
изменений параметра внутри функции, при этом сохраняя возможность сохранения и восстановления значения полученного извне. Однако обычная команда SET переопределяет любой параметр SET окружающей функции; ее эффект будет сохраняться, если не произойдет откат транзакции.

Параметры

SESSION

Указывает, что команда вступает в силу для текущего сеанса. (Это значение по умолчанию, если не указано ни SESSION, ни LOCAL.)

LOCAL

Указывает, что команда вступает в силу только для текущей транзакции. После COMMIT или ROLLBACK настройки уровня сеанса снова вступают в силу. При выполнении такой команды вне блока транзакций будет выдано предупреждение и больше ничего не произойдет.

параметр_конфигурации

Имя настраиваемого параметра времени выполнения. Доступные параметры описаны в главе Конфигурация сервера и ниже.

значение

Новое значение параметра. Значения могут быть указаны в виде строковых констант, идентификаторов, чисел или разделенных запятыми списков из них, в зависимости от конкретного параметра. Указание DEFAULT может быть записано, чтобы указать сброс параметра к значению по умолчанию (то есть к тому значению, которое он имел бы, если бы в текущем сеансе не выполнялись бы команды SET).

Помимо параметров конфигурации, описанных в главе Конфигурация сервера, есть несколько параметров, которые можно настроить только с помощью команды SET или которые имеют специальный синтаксис:

SCHEMA

SET SCHEMA 'значение' является альтернативным написанием команды SET search_path TO значение. С помощью этого синтаксиса можно указать только одну схему.

NAMES

SET NAMES значение — является альтернативным написанием команды SET client\_encoding TO значение.

SEED

Задает внутреннее начальное значение для генератора случайных чисел (функции random). Допустимые значения - это числа с плавающей запятой от -1 до 1, которые затем умножаются на 231 -1.

Начальное значение также может быть установлено путем вызова функции setseed:

SELECT setseed(значение);

TIME ZONE

SET TIME ZONE значение — является альтернативным написанием команды SET timezone TO __*значение*__. Синтаксис SET TIME ZONE позволяет использовать специальный синтаксис для указания часового пояса. Вот примеры допустимых значений:

'PST8PDT'

Часовой пояс для города Беркли, штат Калифорния.

'Europe / Rome'

Часовой пояс для Италии.

-7

Часовой пояс, сдвинутый от UTC на 7 часов к западу (эквивалент PDT). Положительные значения означают сдвиг от UTC к востоку.

INTERVAL '-08:00' HOUR TO MINUTE

Часовой пояс, сдвинутый от UTC на 8 часов к западу (эквивалент PST).

LOCAL
DEFAULT

Устанавливает в качестве часового пояса местный часовой пояс(т. е. значение по умолчанию серверного параметра timezone).

Значения часового пояса, заданные в виде чисел или интервалов, внутри преобразуются в формат часового пояса POSIX. Например, после SET TIME ZONE -7, команда SHOW TIME ZONE покажет <-07>+07.

Дополнительную информацию о часовых поясах смотрите в разделе Часовые пояса.

Примечания

Также изменить значение параметра можно с помощью функции set_config; см. Функции системного администрирования. Кроме того, системное представление pg_settings можно обновить командой UPDATE, что является эквивалентом SET.

Примеры

Установка пути поиска схем:

SET search_path TO my_schema, public;

Установка традиционного стиля даты POSTGRES с форматом ввода «день, месяц, год»:

SET datestyle TO postgres, dmy;

Установка часового пояса для Беркли, штат Калифорния:

SET TIME ZONE 'PST8PDT';

Установка часового пояса Италии:

SET TIME ZONE 'Europe/Rome';

Совместимость

SET TIME ZONE расширяет синтаксис, определенный в стандарте SQL. Стандарт допускает только числовые смещения часовых поясов, в то время как QHB допускает более гибкие спецификации часовых поясов. Все остальные функции SET являются расширениями QHB.

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

RESET, SHOW


SET CONSTRAINTS

SET CONSTRAINTS - установить время проверки ограничений для текущей транзакции

Синтаксис

SET CONSTRAINTS { ALL | имя [, ...] } { DEFERRED | IMMEDIATE }

Описание

SET CONSTRAINTS задает поведение при проверке ограничений в рамках текущей транзакции. Ограничения IMMEDIATE проверяются в конце каждого оператора. Ограничения DEFERRED откладываются до фиксации транзакции. Каждое из ограничений IMMEDIATE или DEFERRED задаются независимо.

При создании ограничения задается одна из трех характеристик: DEFERRABLE INITIALLY DEFERRED, DEFERRABLE INITIALLY IMMEDIATE или NOT DEFERRABLE. Третий вариант всегда подразумевает IMMEDIATE и не зависит от команды SET CONSTRAINTS. Первые два вариант запускаются в каждой транзакции в указанном режиме, но их поведение может быть изменено в рамках транзакции командой SET CONSTRAINTS.

SET CONSTRAINTS со списком имен ограничений изменяет режим только этих ограничений (которые все должны быть откладываемыми). Каждое имя ограничения может быть дополнено схемой. Если имя схемы не указано, текущий путь поиска схемы используется для поиска первого совпадающего имени, SET CONSTRAINTS ALL изменяет режим всех откладываемых ограничений.

При выполнении SET CONSTRAINTS изменяется режим ограничения с DEFERRED на IMMEDIATE, новый режим начинает действовать в обратную сторону: все изменения данных, которые были бы проверены в конце транзакции, вместо этого проверяются во время выполнения команды SET CONSTRAINTS. Если какое-либо такое ограничение нарушается, SET CONSTRAINTS не выполняется, происходит ошибка (и не изменяется режим ограничения). Таким образом, SET CONSTRAINTS может использоваться для принудительной проверки ограничений, в определенной точке транзакции.

В настоящее время такое поведение распространяется только на ограничения UNIQUE, PRIMARY KEY, REFERENCES (внешний ключ) и EXCLUDE. Ограничения NOT NULL и CHECK всегда проверяются немедленно, в момент когда строка вставляется или изменяется ( не в конце оператора). Ограничения уникальности и исключения, которые не были объявлены без указания DEFERRABLE также проверяются немедленно.

Запуск триггеров, объявленных как "триггеры ограничений", также контролируется этой командой — они срабатывают одновременно с проверкой связанного ограничения.

Примечания

Поскольку QHB не требует, чтобы имена ограничений были уникальными в схеме (только в своей таблице), возможно, что существует несколько соответствующих ограничений для указанного имени ограничения. В этом случае SET CONSTRAINTS будет действовать на все эти ограничения. Для имён без указания схемы, действие команды будет распространяться только на ограничение найденное в первой из схем в пути поиска, остальные схемы просматриваться не будут.

Эта команда изменяет только поведение ограничений в рамках текущей транзакции. При выполнении вне блока транзакций будет выдано предупреждение и больше ничего не произойдет.

Совместимость

Эта команда соответствует поведению, определенному в стандарте SQL, за исключением того, что QHB не влияет на проверку ограничения NOT NULL и CHECK. Кроме того, QHB проверяет неоткладываемые ограничения уникальности сразу же, а не в конце оператора, как предполагает стандарт.


SET ROLE

SET ROLE - установить идентификатор текущего пользователя для сеанса

Синтаксис

SET [ SESSION | LOCAL ] ROLE имя_роли
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE

Описание

Эта команда задает текущий идентификатор пользователя для активного сеанса SQL на имя_роли. Имя роли может быть записано как идентификатор или строковая константа. После SET ROLE проверка права доступа для команд SQL выполняется так, как если бы сеанс изначально был установлен с этим именем роли.

Указывая имя_роли, текущий пользователь должен являться членом этой роли. (Если пользователь сеанса является суперпользователем, он может выбрать любую роль).

Указания SESSION и LOCAL действуют так же, как и для обычной команды SET.

Формы NONE и RESET сбрасывают идентификатор текущего пользователя, в результате становится активным идентификатор пользователя сеанса. Эти формы могут быть выполнены любым пользователем.

Примечания

С помощью этой команды можно и добавить права, и ограничить их. Если роль пользователя сеанса имеет атрибут INHERIT, то роль автоматически получает права всех ролей, на которые можно переключиться (с помощью SET ROLE); в этом случае SET ROLE удаляет все права, назначенные непосредственно пользователю сеанса и другим ролям, членом которых он является, оставляя только права, доступные для указанной роли. С другой стороны, если роль пользователя сеанса имеет атрибут NOINHERIT, SET ROLE удаляет права, назначенные непосредственно пользователю сеанса, и вместо этого назначает права, доступные для указанной роли.

В частности, когда суперпользователь переключается через SET ROLE на роль, не являющуюся суперпользователем, он теряет свои права суперпользователя.

SET ROLE оказывает действие, сравнимое с SET SESSION AUTHORIZATION, но проверки прав, совсем другие. Кроме того, SET SESSION AUTHORIZATION определяет, какие роли допустимы для последующей SET ROLE, в то время как изменение ролей с помощью SET ROLE не изменяет набор ролей, разрешенных для последующей команды SET ROLE.

SET ROLE не обрабатывает переменные сеанса, заданные в свойствах роли (ALTER ROLE); они устанавливаются только во время входа в систему.

SET ROLE нельзя использовать в пределах функций с характеристикой SECURITY DEFINER.

Примеры

SELECT SESSION_USER, CURRENT_USER;

 session_user | current_user
--------------+--------------
 peter        | peter

SET ROLE 'paul';

SELECT SESSION_USER, CURRENT_USER;

 session_user | current_user
--------------+--------------
 peter        | paul

Совместимость

QHB допускает синтаксис идентификаторов (параметр имя_роли), в то время как стандарт SQL требует, чтобы имя роли было записано как строковая константа. Стандарт SQL не разрешает выполнять эту команду во время транзакции; QHB не делает такого ограничения, потому что для этого нет никаких причин. Указания SESSION и LOCAL являются расширением QHB, так же как и RESET.

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

SET SESSION AUTHORIZATION


SET SESSION AUTHORIZATION

SET SESSION AUTHORIZATION - установить идентификатор пользователя сеанса и идентификатор текущего пользователя для активного сеанса.

Синтаксис

SET [ SESSION | LOCAL ] SESSION AUTHORIZATION имя_пользователя
SET [ SESSION | LOCAL ] SESSION AUTHORIZATION DEFAULT
RESET SESSION AUTHORIZATION

Описание

Эта команда устанавливает идентификатор пользователя сеанса и идентификатор текущего пользователя активного сеанса SQL на имя_пользователя. Имя пользователя может быть записано как идентификатор или строковая константа. Используя эту команду, можно, например, временно переключиться на непривилегированного пользователя, а затем снова переключиться на суперпользователя.

Идентификатор пользователя сеанса изначально задается как имя пользователя (возможно, прошедшего проверку подлинности), введённое клиентом. Идентификатор текущего пользователя обычно равен идентификатору пользователя сеанса, но может временно измениться в функциях, определённых как SECURITY DEFINER, и подобных механизмах; он также может быть изменен с помощью SET ROLE. Идентификатор текущего пользователя принимается во внимание при проверке разрешений.

Идентификатор пользователя сеанса может быть изменен только в том случае, если исходный пользователь сеанса (аутентифицированный
пользователь
) имел право суперпользователя. В противном случае команда выполняется только в том случае, если указано имя пользователя, прошедшего проверку подлинности(аутентифицированного пользователя).

Указания SESSION и LOCAL действуют так же, как и для обычной команды SET.

Формы DEFAULT и RESET сбрасывают идентификаторы текущего пользователя и пользователя сеанса, так что текущим становится пользователь, изначально проходивший проверку подлинности. Эти формы могут быть выполнены любым пользователем.

Примечания

SET SESSION AUTHORIZATION нельзя использовать в функциях с характеристикой SECURITY DEFINER.

Примеры

SELECT SESSION_USER, CURRENT_USER;

 session_user | current_user
--------------+--------------
 peter        | peter

SET SESSION AUTHORIZATION 'paul';

SELECT SESSION_USER, CURRENT_USER;

 session_user | current_user
--------------+--------------
 paul         | paul

Совместимость

Стандарт SQL позволяет вместо строковой константы имя_пользователя указывать некоторые другие выражения, но эти варианты не важны на практике. QHB допускает синтаксис идентификаторов ("имя_пользователя"), чего в SQL стандарте нет. SQL не разрешает выполнять эту команду во время транзакции; в QHB этого ограничения нет, потому что для него нет никаких причин. Указания SESSION и LOCAL являются расширением QHB, как и синтаксис RESET.

Права доступа, необходимые для выполнения этой команды, определяется реализацией, согласно стандарту.

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

SET ROLE


SET TRANSACTION

SET TRANSACTION - установка характеристик текущей транзакции

Синтаксис

SET TRANSACTION режим\_транзакции \[, ...\]
SET TRANSACTION SNAPSHOT id\_снимка
SET SESSION CHARACTERISTICS AS TRANSACTION режим\_транзакции \[, ...\]

где режим\_транзакции является одним из:

    ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
    READ WRITE | READ ONLY
    [ NOT ] DEFERRABLE

Описание

Команда SET TRANSACTION задает характеристики текущей транзакции. Это не оказывает влияния на последующие транзакции. SET SESSION CHARACTERISTICS задает характеристики транзакции по умолчанию для последующих транзакций сеанса. Эти значения по умолчанию могут быть переопределены командой SET TRANSACTION для отдельной транзакции.

Доступные характеристики транзакций - это уровень изоляции транзакций, режим доступа к транзакциям (чтение/запись или только для чтения) и режим отложенного доступа. Кроме того, можно выбрать снимок, хотя только для текущей транзакции, а не для сеанса по умолчанию .

Уровень изоляции транзакции определяет, какие данные транзакция может видеть, когда другие транзакции выполняются одновременно:

READ COMMITTED

Оператор может видеть только строки, зафиксированные до начала выполнения транзакции. Это значение по умолчанию.

REPEATABLE READ

Все операторы текущей транзакции могут видеть только строки, зафиксированные до выполнения первого запроса на выборку или оператора изменения данных в этой транзакции.

SERIALIZABLE

Все операторы текущей транзакции могут видеть только строки, зафиксированные до выполнения первого запроса на выборку или оператора изменения данных в этой транзакции. Если наложение операций чтения и записи среди параллельных сериализуемых транзакций создаст ситуацию, невозможную при последовательном их выполнении (когда одна транзакция выполняется за другой),
произойдёт откат одной из транзакций с ошибкой serialization_failure (сбой сериализации).

Стандарт SQL определяет один дополнительный уровень, READ UNCOMMITTED. В QHB READ UNCOMMITTED трактуется как READ COMMITTED.

Уровень изоляции транзакций не может быть изменен после выполнения первого запроса на выборку или оператора по изменению данных ( SELECT, INSERT , DELETE , UPDATE , FETCH или COPY) в текущей транзакции. Дополнительную информацию об изоляции транзакций см. в главе Управление параллельным доступом.

Режим доступа к транзакции определяет, является ли транзакция доступной для чтения и записи. Чтение / запись - это поведение по умолчанию. Когда транзакция доступна только для чтения, следующие команды SQL запрещены: INSERT, UPDATE, DELETE и COPY FROM, если только таблица, в которую будут писать, не является временной таблицей; любые команды CREATE, ALTER и DROP, а также COMMENT, GRANT, REVOKE, TRUNCATE; EXPLAIN ANALYZE и EXECUTE запрещаются если команда, которую они будут выполнять, находится в числе вышеперечисленных. Это высокоуровневое определение режима только для чтения, которое не препятствует записи на диск.

Свойство DEFERRABLE транзакции не имеет эффекта, если транзакция не находится в режиме SERIALIZABLE или READ ONLY. Если для транзакции выбраны все три этих свойства, транзакция может быть заблокирована при первой попытке получить свой снимок данных, после чего она сможет выполняться без накладных расходов, обычных для режима SERIALIZABLE, и без какого-либо риска привести к ошибке из-за сбоя сериализации или пострадать от него. Этот режим хорошо подходит для длительных построений отчетов или выполнения резервных копий.

Команда SET TRANSACTION SNAPSHOT позволяет выполнить новую транзакцию с тем же снимком данных, что и существующая транзакция. Ранее существовавшая транзакция должна экспортировать этот снимок с помощью функции pg_export_snapshot (см. Функции синхронизации снимков ). Эта функция возвращает идентификатор снимка, который должен быть передан команде SET TRANSACTION SNAPSHOT чтобы указать, какой снимок будет импортирован. Идентификатор должен быть записан в виде строковой константы, например ’000003A1-1’. SET TRANSACTION SNAPSHOT может выполняться только в начале транзакции, перед первым запросом данных или оператором изменения данных (SELECT, INSERT, DELETE, UPDATE, FETCH или COPY) транзакции. Кроме того, в транзакции уже должен быть установлен уровень изоляции SERIALIZABLE или REPEATABLE READ (в противном случае снимок будет немедленно удален, так как на уровне READ COMMITTED создается новый снимок для каждой команды). Если импортирующая транзакция имеет уровне изоляции SERIALIZABLE, то транзакция, экспортировавшая снимок, также должна использовать этот уровень изоляции. Кроме того, транзакция в режиме чтение/запись не может импортировать снимок из транзакции в режиме только чтение.

Примечания

Если SET TRANSACTION выполняется без предварительной START TRANSACTION или BEGIN, она выдает предупреждение и больше ничего не происходит.

Можно обойтись без SET TRANSACTION, указав вместо нее желаемый режим_транзакции в операторах BEGIN или START TRANSACTION. Но такой возможности не предусмотрено для SET TRANSACTION SNAPSHOT.

Режимы транзакций сеанса по умолчанию также можно задать в параметрах конфигурации default_transaction_isolation, default_transaction_read_only и default_transaction_deferrable. (На самом деле SET SESSION CHARACTERISTICS - это более многословная альтернатива для установки этих переменных с помощью команды SET ). Это означает, что значения по умолчанию могут быть установлены в файле конфигурации, через ALTER DATABASE и т.д. Дополнительную информацию смотрите в главе Конфигурация сервера.

Примеры

Чтобы начать новую транзакцию со снимком данных, который получила уже существующая транзакция, его нужно сначала экспортировать из первой транзакции. При этом будет получен идентификатор снимка, например:

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT pg_export_snapshot();
 pg_export_snapshot
---------------------
 00000003-0000001B-1
(1 строка)

Затем этот идентификатор нужно передать команде SET TRANSACTION SNAPSHOT в начале новой транзакции:

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION SNAPSHOT '00000003-0000001B-1';

Совместимость

Эти команды определены в стандарте SQL, за исключением режима транзакции DEFERRABLE и формы SET TRANSACTION SNAPSHOT, которые являются расширениями QHB.

SERIALIZABLE является уровнем изоляции транзакций по умолчанию в стандарте. В QHB обычно используется значение по умолчанию READ COMMITTED, но вы можете изменить его, как упоминалось выше.

В стандарте SQL есть еще одна характеристика транзакции, которую нельзя задать с помощью этих команд: размер диагностической области. Эта концепция специфична для встраиваемого SQL,и поэтому не реализована в сервере QHB.

Стандарт SQL требует запятых между последовательными режимами_транзакций, но по историческим причинам QHB позволяет опустить запятые.


SHOW

SHOW - показать значение параметра времени выполнения

Синтаксис

SHOW имя
SHOW ALL

Описание

SHOW отображает текущую настройку параметров времени выполнения. Эти переменные могут быть установлены с помощью инструкции SET, путем редактирования конфигурационного файла qhb.conf, через переменную окружения PGOPTIONS (при использовании libpq или приложений на основе libpq)или через флаги командной строки при запуске сервера QHB. Смотрите дополнительную информацию в главе Конфигурация сервера.

Параметры

имя

Имя параметра времени выполнения. Доступные параметры описаны в главе Конфигурация сервера и на странице SET. Кроме того, есть несколько параметров, которые могут быть показаны, но не установлены:

SERVER_VERSION

Показывает номер версии сервера.

SERVER_ENCODING

Показывает кодировку набора символов на стороне сервера. В настоящее время этот параметр может быть показан, но не задан, поскольку кодировка определяется во время создания базы данных.

LC_COLLATE

Показывает параметр локали базы данных для правил сортировки (упорядочение текста). В настоящее время этот параметр можно отобразить, но не задать, так как он определяется во время создания базы данных.

LC_CTYPE

Показывает параметр локали базы данных для классификации символов. В настоящее время этот параметр можно отобразить, но не задать, так как он определяется во время создания базы данных.

IS_SUPERUSER

True, если текущая роль имеет права суперпользователя.

ALL

Показать значения всех параметров конфигурации, с описаниями.

Примечания

Ту же информацию выдаёт функция current_setting; см. Функции системного администрирования. Кроме того, системное представление pg_settings содержит ту же информацию.

Примеры

Просмотр текущего значения параметра DateStyle:

SHOW DateStyle;
 DateStyle
-----------
 ISO, MDY
(1 row)

Просмотр текущего значения параметра geqo:

SHOW geqo;
 geqo
------
 on
(1 row)

Просмотр всех параметров:

SHOW ALL;
            name         | setting |                description                                                          
-------------------------+---------+-------------------------------------------------
 allow_system_table_mods | off     | Allows modifications of the structure of ...
    .
    .
    .
 xmloption               | content | Sets whether XML data in implicit parsing ...
 zero_damaged_pages      | off     | Continues processing past damaged page headers.
(196 rows)

Совместимость

Команда SHOW является расширением QHB.

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

SET, RESET


START TRANSACTION

START TRANSACTION — начать блока транзакций

Синтаксис

START TRANSACTION [ режим_транзакции [, ...] ]

где режим_транзакции может быть одним из:

ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
    READ WRITE | READ ONLY
    [ NOT ] DEFERRABLE

Описание

Эта команда начинает новый блок транзакций. Если указан уровень изоляции, режим чтения / записи или отложенный режим, то новая транзакция имеет те же характеристики, как если бы была выполнена команда SET TRANSACTION. Данная команда равнозначна команде BEGIN.

Параметры

Смотрите SET TRANSACTION для получения информации о значении параметров для данного оператора.

Совместимость

Согласно стандарту, нет необходимости выполнять команду START TRANSACTION для начала блока транзакций: любая команда SQL неявно начинает блок. Поведение QHB можно рассматривать как неявное выполнение COMMIT после каждой команды, которая не следует за START TRANSACTION (или BEGIN), и поэтому его часто называют “autocommit”. Другие системы реляционных баз данных могут предлагать функцию автоматической фиксации в качестве удобной возможности.

Значение DEFERRABLE параметра режим_транзакции является расширением языка QHB.

Стандарт SQL требует запятых между последовательными режимы_транзакций, но по историческим причинам QHB позволяет опустить запятые.

Смотрите также сведения о совместимости в описании SET TRANSACTION.

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

BEGIN, COMMIT, ROLLBACK, SAVEPOINT, SET TRANSACTION


TRUNCATE

TRUNCATE - очистить таблицу или набор таблиц

Синтаксис

TRUNCATE [ TABLE ] [ ONLY ] имя [ * ] [, ... ]
    [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]

Описание

Команда TRUNCATE быстро удаляет все строки из набора таблиц (очищает таблицу). Она имеет тот же эффект, что и команда DELETE выполненная без условий, для каждой заданной таблицы, но поскольку она фактически не сканирует таблицы, она быстрее. Кроме того, она сразу же освобождает место на диске, и не требует последующей операции VACUUM. Это наиболее полезно на больших таблицах.

Параметры

имя

Имя, которое может быть дополнено схемой, таблицы для очищения. Если указывается ONLY перед именем таблицы, то только эта таблица очищается. Если ONLY не указано, очищаются таблица и все ее таблицы потомки(если таковые имеются). После имени таблицы можно также добавить необязательное указание *, чтобы явно указать, что включены таблицы-потомки.

RESTART IDENTITY

Автоматически перезапускать последовательности, принадлежащие столбцам очищаемой таблицы.

CONTINUE IDENTITY

Не изменять значения последовательностей. Это поведение по умолчанию.

CASCADE

Автоматически производить TRUNCATE для всех таблицы, имеющих ссылки по внешнему ключу на любую из заданных таблиц, или на любые таблицы, затронутые в результате действия CASCADE.

RESTRICT

Запретить очищение, если какая-либо из таблиц имеет ссылки по внешнему ключу из таблиц, которые не перечислены в команде. Это поведение по умолчанию.

Примечания

Чтобы очистить таблицу, необходимо иметь право TRUNCATE для этой таблицы.

TRUNCATE запрашивает блокировку ACCESS EXCLUSIVE для каждой таблицы, которую обрабатывает, что блокирует все другие параллельные операции на таблице. Когда указано RESTART IDENTITY, все последовательности, которые должны быть перезапущены, также блокируются. Если требуется параллельный доступ к таблице, следует использовать команду DELETE.

TRUNCATE нельзя использовать для таблицы, имеющей ссылки по внешним ключам из других таблиц, если только все такие таблицы не очищаются в той же команде. Проверка допустимости операции в таких случаях потребует сканирования таблиц, а весь смысл команды заключается в том, чтобы этого не делать. Можно использовать CASCADE для автоматической обработки всех зависимых таблиц — но будьте очень осторожны при использовании этой опции, вы можете потерять данные, которые не собирались удалять!

При выполнении TRUNCATE не будут срабатывать триггеры ON DELETE, которые могут существовать для таблиц. Но будут срабатывать триггеры ON TRUNCATE. Если триггеры ON TRUNCATE определены для любой из таблиц, то все триггеры BEFORE TRUNCATE срабатывают до того, как произойдет очищение, а все триггеры AFTER TRUNCATE срабатывают после выполнения очищения последней таблицы из списка и сброса всех последовательностей. Триггеры будут срабатывать в том порядке, в каком таблицы должны быть обработаны (сначала тех, которые перечислены в команде, а затем для тех, которые затрагиваются каскадно).

Команда TRUNCATE не является безопасной с точки зрения MVCC. После очищения таблица будет выглядеть пустой для параллельных транзакций, если они используют снимок, сделанный до того, как произошло очищение. Смотрите раздел Ограничения для получения более подробной информации.

TRUNCATE является безопасной транзакционной операцией по отношению к данным в таблицах: очищение будет безопасно откачено, если окружающая транзакция не будет зафиксирована.

Когда указывается RESTART IDENTITY, подразумеваемые команды ALTER SEQUENCE RESTART также выполняются транзакционно; то есть они будут откачены, если окружающая транзакция не будет зафиксирована. Это не похоже на обычное поведение ALTER SEQUENCE RESTART. Имейте в виду, что если выполняются какие-либо дополнительные операции с последовательностями, эффект этих операций также будет отменён, но не их влияние на currval(); то есть, после завершения транзакции currval() будет продолжать возвращать последнее значение последовательности, полученное внутри неудачной транзакции, даже если сама последовательность уже может быть не согласованной с ним. Подобным образом обычно currval() ведёт себя и после сбоя транзакции.

TRUNCATE в настоящее время не поддерживается для сторонних таблиц. Это означает, что если у указанной таблицу есть какие-либо дочерние таблицы, которые являются сторонними, команда завершится ошибкой.

Примеры

Очищение таблиц bigtable и fattable:

TRUNCATE bigtable, fattable;

Та же операция и сброс любых связанных генераторов последовательностей:

TRUNCATE bigtable, fattable RESTART IDENTITY;

Очищение таблицы othertable и каскадная обработка таблиц, которые ссылаются на othertable через ограничения внешнего ключа:

TRUNCATE othertable CASCADE;

Совместимость

Стандарт SQL: 2008 включает команду TRUNCATE с синтаксисом TRUNCATE TABLE имя_таблицы. Предложения CONTINUE IDENTITY/RESTART IDENTITY также включены в стандарт, но имеют несколько другое, хотя и похожее назначение. Поведение этой команды при параллельных операциях определяются реализацией, согласно стандарту, так что вышеуказанные примечания следует рассматривать и сопоставлять с другими реализациями, если это необходимо.

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

DELETE


UNLISTEN

UNLISTEN - остановить прослушивание уведомления

Синтаксис

UNLISTEN { канал | * }

Описание

UNLISTEN используется для удаления существующей подписки на события NOTIFY. UNLISTEN отменяет любую существующую подписку текущего сеанса QHB на канал уведомлений с именем канал. Специальный знак * отменяет все подписки текущего сеанса.

Страница NOTIFY содержит более подробное описание команд LISTEN и NOTIFY.

Параметры

канал

Имя канала уведомления (любой идентификатор).

*

Все текущие подписки на уведомления для этого сеанса, отменяются.

Примечания

Вы можете также попытаться отменить подписку на канал, на который не подписаны; при этом не появится никакого предупреждения или ошибки.

В конце каждого сеанса UNLISTEN * выполняется автоматически.

Транзакция, которая была выполняла UNLISTEN, не может быть подготовлена к двухфазной фиксации.

Примеры

Подписка на получение события:

LISTEN virtual;
NOTIFY virtual;
Asynchronous notification "virtual" received from server process with PID 8448.

После того, как UNLISTEN была выполнена, дальнейшие NOTIFY сообщения будут игнорироваться:

UNLISTEN virtual;
NOTIFY virtual;
-- no NOTIFY event is received

Совместимость

В стандарте SQL отсутствует команда UNLISTEN.

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

LISTEN, NOTIFY


UPDATE

UPDATE - изменить строки таблицы

Синтаксис

[ WITH [ RECURSIVE ] запрос_WITH [, ...] ]
UPDATE [ ONLY ] имя_таблицы [ * ] [ [ AS ] псевдоним ]
    SET { имя_столбца = { выражение | DEFAULT } |
          ( имя_столбца [, ...] ) = [ ROW ] ( { выражение | DEFAULT } [, ...] ) |
          ( имя_столбца [, ...] ) = ( вложенный_SELECT )
        } [, ...]
    [ FROM элемент_FROM [, ...] ]
    [ WHERE условие | WHERE CURRENT OF имя_курсора ]
    [ RETURNING * | выражение_результата [ [ AS ] имя_результата ] [, ...] ]

Описание

UPDATE изменяет значения указанных столбцов во всех строках, удовлетворяющих условию. Только столбцы, которые необходимо изменить, должны быть указываться в предложении SET; столбцы, явно не измененные, сохраняют свои предыдущие значения.

Существует два способа изменить строки в таблице, используя информацию, содержащуюся в других таблицах базы данных: с помощью подзапросов или указав дополнительные таблицы в предложении FROM. Какой метод является более подходящим, зависит от конкретных обстоятельств.

Необязательное предложение RETURNING указывает, что UPDATE должна вычислить и возвратить значения каждой фактически обновленной строки. В RETURNING можно вычислить любое выражение, использующее столбцы таблицы и/или столбцы других таблиц, упомянутых в списке FROM. При этом в при вычислении используются новые (после обновления) значения столбцов таблицы. Список RETURNING имеет тот же синтаксис, что и список результатов SELECT.

У пользователя должно быть право UPDATE для таблицы, или по крайней мере, для столбцов, которые перечислены для обновления, чтобы выполнить команду. Также пользователю необходимо иметь право SELECT для всех столбцов, значения которых считываются в выражениях или условии.

Параметры

запрос_WITH

Предложение WITH позволяет указать один или несколько вложенных запросов, на которые можно ссылаться по имени в запросе UPDATE. Смотрите Запросы WITH и SELECT для получения дополнительной информации.

имя_таблицы

Имя, которое может быть дополнено схемой, таблицы для обновления. Если перед именем таблицы добавлено ONLY, соответствующие строки обновляются только в указанной таблице. Если ONLY не указано, строки также обновляются в любых таблицах, наследуемых от указанной таблицы. После имени таблицы можно указать * , чтобы явно обозначить, что в операцию должны быть включены таблицы-потомки.

псевдоним

Альтернативное имя целевой таблицы. Когда указывается псевдоним, он полностью скрывает фактическое имя таблицы. Например: в запросе UPDATE foo AS f, остальная части инструкции UPDATE должны ссылаться на таблицу по имени f, а не foo.

имя_столбца

Имя столбца в таблице с именем имя_таблицы. Имя столбца может быть определено с помощью имени вложенного поля или индекса массива, если это необходимо. Имя таблицы добавлять к имени целевого столбца не нужно — например, UPDATE table_name SET table_name.col = 1 недопустимая команда.

выражение

Выражение, результат которого присваивается столбцу. Выражение может использовать предыдущие значения этого и других столбцов в таблице.

DEFAULT

Установить для столбца значение по умолчанию (которое может NULL, если ему не было присвоено никакого конкретного выражения по умолчанию).

вложенный_SELECT

Подзапрос SELECT, который создает столько выходных столбцов, сколько указано в скобках списка столбцов, предшествующем ему. Подзапрос должен выдавать не более одной строки. Если он выдает одну строку, значения его столбцов назначаются целевым столбцам; если он не не возвращает строк, целевым столбцам назначается NULL. Подзапрос может ссылаться на предыдущие значения текущей обновляемой строки таблицы.

элемент_FROM

Список табличных выражений, позволяющий обращаться в условии WHERE и выражениях новых данных к столбцам других таблиц. В нём используется тот же синтаксис, что и в предложении FROM инструкции SELECT. Обратите внимание, имя целевой таблицы повторять в предложении FROM нужно, только если вы собираетесь определить замкнутое соединение(в этом случае для данного имени должен появиться псевдоним в элемент_FROM).

условие

Выражение, которое возвращает значение типа boolean. Только строки, для которых это выражение возвращает true будут обновлены.

имя_курсора

Имя курсора, который будет использоваться в условии WHERE CURRENT OF. С таким условием будет обновлена строка, выбранная из этого курсора последней. Курсор должен быть запросом без группировки в целевой таблице обновления. Обратите внимание, что WHERE CURRENT OF не может быть указано вместе с логическим условием. Дополнительную информацию об использовании курсоров с помощью DECLARE смотрите в разделе WHERE CURRENT OF.

выражение_результата

Выражение, которое вычисляется и возвращается командой UPDATE после обновления каждой строки. Выражение может использовать любые имена столбцов таблицы с именем by имя таблицы или таблица(ы), перечисленные в ОТ. Писать * чтобы вернуть все столбцы.

имя_результата

Имя, используемое для возвращаемого столбца.

Выводимая информация

После успешного завершения команда UPDATE возвращает метку команды в форме

UPDATE число

Где число это число обновленных строк, включая строки, значения которых не изменились. Обратите внимание, что это число может быть меньше, чем число строк, которые соответствуют условию когда обновления были подавлены триггером BEFORE UPDATE . Если число равно 0, ни одна строка не была обновлена запросом (это не считается ошибкой).

Если команда UPDATE содержит RETURNING, результат будет похож на то, что возвращает оператор SELECT, содержащий столбцы и значения, определенные в список RETURNING, полученный по строке(строкам), обновляемой командой.

Примечания

Когда присутствует предложение FROM , по существу происходит следующее, целевая таблица соединяется с таблицами, из списка FROM, и каждая выходная строка соединения представляет собой операцию обновления для целевой таблицы. При использовании FROM необходимо убедиться, что соединение создает не более одной выходной строки для каждой строки, подлежащей изменению. Другими словами, целевая строка не должна присоединяться более чем к одной строке из другой таблицы(таблиц). Если это так, то только одна из соединяемых строк будет использоваться для обновления целевой строки, но какая из них будет использоваться, трудно предсказать.

Из-за этой неопределенности ссылаться на другие таблицы только в пределах подзапросов будет безопаснее, хотя часто такие конструкции труднее читаются и медленнее отрабатывают, чем при использовании соединения.

В случае партиционированной таблицы обновление строки может привести к тому, что она больше не будет удовлетворять ограничению содержащей ее партиции. В этом случае, если в дереве разделов есть какая-либо другая партиция, для которой эта строка удовлетворяет ограничению партиции, строка перемещается в эту партицию. Если такой раздел отсутствует, произойдет ошибка. За кулисами движение строки фактически является операцией DELETE и INSERT.

Существует вероятность того, что одновременное UPDATE или DELETE перемещаемой строки приведет к ошибке сериализации. Предположим, что сеанс 1 выполняет UPDATE ключа партиционирования, а в то же время параллельный сеанс 2, для которого эта строка видна, выполняет операцию UPDATE или DELETE этой строки. В таком случае UPDATE или DELETE сеанса 2 обнаружит перемещение строки и вызовет ошибку сбоя сериализации (которая всегда возвращается с кодом SQLSTATE ’40001’). Приложения могут попытаться повторить транзакцию, если это произойдет. В обычном случае, когда таблица не партиционирована, или нет никакого перемещения строки, сеанс 2 определил бы недавно обновленную строку и выполнил UPDATE / DELETE на этой новой версии строки.

Обратите внимание, что хотя строки могут быть перемещены из локальных партиций в партицию в сторонней таблице (при условии, что обертка сторонних данных поддерживает маршрутизацию кортежей), они не могут быть перемещены из партиции сторонней таблицы в другую партицию.

Примеры

Изменение слова Drama на Dramatic в столбце kind таблицы films:

UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama';

Изменение значений температуры и сброс уровня осадков к значению по умолчанию в одной строке таблицы weather:

UPDATE weather SET temp_lo = temp_lo+1, temp_hi = temp_lo+15, prcp = DEFAULT
  WHERE city = 'San Francisco' AND date = '2003-07-03';

Выполнение той же операции с получением изменённых записей:

UPDATE weather SET temp_lo = temp_lo+1, temp_hi = temp_lo+15, prcp = DEFAULT
  WHERE city = 'San Francisco' AND date = '2003-07-03'
  RETURNING temp_lo, temp_hi, prcp;

Такое же изменение с применением альтернативного синтаксиса со списком столбцов:

UPDATE weather SET (temp_lo, temp_hi, prcp) = (temp_lo+1, temp_lo+15, DEFAULT)
  WHERE city = 'San Francisco' AND date = '2003-07-03';

Увеличение счётчика продаж для менеджера, занимающегося компанией Acme Corporation, с применением предложения FROM:

UPDATE employees SET sales_count = sales_count + 1 FROM accounts
  WHERE accounts.name = 'Acme Corporation'
  AND employees.id = accounts.sales_person;

Выполнение той же операции, с подзапросом в предложении WHERE:

UPDATE employees SET sales_count = sales_count + 1 WHERE id =
  (SELECT sales_person FROM accounts WHERE name = 'Acme Corporation');

Изменение имени контакта в таблице счетов (это должно быть имя назначенного менеджера по продажам):

UPDATE accounts SET (contact_first_name, contact_last_name) =
    (SELECT first_name, last_name FROM salesmen
     WHERE salesmen.id = accounts.sales_id);

Подобный результат можно получить, применив соединение:

UPDATE accounts SET contact_first_name = first_name,
                    contact_last_name = last_name
  FROM salesmen WHERE salesmen.id = accounts.sales_id;

Однако, если salesmen.id — не уникальный ключ, второй запрос может давать непредсказуемые результаты, тогда как первый запрос гарантированно выдаст ошибку, если найдётся несколько записей с одним id. Кроме того, если соответствующая запись accounts.sales_id не найдётся, первый запрос запишет в поля имени NULL, а второй вовсе не изменит строку.

Обновление статистики в сводной таблице в соответствии с текущими данными:

UPDATE summary s SET (sum_x, sum_y, avg_x, avg_y) =
    (SELECT sum(x), sum(y), avg(x), avg(y) FROM data d
     WHERE d.group_id = s.group_id);

Попытка добавить новый продукт вместе с количеством. Если такая запись уже существует, вместо этого увеличить количество данного продукта в существующей записи. Чтобы реализовать этот подход, не откатывая всю транзакцию, можно использовать точки сохранения:

BEGIN;
-- другие операции
SAVEPOINT sp1;
INSERT INTO wines VALUES('Chateau Lafite 2003', '24');
-- Предполагая, что здесь возникает ошибка из-за нарушения уникальности ключа,
-- мы выполняем следующие команды:
ROLLBACK TO sp1;
UPDATE wines SET stock = stock + 24 WHERE winename = 'Chateau Lafite 2003';
-- Продолжение других операций и в завершение...
COMMIT;

Изменение значения столбца kind таблицы films в строке, на которой в данный момент находится курсор c_films:

UPDATE films SET kind = 'Dramatic' WHERE CURRENT OF c_films;

Совместимость

Эта команда соответствует стандарту SQL, за исключением предложений FROM и RETURNING, которые являются расширениями QHB, так же как и возможность применять WITH с UPDATE.

В некоторых других СУБД также поддерживается дополнительное предложение FROM, но предполагается, что целевая таблица должна ещё раз упоминаться в этом предложении. QHB не так интерпретирует FROM. Будьте осторожны при портировании приложений, которые используют это расширение языка.

Согласно стандарту, исходным значением для заключенного в скобки списка имен целевых столбцов может быть любое строковое выражение, возвращающее строку с правильным числом столбцов. QHB принимает в качестве этого значения только Конструкторы строк или подзапрос SELECT. Изменяемое значение отдельного столбца может быть указано как DEFAULT конструкторе строки, но не внутри подзапроса SELECT.


VACUUM

VACUUM - провести сборку мусора и, возможно, дополнительно проанализировать базу данных

Синтаксис

VACUUM [ ( параметр [, ...] ) ] [ таблица_и_столбцы [, ...] ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ таблица_и_столбцы [, ...] ]

Возможные параметры:

    FULL [ логическое_значение ]
    FREEZE [ логическое_значение ]
    VERBOSE [ логическое_значение ]
    ANALYZE [ логическое_значение ]
    DISABLE_PAGE_SKIPPING [ логическое_значение ]
    SKIP_LOCKED [ логическое_значение ]
    INDEX_CLEANUP [ логическое_значение ]
    TRUNCATE [ логическое_значение ]

Где таблица_и_столбцы:

    имя_таблицы [ ( имя_столбца [, ...] ) ]

Описание

VACUUM освобождает пространство, занятое мертвыми кортежами. В обычной работе QHB удаленные или устаревшие из-за обновления кортежи физически не удаляются из своей таблицы; они остаются в ней до тех пор, пока не будет вызван VACUUM. Поэтому VACUUM нужно запускать периодически, особенно на часто обновляемых таблицах.

Без списка таблица_и_столбцы, VACUUM обрабатывает каждую таблицу и материализованное представление в текущей базе данных, если текущий пользователь имеет разрешение на их очистку. С помощью списка VACUUM обрабатывает только заданные таблицы.

VACUUM ANALYZE выполняет VACUUM, а затем ANALYZE для каждой выбранной таблицы. Это удобная комбинированная форма для сценариев текущего обслуживания. Дополнительную информацию о его обработке смотрите в разделе ANALYZE.

Обычный VACUUM (без FULL) просто восстанавливает пространство и делает его доступным для повторного использования. Эта форма команды может работать параллельно с обычным чтением и записью таблицы, так как исключительная блокировка не возникает. Однако дополнительное пространство не возвращается в операционную систему (в большинстве случаев); оно просто остается доступным для повторного использования в той же таблице.

VACUUM FULL перезаписывает все содержимое таблицы в новый дисковый файл без дополнительного места, позволяя возвращать неиспользуемое пространство в операционную систему. Эта форма работает намного медленнее и требует исключительной блокировки для каждой таблицы во время ее обработки.

Когда список опций окружен скобками, опции могут быть записаны в любом порядке. Без скобок параметры должны быть указаны точно в указанном выше порядке. Синтаксис с заключением в скобки был добавлен в PostgreSQL 9.0; синтаксис без скобок является устаревшим.

Параметры

FULL

Выполняет ”полный" вакуум, который может освободить больше места, но занимает гораздо больше времени и исключительно блокирует таблицы. Этот метод также требует дополнительного дискового пространства, так как он записывает новую копию таблицы и не освобождает старую копию до завершения операции. Обычно это следует использовать только тогда, когда требуется освободить значительное пространство внутри таблицы.

FREEZE

Выбирает агрессивное "замораживание" кортежей. Указание FREEZE эквивалентно выполнению VACUUM с параметрами vacuum_freeze_min_age и vacuum_freeze_table_age, установленными в ноль. Агрессивное замораживание всегда выполняется при перезаписи таблицы, поэтому этот параметр является избыточным, когда указывается уточнение FULL.

VERBOSE

Печать подробного отчета о вакуумной активности для каждой таблицы.

ANALYZE

Обновляет статистику, используемую планировщиком для определения наиболее эффективного способа выполнения запроса.

DISABLE_PAGE_SKIPPING

Обычно VACUUM пропускает страницы, основанные на карте видимости. Страницы, где все кортежи, как известно, будут заморожены, всегда можно пропустить, а те, где все кортежи, как известно, будут видны для всех транзакций, могут быть пропущены, за исключением выполнения агрессивного вакуума. Кроме того, за исключением случаев выполнения агрессивного вакуума, некоторые страницы могут быть пропущены, чтобы избежать ожидания завершения других сеансов их использования. Этот параметр отключает все операции пропуска страниц и предназначен для использования только в том случае, если содержимое карты видимости является подозрительным, что должно происходить только в том случае, если существует аппаратная или программная проблема, вызывающая повреждение базы данных.

SKIP_LOCKED

Указывает, что VACUUM не должен ждать освобождения конфликтующих блокировок при начале работы над таблицей: если таблица не может быть немедленно заблокирована без ожидания, она пропускается. Обратите внимание, что даже при использовании этой опции VACUUM может все еще блокироваться при открытии индексов. Кроме того, VACUUM ANALYZE может блокироваться при получении выборочных строк из партиций, дочерних элементов наследования таблиц и некоторых типов сторонних таблиц. Кроме того, хотя VACUUM обычно обрабатывает все разделы указанных партиционированных таблиц, эта опция позволит VACUUM пропустить все партиции, если на партиционированной таблице имеется конфликтующая блокировка.

INDEX_CLEANUP

Указывает, что VACUUM должен пытаться удалить записи индекса, указывающие на мертвые кортежи. Это обычно является желаемым поведением и является значением по умолчанию, если vacuum_index_cleanup параметр был установлен в значение false для таблицы, подлежащей вакуумированию. Установка этого параметра в значение false может быть полезна, когда необходимо сделать вакуумный запуск как можно быстрее, например, чтобы избежать неизбежного обхода идентификатора транзакции (см. раздел Предотвращение ошибок wraparound идентификатора транзакции). Однако, если очистка индекса не выполняется регулярно, производительность может пострадать, потому что при изменении таблицы индексы будут накапливать мертвые кортежи, а сама таблица будет накапливать указатели мертвых строк, которые не могут быть удалены до завершения очистки индекса. Этот параметр не действует для таблиц, которые не имеют индекса, и игнорируется, если используется VACUUM FULL.

TRUNCATE

Указывает, что VACUUM должен попытаться обрезать любые пустые страницы в конце таблицы и освободить дисковое пространство для усеченных страниц, которые будут возвращены в операционную систему. Это обычно является желаемым поведением и является значением по умолчанию, если параметр vacuum_truncate был установлен в значение false для таблицы, подлежащей вакуумированию, при её создании. Установка этого параметра в false может быть полезным, чтобы избежать ACCESS EXCLUSIVE блокировки таблицы, которая требуется для усечения. Этот параметр игнорируется, если используется опция FULL.

логическое_значение

Указывает, должен ли выбранный параметр быть включен или выключен. Вы можете написать: TRUE, ON, или 1 чтобы включить этот параметр, и FALSE, OFF, или 0 чтобы отключить. логическое_значение может быть опущено, в этом случае предполагается TRUE.

имя_таблицы

Имя, которое может быть дополнено схемой, конкретной таблицы или материализованного представления для вакуума. Если указанная таблица является партиционированной таблицей,все ее конечные разделы очищаются.

имя_столбца

Имя конкретного столбца для анализа. По умолчанию производится анализ всех столбцов. Если указан список столбцов, также должно быть указано ANALYZE.

Вывод на консоль

Когда указывается VERBOSE, VACUUM выдает сообщения о том, какая таблица в настоящее время обрабатывается. Также печатаются различные статистические данные о таблицах.

Примечания

Чтобы очистить таблицу, обычно нужно быть её владельцем или суперпользователем. Однако владельцам баз данных разрешено вакуумировать все таблицы в своих базах данных, за исключением общих каталогов. (Ограничение для общих каталогов означает, что истинная очистка всей базы данных может выполняться только суперпользователем). VACUUM будет пропускать все таблицы, которые вызывающий пользователь не имеет права очищать.

VACUUM не может быть выполнен внутри блока транзакций.

Для таблиц с индексами GIN VACUUM (в любой форме) также завершает все отложенные вставки индекса, перемещая отложенные записи индекса в соответствующие места в основной структуре индекса GIN. Дополнительную информацию смотрите в разделе Быстрое обновление GIN.

Для удаления мертвых строк рекомендуется часто (по крайней мере, ночью) очищать активные промышленные базы данных. После добавления или удаления большого количества строк может быть полезно выполнить команду VACUUM ANALYZE для соответствующей таблицы. Это позволит обновить системные каталоги с результатами всех последних изменений, а также позволит планировщику запросов QHB принимать лучшие решения при планировании запросов.

Опция FULL не рекомендуется для рутинного использования, но может быть полезна в особых случаях. Например, когда вы удалили или обновили большую часть строк в таблице и хотели бы, чтобы таблица физически уменьшилась, стала занимать меньше места на диске и стала позволять более быстрое сканирование таблицы. VACUUM FULL обычно сжимает таблицу более эффективно, чем простой VACUUM.

VACUUM вызывает значительное увеличение трафика ввода / вывода, что может привести к низкой производительности для других активных сеансов. Поэтому иногда рекомендуется использовать функцию задержки вакуума на основе затрат. Смотрите раздел Определение предела стоимости работы процесса vacuum для получения подробной информации.

QHB включает в себя установку "autovacuum", которая может автоматизировать рутинное вакуумное обслуживание. Для получения дополнительной информации об автоматическом и ручном вакуумировании см. раздел Регулярный vacuum.

Примеры

Очистить одну таблицу onek, проанализировать ее для оптимизатора и распечатать подробный отчет о вакуумной активности:

VACUUM (VERBOSE, ANALYZE) onek;

Совместимость

В стандарте SQL нет оператора VACUUM.

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

vacuumdb, Определение предела стоимости работы процесса vacuum, Процесс «Автовакуум»


VALUES

VALUES - вычислить набор строк

Синтаксис

VALUES ( выражение [, ...] ) [, ...]
    [ ORDER BY выражение_сортировки [ ASC | DESC | USING оператор ] [, ...] ]
    [ LIMIT { число | ALL } ]
    [ OFFSET начало [ ROW | ROWS ] ]
    [ FETCH { FIRST | NEXT } [ число ] { ROW | ROWS } ONLY ]

Описание

Команда VALUES вычисляет значение строки или набор значений строки, заданных выражениями значений. Она чаще всего используется для для формирования «таблицы констант» в рамках более крупной команды, но ее можно использовать самостоятельно.

Если указано более одной строки, все строки должны иметь одинаковое количество элементов. Типы данных столбцов результирующей таблицы определяются путем объединения явных и неявных типов выражений, заданных для этих столбцов, с использованием тех же правил, что и для UNION.

В составе других команд синтаксис допускает использование VALUES везде, где допускается SELECT. Так как грамматически она воспринимается как SELECT, с командой VALUES можно использовать предложения ORDER BY, LIMIT (или равнозначное FETCH FIRST) и OFFSET.

Параметры

выражение

Константа или выражение для вычисления и вставки в указанное место в результирующей таблице (наборе строк). В списке значений, отображаемом на верхнем уровне INSERT, выражение может быть заменено на значение DEFAULT чтобы указать, что должно быть вставлено значение по умолчанию столбца. DEFAULT
нельзя использовать, когда VALUES употребляется в других контекстах.

выражение_сортировки

Выражение или целочисленная константа, указывающая, как сортировать результирующие строки. Это выражение может ссылаться на столбцы результата VALUES по именам column1, column2 и т. д. Дополнительные сведения см. в разделе предложение ORDER BY.

оператор

Оператор сортировки. Дополнительные сведения см. в разделе предложение ORDER BY.

число

Максимальное количество строк, которое должно быть возвращено. Дополнительные сведения см. в разделе предложение LIMIT.

начало

Число строк, которые необходимо пропустить перед началом возврата строк. Дополнительные сведения см. в разделе предложение LIMIT.

Примечания

Следует избегать списков значений с очень большим количеством строк, так как можно столкнуться с недостатком памяти или низкой производительностью. VALUES, появляющиеся в INSERT, являются особым случаем (поскольку нужные типы столбцов известны из целевой таблицы команды INSERT и их не надо вычислять, сканируя весь список VALUES), поэтому в этом случае можно обрабатывать более крупные списки, чем это практично в других контекстах.

Примеры

Простая команда VALUES:

VALUES (1, 'one'), (2, 'two'), (3, 'three');

Эта команда выдаст таблицу из двух столбцов и трёх строк. По сути она равнозначна запросу:

SELECT 1 AS column1, 'one' AS column2
UNION ALL
SELECT 2, 'two'
UNION ALL
SELECT 3, 'three';

Более часто использование VALUES в составе другой команды SQL. Чаще всего она применяется в INSERT:

INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');

В контексте INSERT список VALUES может содержать слово DEFAULT, указывающее, что здесь вместо некоторого значения должно использоваться значение столбца по умолчанию:

INSERT INTO films VALUES
    ('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes'),
    ('T_601', 'Yojimbo', 106, DEFAULT, 'Drama', DEFAULT);

VALUES также может применяться там, где можно написать подзапрос SELECT, например в предложении FROM:

SELECT f.*
  FROM films f, (VALUES('MGM', 'Horror'), ('UA', 'Sci-Fi')) AS t (studio, kind)
  WHERE f.studio = t.studio AND f.kind = t.kind;

UPDATE employees SET salary = salary * v.increase
  FROM (VALUES(1, 200000, 1.2), (2, 400000, 1.4)) AS v (depno, target, increase)
  WHERE employees.depno = v.depno AND employees.sales >= v.target;

Обратите внимание, что когда VALUES используется в предложении FROM, предложение AS обязательно, так же, как и для SELECT. При этом не требуется указывать в AS имена всех столбцов, но это рекомендуется делать.

Когда VALUES используется в команде INSERT, значения автоматически будут приведены к типу данных соответствующего целевого столбца. Когда VALUES используется в других контекстах, может потребоваться указать нужный тип данных. Если все записи представлены строковыми константами в кавычках, достаточно привести к нужному типу значения в первой строке, чтобы задать тип для всех строк:

SELECT * FROM machines
WHERE ip_address IN (VALUES('192.168.0.1'::inet), ('192.168.0.10'), ('192.168.1.43'));

Совет
Для проверок на включение IN, лучше полагаться на форму IN со списоком скаляров чем написать запрос VALUES, как показано выше. Список скаляров проще для записи и часто является более эффективно обрабатывается.

Совместимость

VALUES соответствует стандарту SQL. LIMIT и OFFSET являются расширениями QHB; см. также раздел SELECT.

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

INSERT, SELECT