ALTER TYPE — cambiar la definición de un tipo
ALTER TYPEnameOWNER TO {new_owner| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER TYPEnameRENAME TOnew_nameALTER TYPEnameSET SCHEMAnew_schemaALTER TYPEnameRENAME ATTRIBUTEattribute_nameTOnew_attribute_name[ CASCADE | RESTRICT ] ALTER TYPEnameaction[, ... ] ALTER TYPEnameADD VALUE [ IF NOT EXISTS ]new_enum_value[ { BEFORE | AFTER }neighbor_enum_value] ALTER TYPEnameRENAME VALUEexisting_enum_valueTOnew_enum_valueALTER TYPEnameSET (property=value[, ... ] ) dondeactiones uno de: ADD ATTRIBUTEattribute_namedata_type[ COLLATEcollation] [ CASCADE | RESTRICT ] DROP ATTRIBUTE [ IF EXISTS ]attribute_name[ CASCADE | RESTRICT ] ALTER ATTRIBUTEattribute_name[ SET DATA ] TYPEdata_type[ COLLATEcollation] [ CASCADE | RESTRICT ]
ALTER TYPE cambia la definición de un tipo existente.
Hay varias subformas:
OWNEREsta forma cambia el propietario del tipo.
RENAMEEsta forma cambia el nombre del tipo.
SET SCHEMAEsta forma mueve el tipo a otro esquema.
RENAME ATTRIBUTEEsta forma solo se puede usar con tipos compuestos. Cambia el nombre de un atributo individual del tipo.
ADD ATTRIBUTE
Esta forma agrega un nuevo atributo a un tipo compuesto, usando la misma sintaxis que
CREATE TYPE.
DROP ATTRIBUTE [ IF EXISTS ]
Esta forma elimina un atributo de un tipo compuesto.
Si se especifica IF EXISTS y el atributo
no existe, no se genera ningún error. En este caso se emite una advertencia
(notice) en su lugar.
ALTER ATTRIBUTE ... SET DATA TYPEEsta forma cambia el tipo de un atributo de un tipo compuesto.
ADD VALUE [ IF NOT EXISTS ] [ BEFORE | AFTER ]
Esta forma agrega un nuevo valor a un tipo enumerado (enum). El lugar del nuevo valor en
el orden del enum se puede especificar como BEFORE (antes)
o AFTER (después) de uno de los valores existentes. De lo contrario,
el nuevo elemento se agrega al final de la lista de valores.
Si se especifica IF NOT EXISTS, no es un error si
el tipo ya contiene el nuevo valor: se emite una advertencia (notice) pero no se realiza
ninguna otra acción. De lo contrario, se producirá un error si el nuevo valor ya
está presente.
RENAME VALUEEsta forma renombre un valor de un tipo enumerado (enum). El lugar del valor en el orden del enum no se ve afectado. Se producirá un error si el valor especificado no está presente o si el nuevo nombre ya está presente.
SET ( property = value [, ... ] )
Esta forma solo es aplicable a tipos base. Permite ajustar un
subconjunto de las propiedades del tipo base que se pueden establecer en CREATE
TYPE. Específicamente, se pueden cambiar estas propiedades:
RECEIVE se puede establecer con el nombre de una función de entrada
binaria, o NONE para eliminar la función de entrada binaria del tipo.
El uso de esta opción requiere privilegios de superusuario.
SEND se puede establecer con el nombre de una función de salida
binaria, o NONE para eliminar la función de salida binaria del tipo.
El uso de esta opción requiere privilegios de superusuario.
TYPMOD_IN se puede establecer con el nombre de una función de
entrada de modificador de tipo, o NONE para eliminar la
función de entrada de modificador de tipo. El uso de esta opción requiere
privilegios de superusuario.
TYPMOD_OUT se puede establecer con el nombre de una función de
salida de modificador de tipo, o NONE para eliminar la
función de salida de modificador de tipo. El uso de esta opción requiere
privilegios de superusuario.
ANALYZE se puede establecer con el nombre de una función de
recopilación de estadísticas específica del tipo, o NONE para eliminar
la función de recopilación de estadísticas del tipo. El uso de esta opción
requiere privilegios de superusuario.
SUBSCRIPT se puede establecer con el nombre de una función
controladora de subíndices específica del tipo, o NONE para eliminar
la función controladora de subíndices del tipo. El uso de esta opción
requiere privilegios de superusuario.
STORAGE
se puede establecer en plain,
extended, external,
o main (consulta Section 66.2 para
obtener más información sobre lo que esto significa). Sin embargo, cambiar
de plain a otra configuración requiere privilegios de superusuario
(porque requiere que todas las funciones C del tipo estén
preparadas para TOAST), y cambiar a plain desde otra
configuración no está permitido en absoluto (dado que el tipo ya puede tener
valores TOAST presentes en la base de datos). Ten en cuenta que cambiar esta
opción no cambia por sí mismo ningún dato almacenado, simplemente establece la
estrategia TOAST predeterminada que se usará para las columnas de tabla creadas en el
futuro. Consulta ALTER TABLE para cambiar la estrategia TOAST
de las columnas de tabla existentes.
Consulta CREATE TYPE para obtener más detalles sobre estas propiedades del tipo. Ten en cuenta que, cuando corresponda, un cambio en estas propiedades para un tipo base se propagará automáticamente a los dominios basados en ese tipo.
Las acciones ADD ATTRIBUTE, DROP
ATTRIBUTE, y ALTER ATTRIBUTE
se pueden combinar en una lista de múltiples modificaciones para aplicar en
paralelo. Por ejemplo, es posible agregar varios atributos
y/o cambiar el tipo de varios atributos en un solo comando.
Debes ser el propietario del tipo para usar ALTER TYPE.
Para cambiar el esquema de un tipo, también debes tener el privilegio
CREATE en el nuevo esquema.
Para cambiar el propietario, debes ser capaz de hacer SET ROLE al
nuevo rol propietario, y ese rol debe tener el privilegio CREATE
en el esquema del tipo.
(Estas restricciones garantizan que cambiar el propietario no permita hacer
nada que no pudieras hacer eliminando y volviendo a crear el tipo.
Sin embargo, un superusuario puede cambiar la propiedad de cualquier tipo de todos modos).
Para agregar un atributo o cambiar el tipo de un atributo, también debes
tener el privilegio USAGE en el tipo de datos del atributo.
nameEl nombre (opcionalmente calificado por esquema) de un tipo existente que se va a modificar.
new_nameEl nuevo nombre para el tipo.
new_ownerEl nombre de usuario del nuevo propietario del tipo.
new_schemaEl nuevo esquema para el tipo.
attribute_nameEl nombre del atributo que se va a agregar, modificar o eliminar.
new_attribute_nameEl nuevo nombre del atributo que se va a renombrar.
data_typeEl tipo de datos del atributo a agregar, o el nuevo tipo del atributo a modificar.
new_enum_valueEl nuevo valor a agregar a la lista de valores de un tipo enumerado (enum), o el nuevo nombre que se le dará a un valor existente. Como todos los literales enum, debe ir entre comillas.
neighbor_enum_valueEl valor enumerado existente antes o después del cual se debe agregar inmediatamente el nuevo valor en el orden del tipo enum. Como todos los literales enum, debe ir entre comillas.
existing_enum_valueEl valor enumerado existente que se debe renombrar. Como todos los literales enum, debe ir entre comillas.
propertyEl nombre de una propiedad del tipo base a modificar; consulta arriba los valores posibles.
CASCADEPropagar automáticamente la operación a las tablas tipadas del tipo que se está modificando y sus descendientes.
RESTRICTRechazar la operación si el tipo que se está modificando es el tipo de una tabla tipada. Este es el comportamiento predeterminado.
Si ALTER TYPE ... ADD VALUE (la forma que agrega un nuevo
valor a un tipo enum) se ejecuta dentro de un bloque de transacción, el nuevo
valor no se puede usar hasta después de que la transacción se haya confirmado.
Las comparaciones que involucran un valor enum agregado a veces serán más lentas que
las comparaciones que involucran solo a los miembros originales del tipo enum. Esto
normalmente solo ocurrirá si se usa BEFORE o AFTER
para establecer la posición de orden del nuevo valor en un lugar diferente al
final de la lista. Sin embargo, a veces sucederá incluso si el nuevo valor
se agrega al final (esto ocurre si el contador de OID dio la vuelta
desde la creación original del tipo enum). La ralentización suele ser
insignificante; pero si es importante, se puede recuperar el rendimiento óptimo
eliminando y volviendo a crear el tipo enum, o respaldando y
restaurando la base de datos.
Para renombrar un tipo de datos:
ALTER TYPE electronic_mail RENAME TO email;
Para cambiar el propietario del tipo email
a joe:
ALTER TYPE email OWNER TO joe;
Para cambiar el esquema del tipo email
a customers:
ALTER TYPE email SET SCHEMA customers;
Para agregar un nuevo atributo a un tipo compuesto:
ALTER TYPE compfoo ADD ATTRIBUTE f3 int;
Para agregar un nuevo valor a un tipo enum en una posición de orden particular:
ALTER TYPE colors ADD VALUE 'orange' AFTER 'red';
Para renombrar un valor enum:
ALTER TYPE colors RENAME VALUE 'purple' TO 'mauve';
Para crear funciones de E/S binarias para un tipo base existente:
CREATE FUNCTION mytypesend(mytype) RETURNS bytea ...;
CREATE FUNCTION mytyperecv(internal, oid, integer) RETURNS mytype ...;
ALTER TYPE mytype SET (
SEND = mytypesend,
RECEIVE = mytyperecv
);
Las variantes para agregar y eliminar atributos forman parte del estándar SQL; las otras variantes son extensiones de PostgreSQL.