ALTER TYPE — изменение определения типа
ALTER TYPEnameOWNER TO {new_owner| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER TYPEnameRENAME TOnew_nameALTER TYPEnameSET SCHEMAnew_schemaALTER TYPEnameRENAME ATTRIBUTEattribute_nameTOnew_attribute_name[ CASCADE | RESTRICT ] ALTER TYPEnameaction[, ... ] ALTER TYPEnameADD VALUE [ IF NOT EXISTS ]new_enum_value[ { BEFORE | AFTER }neighbor_enum_value] ALTER TYPEnameRENAME VALUEexisting_enum_valueTOnew_enum_valueALTER TYPEnameSET (property=value[, ... ] ) гдеactionможет быть одним из: ADD ATTRIBUTEattribute_namedata_type[ COLLATEcollation] [ CASCADE | RESTRICT ] DROP ATTRIBUTE [ IF EXISTS ]attribute_name[ CASCADE | RESTRICT ] ALTER ATTRIBUTEattribute_name[ SET DATA ] TYPEdata_type[ COLLATEcollation] [ CASCADE | RESTRICT ]
ALTER TYPE изменяет определение существующего типа.
Существует несколько подформ:
OWNERЭта форма изменяет владельца типа.
RENAMEЭта форма изменяет имя типа.
SET SCHEMAЭта форма перемещает тип в другую схему.
RENAME ATTRIBUTEЭта форма применима только к составным типам. Она изменяет имя отдельного атрибута типа.
ADD ATTRIBUTE
Эта форма добавляет новый атрибут к составному типу, используя тот же синтаксис, что и
CREATE TYPE.
DROP ATTRIBUTE [ IF EXISTS ]
Эта форма удаляет атрибут из составного типа.
Если указано IF EXISTS и атрибут
не существует, ошибка не возникает. В этом случае выдается уведомление.
ALTER ATTRIBUTE ... SET DATA TYPEЭта форма изменяет тип атрибута составного типа.
ADD VALUE [ IF NOT EXISTS ] [ BEFORE | AFTER ]
Эта форма добавляет новое значение к перечисляемому типу (enum). Позиция нового значения
в порядке сортировки enum может быть указана как BEFORE (перед)
или AFTER (после) одного из существующих значений. В противном случае
новый элемент добавляется в конец списка значений.
Если указано IF NOT EXISTS, это не ошибка, если
тип уже содержит новое значение: выдается уведомление, но никаких других
действий не предпринимается. В противном случае произойдет ошибка, если новое значение
уже присутствует.
RENAME VALUEЭта форма переименовывает значение перечисляемого типа (enum). Позиция значения в порядке сортировки enum не затрагивается. Произойдет ошибка, если указанное значение отсутствует или новое имя уже присутствует.
SET ( property = value [, ... ] )
Эта форма применима только к базовым типам. Она позволяет настроить
подмножество свойств базового типа, которые можно установить в CREATE TYPE.
Конкретно можно изменить следующие свойства:
RECEIVE можно установить в имя функции бинарного ввода
или в NONE для удаления функции бинарного ввода типа.
Использование этой опции требует привилегий суперпользователя.
SEND можно установить в имя функции бинарного вывода
или в NONE для удаления функции бинарного вывода типа.
Использование этой опции требует привилегий суперпользователя.
TYPMOD_IN можно установить в имя функции ввода модификатора типа,
или в NONE для удаления функции ввода модификатора типа.
Использование этой опции требует привилегий суперпользователя.
TYPMOD_OUT можно установить в имя функции вывода модификатора типа,
или в NONE для удаления функции вывода модификатора типа.
Использование этой опции требует привилегий суперпользователя.
ANALYZE можно установить в имя тип-специфичной
функции сбора статистики, или в NONE для удаления
функции сбора статистики типа. Использование этой опции
требует привилегий суперпользователя.
SUBSCRIPT можно установить в имя тип-специфичной
функции-обработчика подстрочного индексирования, или в NONE для удаления
функции-обработчика подстрочного индексирования типа. Использование этой опции
требует привилегий суперпользователя.
STORAGE
можно установить в plain (обычное),
extended (расширенное), external (внешнее)
или main (основное) (см. Раздел 7.15.2 для
получения дополнительной информации о значениях). Однако изменение
с plain на другое значение требует привилегий суперпользователя
(поскольку при этом требуется, чтобы все C-функции типа были
готовы к TOAST), а изменение на plain из другого
значения вообще запрещено (поскольку в базе данных уже могут присутствовать
значения типа, подвергнутые TOAST). Обратите внимание, что изменение этой
опции само по себе не меняет никаких сохраненных данных, оно лишь устанавливает
стратегию TOAST по умолчанию для будущих столбцов таблицы.
См. ALTER TABLE для изменения стратегии TOAST
для существующих столбцов таблицы.
См. CREATE TYPE для получения более подробной информации об этих свойствах типа. Обратите внимание, что там, где это уместно, изменение этих свойств для базового типа будет автоматически распространено на домены, основанные на этом типе.
Действия ADD ATTRIBUTE (ДОБАВИТЬ АТРИБУТ), DROP
ATTRIBUTE (УДАЛИТЬ АТРИБУТ) и ALTER ATTRIBUTE (ИЗМЕНИТЬ АТРИБУТ)
могут быть объединены в список нескольких изменений для параллельного применения.
Например, можно добавить несколько атрибутов
и/или изменить тип нескольких атрибутов одной командой.
Вы должны владеть типом, чтобы использовать ALTER TYPE.
Чтобы изменить схему типа, вы также должны иметь
привилегию CREATE на новой схеме.
Чтобы изменить владельца, вы должны иметь возможность выполнить SET ROLE на новую
роль-владельца, и эта роль должна иметь привилегию CREATE
на схеме типа.
(Эти ограничения обеспечивают, что изменение владельца
не сделает ничего, что вы не могли бы сделать, удалив и воссоздав тип.
Однако суперпользователь может изменить владельца любого типа в любом случае.)
Чтобы добавить атрибут или изменить тип атрибута, вы также
должны иметь привилегию USAGE на тип данных атрибута.
nameИмя (возможно, с указанием схемы) существующего типа для изменения.
new_nameНовое имя для типа.
new_ownerИмя пользователя нового владельца типа.
new_schemaНовая схема для типа.
attribute_nameИмя атрибута для добавления, изменения или удаления.
new_attribute_nameНовое имя переименовываемого атрибута.
data_typeТип данных добавляемого атрибута или новый тип изменяемого атрибута.
new_enum_valueНовое значение, добавляемое в список значений перечисляемого типа (enum), или новое имя для существующего значения. Как и все литералы enum, оно должно быть заключено в кавычки.
neighbor_enum_valueСуществующее значение enum, непосредственно перед или после которого следует добавить новое значение в порядке сортировки enum. Как и все литералы enum, оно должно быть заключено в кавычки.
existing_enum_valueСуществующее значение enum, которое следует переименовать. Как и все литералы enum, оно должно быть заключено в кавычки.
propertyИмя свойства базового типа для изменения; см. выше возможные значения.
CASCADEАвтоматически распространить операцию на типизированные таблицы изменяемого типа и их потомков.
RESTRICTОтказать в выполнении операции, если изменяемый тип является типом типизированной таблицы. Это поведение по умолчанию.
Если ALTER TYPE ... ADD VALUE (форма, добавляющая новое
значение к перечисляемому типу) выполняется внутри блока транзакции, новое
значение нельзя использовать до тех пор, пока транзакция не будет зафиксирована.
Сравнения с участием добавленного значения enum иногда будут медленнее, чем
сравнения с участием только исходных членов типа enum. Обычно это
происходит только в том случае, если используется BEFORE или AFTER
для установки позиции сортировки нового значения где-либо, кроме конца списка.
Однако иногда это происходит, даже если новое значение добавляется в конец
(это происходит, если счетчик OID «переполнился» с момента
первоначального создания типа enum). Замедление обычно незначительно;
но если это важно, оптимальную производительность можно
восстановить, удалив и воссоздав тип enum или выполнив дамп и
восстановление базы данных.
Чтобы переименовать тип данных:
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;
Чтобы добавить новое значение к перечисляемому типу (enum) в определенную позицию сортировки:
ALTER TYPE colors ADD VALUE 'orange' AFTER 'red';
Чтобы переименовать значение перечисления (enum):
ALTER TYPE colors RENAME VALUE 'purple' TO 'mauve';
Чтобы создать функции бинарного ввода/вывода для существующего базового типа:
CREATE FUNCTION mytypesend(mytype) RETURNS bytea ...;
CREATE FUNCTION mytyperecv(internal, oid, integer) RETURNS mytype ...;
ALTER TYPE mytype SET (
SEND = mytypesend,
RECEIVE = mytyperecv
);
Варианты добавления и удаления атрибутов являются частью стандарта SQL; другие варианты являются расширениями Digital Q.DataBase.