ALTER TYPE — Modifier la définition d'un type
ALTER TYPEnom
OWNER TO {nouveau_propriétaire
| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER TYPEnom
RENAME TOnouveau_nom
ALTER TYPEnom
SET SCHEMAnouveau_schéma
ALTER TYPEname
RENAME ATTRIBUTEattribute_name
TOnew_attribute_name
[ CASCADE | RESTRICT ] ALTER TYPEname
action
[, ... ] ALTER TYPEnom
ADD VALUE [ IF NOT EXISTS ]nouvelle_valeur_enumérée
[ { BEFORE | AFTER }valeur_enumérée
] ALTER TYPEnom
ADD VALUE [ IF NOT EXISTS ]nouvelle_valeur_enum
[ { BEFORE | AFTER }valeur_enum_voisine
] ALTER TYPEnom
RENAME VALUEvaleur_enum_existante
TOnouvelle_valeur_enum
ALTER TYPEname
SET (property
=value
[, ... ] ) oùaction
fait partie de : ADD ATTRIBUTEnom_attribut
type_de_donnée
[ COLLATEcollationnement
] [ CASCADE | RESTRICT ] DROP ATTRIBUTE [ IF EXISTS ]nom_attribut
[ CASCADE | RESTRICT ] ALTER ATTRIBUTEnom_attribut
[ SET DATA ] TYPEtype_de_donnée
[ COLLATEcollationnement
] [ CASCADE | RESTRICT ]
ALTER TYPE
modifie la définition d'un type existant. Les
variantes suivantes existent :
OWNER
Cette forme change le propriétaire du type.
RENAME
Cette forme change le nom du type.
SET SCHEMA
Cette forme déplace le type dans un autre schéma.
RENAME ATTRIBUTE
Cette forme n'est seulement utilisable que sur des types composites. Elle change le nom d'un attribut individuel du type.
ADD ATTRIBUTE
Cette forme ajoute un nouvel attribut à un type composite, en utilisant
la même syntaxe que CREATE
TYPE
.
DROP ATTRIBUTE [ IF EXISTS ]
Cette forme supprime un attribut d'un type composite. Si IF
EXISTS
est précisé et que l'attribut n'existe pas, aucune
erreur n'est renvoyée. Dans ce cas, un avertissement est affichée à la
place.
ALTER ATTRIBUTE ... SET DATA TYPE
Cette forme change le type d'un attribut d'un type composite.
ADD VALUE [ IF NOT EXISTS ] [ BEFORE | AFTER ]
Cette forme ajoute une valeur à une énumération. L'emplacement de la
nouvelle valeur dans l'énumération peut être spécifié comme étant avant
(BEFORE
) ou après (AFTER
) une des
valeurs existantes. Dans le cas contraire, le nouvel élément est ajouté à
la fin de la liste de valeurs.
Si IF NOT EXISTS
est précisé, l'existence d'une valeur
de même nom ne constitue par une erreur : un message d'avertissement
sera envoyé mais aucune action ne sera prise. Dans le cas contraire, une
erreur est renvoyée si la nouvelle valeur est déjà présente.
RENAME VALUE
Renomme une valeur d'un type énumération. La place de la valeur dans l'ordre de l'énumération n'est pas affecté. Une erreur sera renvoyée si la valeur spécifiée n'est pas présente ou si le nouveau nom est déjà présent.
SET ( propriété
= valeur
[, ... ] )
Cette forme est applicable seulement sur les types de base. Elle permet
l'ajustement d'un sous-ensemble des propriétés de type de base qui
peuvent être définies dans CREATE TYPE
. Ces
propriétés peuvent être modifiées spécifiquement :
RECEIVE
peut se voir affecter le nom d'une fonction
d'entrée binaire ou NONE
pour supprimer la fonction
d'entrée binaire du type. L'utilisation de cette option requiert
l'attribut SUPERUSER
.
SEND
peut se voir affecter le nom d'une fonction de
sortie binaire ou NONE
pour supprimer la fonction
de sortie binaire du type. L'utilisation de cette option requiert
l'attribut SUPERUSER
.
TYPMOD_IN
peut se voir affecter le nom d'une
fonction de modificateur d'entrée du type ou NONE
pour supprimer la fonction de modificateur d'entrée du type.
L'utilisation de cette option requiert l'attribut
SUPERUSER
.
TYPMOD_OUT
peut se voir affecter le nom d'une
fonction de modificateur de sortie du type ou NONE
pour supprimer la fonction de modificateur de sortie du type.
L'utilisation de cette option requiert l'attribut
SUPERUSER
.
ANALYZE
peut se voir affecter le nom d'une fonction
de récupération des statistique pour ce type ou
NONE
pour supprimer la fonction de récupération des
statistiques L'utilisation de cette option requiert l'attribut
SUPERUSER
.
SUBSCRIPT
peut être initialisé avec le nom d'une
fonction de gestion d'indices spécifique au type, ou
NONE
pour supprimer la fonction de gestion
d'indices du type. Utiliser cette fonction nécessite l'attribut de
SUPERUSER
.
STORAGE
Peut être affecté à plain
,
extended
, external
ou
main
(voir Section 65.2 pour
plus d'informations sur ce que cela signifie). Cependant, passer de
plain
à un autre paramètre nécessite l'attribut
SUPERUSER
(car cela demande que toutes les
fonctions de type C soient prêtes pour TOAST), et passer à
plain
depuis un autre paramétrage n'est pas
autorisé du tout (car des valeurs de type TOAST peuvent déjà être
contenues dans la base de données). Notez que modifier cette option ne
modifie pas d'elle même les données stockées, elle permet juste de
modifier la stratégie TOAST par défaut pour les colonnes de tables
créées dans le futur. Voir ALTER TABLE pour
changer la stratégie TOAST pour des colonnes d'une table existante.
Voir CREATE TYPE pour plus de détail sur ces propriétés de type. Notez qu'une modification sur les propriétés de type de base sera propagée automatiquement sur les domaines basés sur ce type si cela s'avère nécessaire.
Les actions ADD ATTRIBUTE
, DROP
ATTRIBUTE
, et ALTER ATTRIBUTE
peuvent être
combinées dans une liste de modifications multiples à appliquer en parallèle.
Il est ainsi possible d'ajouter et/ou modifier plusieurs attributs par une
seule et même commande.
Seul le propriétaire du type peut utiliser ALTER TYPE
.
Pour modifier le schéma d'un type, le droit CREATE
sur le
nouveau schéma est requis. Pour modifier le propriétaire, vous devez être
capable d'utiliser SET ROLE
vers le nouveau rôle
propriétaire et ce rôle doit avoir
le droit CREATE
sur le schéma du type (ces restrictions
assurent que la modification du propriétaire ne va pas au-delà de ce qui est
possible par la suppression et la recréation du type ; toutefois, un
superutilisateur peut modifier le propriétaire de n'importe quel type).
Pour ajouter un attribut ou pour modifier le type d'un attribut, vous devez
aussi avoir le droit USAGE
sur le type de données de la
colonne.
nom
Le nom du type à modifier (éventuellement qualifié du nom du schéma).
nouveau_nom
Le nouveau nom du type.
nouveau_propriétaire
Le nom du nouveau propriétaire du type.
nouveau_schema
Le nouveau schéma du type.
nom_attribut
Le nom de l'attribut à ajouter, modifier ou supprimer.
nouveau_nom_attribute
Le nouveau nom de l'attribut à renommer.
type_de_donnée
Le type de donnée pour l'attribut à ajouter ou modifier.
nouvelle_valeur_enumérée
La nouvelle valeur à ajouter à la liste d'un type, ou le nouveau nom à donner à une valeur existante. Comme pour tous les littéraux, la valeur devra être délimitée par des guillemets simples.
valeur_enumérée_voisine
La valeur existante d'une énumération par rapport à laquelle la nouvelle valeur doit être ajoutée (permet de déterminer l'ordre de tri du type énuméré). Comme pour tous les littéraux, la valeur existante devra être délimitée par des guillemets simples.
valeur_enum_existante
La valeur existante de l'énumération qui doit être renommée. Comme toutes les littéraux d'énumération, elle doit être délimitée par des guillemets simples.
property
Le nom de la propriété du type à modifier ; voir ci-dessus pour les valeurs possibles.
CASCADE
Propage automatiquement les opération sur les tables typées du type étant modifié, ainsi que leur descendants.
RESTRICT
Refuse les opérations si le type étant modifié est le type d'une table typée. C'est le comportement par défaut.
Si ALTER TYPE ... ADD VALUE
(la forme qui ajoute une
nouvelle valeur à un type énuméré) est exécuté à l'intérieur d'un bloc
transactionnel, la nouvelle valeur ne peut être utilisée qu'à partir d'après
la validation de la transaction.
Les comparaisons faisant intervenir une valeur ajoutée à postériori peuvent
quelquefois s'avérer plus lentes que celles portant uniquement sur les
valeurs originales d'un type énuméré. Ce ralentissement ne devrait toutefois
intervenir que si la position de la nouvelle valeur a été spécifiée en
utilisant les options BEFORE
ou AFTER
,
au lieu d'insérer la nouvelle valeur en fin de liste. Ce ralentissement peut
également se produire, bien que la nouvelle valeur ait été insérée en fin
d'énumération, en cas de « bouclage » du compteur des OID depuis
la création du type énuméré. Le ralentissement est généralement peu
significatif ; mais s'il s'avère important, il est toujours possible de
retrouver les performances optimales par une suppression / recréation du type
énuméré, ou encore par sauvegarde et rechargement de la base.
Pour renommer un type de données :
ALTER TYPE courrier_electronique RENAME TO courriel;
Donner la propriété du type courriel
à
joe
:
ALTER TYPE courriel OWNER TO joe;
Changer le schéma du type courriel
en
clients
:
ALTER TYPE courriel SET SCHEMA clients;
Ajouter un nouvel attribut à un type composite :
ALTER TYPE compfoo ADD ATTRIBUTE f3 int;
Ajouter une nouvelle valeur à une énumération, en spécifiant sa position de tri :
ALTER TYPE colors ADD VALUE 'orange' AFTER 'red';
Pour renommer une valeur d'une énumération :
ALTER TYPE colors RENAME VALUE 'purple' TO 'mauve';
Créer une fonction I/O binaire pour un type existant :
CREATE FUNCTION mytypesend(mytype) RETURNS bytea ...; CREATE FUNCTION mytyperecv(internal, oid, integer) RETURNS mytype ...; ALTER TYPE mytype SET ( SEND = mytypesend, RECEIVE = mytyperecv );
Les variantes permettant d'ajouter et supprimer un attribut font partie du standard SQL ; les autres variantes sont des extensions spécifiques à PostgreSQL.