ALTER DOMAIN — cambiar la definición de un dominio
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_schemadondedomain_constraintes: [ CONSTRAINTconstraint_name] { NOT NULL | CHECK (expression) }
ALTER DOMAIN cambia la definición de un dominio existente.
Existen varias variantes:
SET/DROP DEFAULT
Estas formas establecen o eliminan el valor predeterminado para un dominio. Ten
cuenta que los valores predeterminados solo se aplican a los comandos INSERT
posteriores; no afectan a las filas que ya existen en una tabla que utilice el dominio.
SET/DROP NOT NULL
Estas formas cambian si un dominio está marcado para permitir valores NULL
o para rechazarlos. Solo puedes ejecutar SET NOT NULL
cuando las columnas que usan el dominio no contienen valores nulos.
ADD domain_constraint [ NOT VALID ]
Esta forma agrega una nueva restricción a un dominio.
Cuando se agrega una nueva restricción a un dominio, todas las columnas que usan ese
dominio se verificarán con respecto a la restricción recién agregada. Estas
comprobaciones se pueden omitir agregando la nueva restricción con la
opción NOT VALID; la restricción se puede validar más adelante
usando ALTER DOMAIN ... VALIDATE CONSTRAINT.
Las filas recién insertadas o actualizadas siempre se comprueban con respecto a todas las
restricciones, incluso aquellas marcadas como NOT VALID.
NOT VALID solo se acepta para restricciones CHECK.
DROP CONSTRAINT [ IF EXISTS ]
Esta forma elimina restricciones de un dominio.
Si se especifica IF EXISTS y la restricción
no existe, no se lanza ningún error, sino que se emite un aviso (notice) en su lugar.
RENAME CONSTRAINTEsta forma cambia el nombre de una restricción en un dominio.
VALIDATE CONSTRAINT
Esta forma valida una restricción agregada previamente como
NOT VALID, es decir, verifica que todos los valores en
las columnas de tabla del tipo de dominio cumplan con la restricción especificada.
OWNEREsta forma cambia el propietario del dominio al usuario especificado.
RENAMEEsta forma cambia el nombre del dominio.
SET SCHEMAEsta forma cambia el esquema del dominio. Cualquier restricción asociada con el dominio también se mueve al nuevo esquema.
Debes ser el propietario del dominio para usar ALTER DOMAIN.
Para cambiar el esquema de un dominio, también debes tener el
privilegio CREATE en el nuevo esquema.
Para alterar el propietario, debes poder hacer SET ROLE al
nuevo rol propietario, y ese rol debe tener el privilegio CREATE
en el esquema del dominio. (Estas restricciones garantizan que al cambiar el propietario
no puedas hacer nada que no pudieras hacer eliminando y recreando el dominio.
Sin embargo, un superusuario puede cambiar la propiedad de cualquier dominio de todos modos).
nameEl nombre (posiblemente calificado por esquema) de un dominio existente a modificar.
domain_constraintNueva restricción de dominio para el dominio.
constraint_nameNombre de una restricción existente a eliminar o renombrar.
NOT VALIDNo verificar los datos almacenados existentes para la validez de la restricción.
CASCADEEliminar automáticamente los objetos que dependen de la restricción y, a su vez, todos los objetos que dependen de esos objetos (ver Section 5.15).
RESTRICTRechazar la eliminación de la restricción si existen objetos dependientes. Este es el comportamiento predeterminado.
new_nameEl nuevo nombre para el dominio.
new_constraint_nameEl nuevo nombre para la restricción.
new_ownerEl nombre de usuario del nuevo propietario del dominio.
new_schemaEl nuevo esquema para el dominio.
Aunque ALTER DOMAIN ADD CONSTRAINT intenta verificar
que los datos almacenados existentes cumplan con la nueva restricción, esta comprobación no es
infalible, porque el comando no puede “ver” las filas de la tabla que
se acaban de insertar o actualizar y que aún no han sido confirmadas (committed). Si existe el riesgo
de que las operaciones concurrentes puedan insertar datos incorrectos, la forma de proceder es
agregar la restricción utilizando la opción NOT VALID, confirmar
ese comando, esperar hasta que todas las transacciones iniciadas antes de esa confirmación hayan
terminado y luego ejecutar ALTER DOMAIN VALIDATE
CONSTRAINT para buscar datos que violen la restricción. Este
método es confiable porque, una vez confirmada la restricción, se garantiza que todas las transacciones
nuevas la aplicarán a los nuevos valores del tipo de dominio.
Actualmente, ALTER DOMAIN ADD CONSTRAINT, ALTER
DOMAIN VALIDATE CONSTRAINT y ALTER DOMAIN SET NOT
NULL fallarán si el dominio especificado o cualquier dominio derivado se utiliza
dentro de una columna de tipo contenedor (una columna compuesta, de matriz o de rango) en
cualquier tabla de la base de datos. Deberían mejorarse en el futuro para poder
verificar la nueva restricción para tales valores anidados.
Para agregar una restricción NOT NULL a un dominio:
ALTER DOMAIN zipcode SET NOT NULL;
Para eliminar una restricción NOT NULL de un dominio:
ALTER DOMAIN zipcode DROP NOT NULL;
Para agregar una restricción check a un dominio:
ALTER DOMAIN zipcode ADD CONSTRAINT zipchk CHECK (char_length(VALUE) = 5);
Para eliminar una restricción check de un dominio:
ALTER DOMAIN zipcode DROP CONSTRAINT zipchk;
Para renombrar una restricción check en un dominio:
ALTER DOMAIN zipcode RENAME CONSTRAINT zipchk TO zip_check;
Para mover el dominio a un esquema diferente:
ALTER DOMAIN zipcode SET SCHEMA customers;
ALTER DOMAIN cumple con el estándar SQL,
excepto por las variantes OWNER, RENAME, SET SCHEMA, y
VALIDATE CONSTRAINT, que son
extensiones de PostgreSQL. La cláusula NOT VALID
de la variante ADD CONSTRAINT también es una
extensión de PostgreSQL.