ALTER DOMAIN#
Примечание
Эта страница переведена при помощи нейросети GigaChat.
ALTER DOMAIN – изменение определения домена.
Синтаксис#
ALTER DOMAIN name
{ SET DEFAULT expression | DROP DEFAULT }
ALTER DOMAIN name
{ SET | DROP } NOT NULL
ALTER DOMAIN name
ADD domain_constraint [ NOT VALID ]
ALTER DOMAIN name
ALTER DOMAIN name
VALIDATE CONSTRAINT constraint_name
ALTER DOMAIN name
OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER DOMAIN name
RENAME TO new_name
ALTER DOMAIN name
SET SCHEMA new_schema
Описание#
ALTER DOMAIN используется для изменения определения уже существующего домена. Команда поддерживает несколько форм:
SET/DROP DEFAULTПозволяют задать или удалить значение по умолчанию для домена.
Учтите, что значение по умолчанию применяется только к последующим командам
INSERTи не влияет на уже существующие строки в таблицах, где используется домен.SET/DROP NOT NULLОпределяют, допускает ли домен значения
NULL. УстановкаSET NOT NULLвозможна только в случае, если все существующие значения в столбцах, использующих данный домен, являются ненулевыми.ADD domain_constraint [ NOT VALID ]Добавляет новое ограничение к домену. При этом все существующие столбцы, использующие данный домен, будут проверены на соответствие новому ограничению. Чтобы избежать немедленной проверки уже существующих данных, можно указать
NOT VALID. В этом случае ограничение будет применяться только к новым или изменяемым данным, а для проверки старых данных его позже можно сделать действительным с помощью командыALTER DOMAIN ... VALIDATE CONSTRAINT. ПараметрNOT VALIDразрешен только для ограничений типаCHECK.DROP CONSTRAINT [ IF EXISTS ]Удаляет указанное ограничение из домена. Если используется
IF EXISTSи ограничение отсутствует, ошибка не возникает — вместо этого будет выдано уведомление.RENAME CONSTRAINTПереименовывает существующее ограничение, заданное на домен.
VALIDATE CONSTRAINTПроверяет ранее добавленное с
NOT VALIDограничение, удостоверяясь, что все существующие значения в столбцах, использующих домен, соответствуют этому ограничению.OWNERИзменяет владельца домена на указанного пользователя.
RENAMEПереименовывает домен.
SET SCHEMAИзменяет схему домена. При этом все связанные с ним ограничения автоматически переходят в новую схему.
Чтобы выполнить эту команду, необходимо быть владельцем домена. Чтобы изменить схему, необходимо также иметь привилегию CREATE в целевой схеме.
Изменить владельца можно только при условии, что имеется право SET ROLE для новой роли-владельца, а сама роль обладает привилегией CREATE в схеме. Эти требования обеспечивают, что смена владельца не предоставляет дополнительных возможностей, которых нельзя было бы достичь удалением и повторным созданием домена. Исключение составляют суперпользователи, которые могут изменять владельца любого домена без ограничений.
Параметры#
nameУказывает имя существующего домена, при необходимости дополненное схемой, который должен быть изменен.
domain_constraintЗадает новое ограничение домена.
constraint_nameУказывает имя существующего ограничения, который подлежит удалению или переименованию.
NOT VALIDНе выполняет проверку уже существующих данных на соответствие новому ограничению.
CASCADEАвтоматически удаляет все объекты, зависящие от указанного ограничения, а также объекты, зависящие от них.
RESTRICTЗапрещает удаление ограничения, если от него зависят другие объекты. Является поведением по умолчанию.
new_nameНовое имя домена.
new_constraint_nameНовое имя ограничения.
new_ownerИмя нового владельца домена.
new_schemaНовая схема домена.
Примечания#
При использовании ALTER DOMAIN ADD CONSTRAINT пытается проверить соответствие новых ограничений уже сохраненным данным. Однако эта проверка может быть ненадежной: команда не учитывает строки, которые были недавно вставлены или изменены и еще не зафиксированы. Если возможна ситуация, при которой параллельные транзакции добавляют недопустимые данные, рекомендуется следующий порядок действий:
Добавить ограничение с параметром
NOT VALID.Зафиксировать эту команду.
Дождаться завершения всех активных транзакций, начатых до этой фиксации.
Выполнить
ALTER DOMAIN VALIDATE CONSTRAINT.
Это обеспечит надежную проверку всех данных, поскольку после фиксации ограничения все новые транзакции гарантированно будут соблюдать его относительно новых значений типа домена…
Следует учитывать, что в текущей версии PostgreSQL команды ALTER DOMAIN ADD CONSTRAINT, ALTER DOMAIN VALIDATE CONSTRAINT и ALTER DOMAIN SET NOT NULL завершатся с ошибкой, если домен (или домен, основанный на нем) используется в столбце с типом-контейнером (составной, диапазонный тип или массив) в любой таблице базы данных. В будущем планируется усовершенствовать эти команды, чтобы они могли обрабатывать такие вложенные случаи корректно.
Примеры#
Добавление ограничения к области:
ALTER DOMAIN zipcode SET NOT NULL;
Удаление ограничения из области:
ALTER DOMAIN zipcode RENAME CONSTRAINT zipchk TO zip_check;
Перемещение домена в другую схему:
ALTER DOMAIN zipcode SET SCHEMA customers;
Совместимость#
ALTER DOMAIN соответствует стандарту SQL, за исключением форм OWNER, RENAME, SET SCHEMA и VALIDATE CONSTRAINT, которые являются расширениями PostgreSQL. Параметр NOT VALID формы ADD CONSTRAINT также является расширением PostgreSQL.