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.