ALTER DOMAIN — изменение определения домена
ALTER DOMAINname{ SET DEFAULTexpression| DROP DEFAULT } ALTER DOMAINname{ SET | DROP } NOT NULL ALTER DOMAINnameADDdomain_constraint[ NOT VALID ] ALTER DOMAINnameDROP CONSTRAINT [ IF EXISTS ]constraint_name[ RESTRICT | CASCADE ] ALTER DOMAINnameRENAME CONSTRAINTconstraint_nameTOnew_constraint_nameALTER DOMAINnameVALIDATE CONSTRAINTconstraint_nameALTER DOMAINnameOWNER TO {new_owner| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER DOMAINnameRENAME TOnew_nameALTER DOMAINnameSET SCHEMAnew_schemaгдеdomain_constraintимеет вид: [ CONSTRAINTconstraint_name] { NOT NULL | CHECK (expression) }
Команда ALTER DOMAIN изменяет определение существующего домена.
Существует несколько подформ:
SET/DROP DEFAULT
Эти формы устанавливают или удаляют значение по умолчанию для домена. Обратите внимание,
что значения по умолчанию применяются только к последующим командам INSERT;
они не влияют на строки, уже находящиеся в таблице, использующей данный домен.
SET/DROP NOT NULL
Эти формы изменяют, помечен ли домен как разрешающий значения NULL
или отвергающий их. Вы можете выполнить SET NOT NULL
только когда столбцы, использующие этот домен, не содержат значений NULL.
ADD domain_constraint [ NOT VALID ]
Эта форма добавляет новое ограничение к домену.
Когда к домену добавляется новое ограничение, все столбцы, использующие этот домен,
будут проверены на соответствие вновь добавленному ограничению. Эти
проверки можно подавить, добавив новое ограничение с помощью опции
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 в новой схеме.
Чтобы изменить владельца, вы должны иметь возможность выполнить SET ROLE для новой
роли-владельца, и эта роль должна иметь право CREATE в схеме домена.
(Эти ограничения гарантируют, что изменение владельца не позволит сделать ничего такого,
что нельзя было бы сделать удалением и повторным созданием домена.
Однако суперпользователь может изменить владельца любого домена в любом случае.)
nameИмя (возможно, с указанием схемы) существующего домена, который нужно изменить.
domain_constraintНовое ограничение для домена.
constraint_nameИмя существующего ограничения, которое нужно удалить или переименовать.
NOT VALIDНе проверять существующие хранимые данные на соответствие ограничению.
CASCADEАвтоматически удалять объекты, зависящие от ограничения, и, в свою очередь, все объекты, зависящие от этих объектов (см. Раздел 2.2.15).
RESTRICTОтказываться от удаления ограничения, если есть какие-либо зависимые объекты. Это поведение по умолчанию.
new_nameНовое имя для домена.
new_constraint_nameНовое имя для ограничения.
new_ownerИмя пользователя нового владельца домена.
new_schemaНовая схема для домена.
Хотя команда 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;
Чтобы добавить ограничение CHECK к домену:
ALTER DOMAIN zipcode ADD CONSTRAINT zipchk CHECK (char_length(VALUE) = 5);
Чтобы удалить ограничение CHECK у домена:
ALTER DOMAIN zipcode DROP CONSTRAINT zipchk;
Чтобы переименовать ограничение CHECK у домена:
ALTER DOMAIN zipcode RENAME CONSTRAINT zipchk TO zip_check;
Чтобы переместить домен в другую схему:
ALTER DOMAIN zipcode SET SCHEMA customers;
Команда ALTER DOMAIN соответствует стандарту SQL,
за исключением вариантов OWNER, RENAME, SET SCHEMA и
VALIDATE CONSTRAINT, которые являются расширениями
Digital Q.DataBase. Предложение NOT VALID
варианта ADD CONSTRAINT также является расширением
Digital Q.DataBase.