Изменение КОНТРОЛЬНОГО ограничения в ДОМЕНЕ

#postgresql #constraints #ddl #check #sql-domain

Вопрос:

Есть ли способ изменить детали существующего DOMAIN ограничения в Postgres 13.4?

Я пробовал и проверял документы и подозреваю, что ответ таков: «Нет. DROP ограничение (или домен и ограничение?) и перестройте его».

Это неудобно, так как у меня есть поля и функции, которые уже используют ограничение, так что есть небольшой каскад элементов, которые я должен был бы также DROP и CREATE . Я могу это сделать, но это немного сложно.

В качестве примера у меня есть простой список доменов, подобный этому:

 DROP DOMAIN IF EXISTS domains.user_name;

CREATE DOMAIN domains.user_name AS
    citext
    NOT NULL
    CONSTRAINT user_name_legal_values
        CHECK(
            VALUE IN (
                'postgres',
                'dbadmin',
                'user_bender',
                'user_cleanup',
                'user_domo_pull'
            )
     );

COMMENT ON DOMAIN domains.user_name IS
    'Valid user_name role names.';
 

Я хотел бы изменить VALUE IN список CHECK , вставив еще одно имя: 'user_analytics' .

Возможно ли это без удаления и перестройки домена, ограничения или и того, и другого?

Если это не так, я могу выполнить каскадное удаление и перестройку и подумать о будущем, что DOMAIN это неподходящий инструмент для такого рода вещей. Вместо этого я всегда могу использовать крошечную таблицу поиска. Мне просто нравится DOMAIN , как это проясняет намерения параметров и столбцов.

Ответ №1:

Воспользуйся ALTER DOMAIN . Отбросьте старое ограничение и добавьте новое. Вы не можете сделать и то, и другое в одной команде (в отличие ALTER TABLE от ):

 ALTER DOMAIN user_name DROP CONSTRAINT user_name_legal_values;
ALTER DOMAIN user_name  ADD CONSTRAINT user_name_legal_values CHECK(
            VALUE IN (
                'postgres',
                'dbadmin',
                'user_analytics',
                'user_bender',
                'user_cleanup',
                'user_domo_pull'
            ));
 

Руководство:

ADD domain_constraint [ NOT VALID ]

Эта форма добавляет новое ограничение в домен, используя тот же синтаксис, CREATE DOMAIN что и . Когда в домен добавляется новое ограничение, все столбцы, использующие этот домен, будут проверены на соответствие вновь добавленному ограничению. […]

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

Комментарии:

1. Это здорово! Не понял этого из инструкций. И намного лучше, чем мой 300-строчный скрипт, перепечатывающий столбцы, удаляющий функции, представления и домен, перепечатывающий столбцы, а затем добавляющий обратно функции и представления. Очень признателен.