Documentation PostgreSQL 14.22 » Référence » Commandes SQL » ALTER TYPE

Précédent | Niveau supérieur | Suivant
ALTER TRIGGER | Sommaire | ALTER USER

## ALTER TYPE

ALTER TYPE — Modifier la définition d'un type

## Synopsis

    ALTER TYPE nom OWNER TO { nouveau_propriétaire | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
    ALTER TYPE nom RENAME TO nouveau_nom
    ALTER TYPE nom SET SCHEMA nouveau_schéma
    ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ]
    ALTER TYPE name action [, ... ]
    ALTER TYPE nom ADD VALUE [ IF NOT EXISTS ] nouvelle_valeur_enumérée [ { BEFORE | AFTER } valeur_enumérée ]
    ALTER TYPE nom ADD VALUE [ IF NOT EXISTS ] nouvelle_valeur_enum [ { BEFORE | AFTER } valeur_enum_voisine ]
    ALTER TYPE nom RENAME VALUE valeur_enum_existante TO nouvelle_valeur_enum
    ALTER TYPE name SET ( property = value [, ... ] )

    où action fait partie de :

        ADD ATTRIBUTE nom_attribut type_de_donnée [ COLLATE collationnement ] [ CASCADE | RESTRICT ]
        DROP ATTRIBUTE [ IF EXISTS ] nom_attribut [ CASCADE | RESTRICT ]
        ALTER ATTRIBUTE nom_attribut [ SET DATA ] TYPE type_de_donnée [ COLLATE collationnement ] [ CASCADE | RESTRICT ]

## Description

`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 if la valeur spécifiée n'est pas présente ou si le nouveau nom est déjà présent.

`SET ( `property` = `value` [, ... ] )`

  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éfini dans `CREATE TYPE`. Ces propriétées 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 super-utilisateur.

  - `STORAGE` Peut être affecté à `plain`, `extended`, `external`, ou `main` (voir Section 70.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 d'utiliser 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é 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, il faut être un membre direct ou indirect du 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 super-utilisateur 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.

## Paramètres

`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 à être donné à 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.

`existing_enum_value`

  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.

## Notes

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.

## Exemples

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
    );

## Compatibilité

Les variantes permettant d'ajouter et supprimer un attribut font partie du standard SQL ; les autres variantes sont des extensions spécifiques à PostgreSQL.

## Voir aussi

CREATE TYPE, DROP TYPE