ALTER DOMAIN

ALTER DOMAIN — изменить определение домена


Синтаксис

ALTER DOMAIN имя
    { SET DEFAULT выражение | DROP DEFAULT }
ALTER DOMAIN имя
    { SET | DROP } NOT NULL
ALTER DOMAIN имя
    ADD ограничение_домена [ NOT VALID ]
ALTER DOMAIN имя
    DROP CONSTRAINT [ IF EXISTS ] имя_ограничения [ RESTRICT | CASCADE ]
ALTER DOMAIN имя
     RENAME CONSTRAINT имя_ограничения TO имя_нового_ограничения
ALTER DOMAIN имя
    VALIDATE CONSTRAINT имя_ограничения
ALTER DOMAIN имя
    OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }
ALTER DOMAIN имя
    RENAME TO новое_имя
ALTER DOMAIN имя
    SET SCHEMA новая_схема

Описание

Команда ALTER DOMAIN изменяет определение существующего домена. Она имеет несколько форм:

SET/DROP DEFAULT

Эти формы устанавливают или удаляют значение по умолчанию для домена. Обратите внимание, что значения по умолчанию применяются только к последующим командам INSERT; они не влияют на строки c данным доменом, уже находящиеся в таблице.

SET/DROP NOT NULL

Эти формы определяют, будут ли разрешены значения NULL. Установить SET NOT NULL можно, только если столбцы, использующие домен, не содержат значений NULL.

ADD ограничение_домена [ 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 в схеме домена. (Эти ограничения направлены на то, чтобы при смене владельца не происходило ничего, что нельзя было бы сделать путем удаления и повторного создания домена. Однако суперпользователь все равно может сменить владельца любого домена.)


Параметры

имя

Имя существующего домена, подлежащего изменению (может быть дополнено схемой).

ограничение_домена

Новое ограничение домена.

имя_ограничения

Имя существующего ограничения, которое будет удалено или переименовано.

NOT VALID

Не проверять существующие сохраненные данные на соответствие ограничению.

CASCADE

Автоматически удалять объекты, зависящие от ограничения, и в свою очередь все объекты, зависящие от этих объектов (см. раздел Отслеживание зависимостей).

RESTRICT

Запретить удаление ограничения, если есть какие-либо зависимые от него объекты. Это поведение по умолчанию.

новое_имя

Новое имя домена.

имя_нового_ограничения

Новое имя ограничения.

новый_владелец

Имя пользователя, который станет новым владельцем домена.

новая_схема

Новая схема домена.


Примечания

Несмотря на то, что команда 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;

Добавление проверочного ограничения к домену:

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, которые являются расширениями QHB. Указание NOT VALID формы ADD CONSTRAINT также является расширением QHB.


См. также

CREATE DOMAIN, DROP DOMAIN