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> DROP CONSTRAINT [ IF EXISTS ] <constraint_name> [RESTRICT | CASCADE]
ALTER DOMAIN <name> RENAME CONSTRAINT <constraint_name> TO <new_constraint_name>
ALTER DOMAIN <name> VALIDATE CONSTRAINT <constraint_name>
ALTER DOMAIN <name> OWNER TO <new_owner>
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 ]— эта форма добавляет новое ограничение к домену, используя тот же синтаксис, что и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 в схеме домена.
Эти ограничения гарантируют, что смена владельца не сделает ничего такого, что вы не могли бы сделать, удалив и создав домен заново.
Однако суперпользователь может изменить владельца любого домена в любом случае.
Параметры
| Параметр | Описание |
|---|---|
name |
Имя существующего домена, который нужно изменить (опционально указанное со схемой) |
domain_constraint |
Новое ограничение для данного домена |
constraint_name |
Имя существующего ограничения, которое нужно удалить или переименовать |
NOT VALID |
Не проверять существующие данные на соответствие ограничению |
CASCADE |
Автоматически удалять объекты, зависящие от ограничения |
RESTRICT |
Отказываться удалять ограничение, если существуют какие-либо зависящие объекты. Это поведение по умолчанию |
new_name |
Новое имя для домена |
new_constraint_name |
Новое имя для ограничения |
new_owner |
Имя пользователя нового владельца домена |
new_schema |
Новая схема для домена |
Примечания
Хотя ALTER DOMAIN ADD CONSTRAINT пытается проверить, что существующие сохраненные данные удовлетворяют новому ограничению, эта проверка не является надежной, потому что команда не может "видеть" строки таблицы, которые были только что вставлены или обновлены и еще не зафиксированы (COMMIT).
Если существует риск, что параллельные операции могут вставить некорректные данные, следует действовать следующим образом: добавьте ограничение с использованием опции 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, которые являются расширениями PostgreSQL.
Выражение NOT VALID варианта ADD CONSTRAINT также является расширением PostgreSQL.