#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-строчный скрипт, перепечатывающий столбцы, удаляющий функции, представления и домен, перепечатывающий столбцы, а затем добавляющий обратно функции и представления. Очень признателен.