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

Précédent | Niveau supérieur | Suivant
ALTER DEFAULT PRIVILEGES | Sommaire | ALTER EVENT TRIGGER

## ALTER DOMAIN

ALTER DOMAIN — Modifier la définition d'un domaine

## Synopsis

    ALTER DOMAIN nom
        { SET DEFAULT expression | DROP DEFAULT }
    ALTER DOMAIN nom
        { SET | DROP } NOT NULL
    ALTER DOMAIN nom
        ADD contrainte_de_domaine [ NOT VALID ]
    ALTER DOMAIN nom
        DROP CONSTRAINT [ IF EXISTS ] nom_de_contrainte [ RESTRICT | CASCADE ]
    ALTER DOMAIN nom
         RENAME CONSTRAINT nom_de_contrainte TO nouveau_nom_de_contrainte
    ALTER DOMAIN nom
        VALIDATE CONSTRAINT nom_de_contrainte
    ALTER DOMAIN nom
        OWNER TO { nouveau_propriétaire | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
    ALTER DOMAIN nom
        RENAME TO nouveau_nom
    ALTER DOMAIN nom
        SET SCHEMA nouveau_schema

    où contrainte_domaine
    vaut :

    [ CONSTRAINT nom_contrainte ]
    { NOT NULL | CHECK (expression) }

## Description

`ALTER DOMAIN` modifie la définition d'un domaine. Il existe plusieurs sous-formes :

`SET`/`DROP DEFAULT`

  Ces formes positionnent ou suppriment la valeur par défaut d'un domaine. Les valeurs par défaut ne s'appliquent qu'aux commandes `INSERT` ultérieures ; les colonnes d'une table qui utilise déjà le domaine ne sont pas affectées.

`SET`/`DROP NOT NULL`

  Ces formes agissent sur l'acceptation ou le rejet des valeurs NULL par un domaine. `SET NOT NULL` ne peut être utilisé que si les colonnes qui utilisent le domaine contiennent des valeurs non nulles.

`ADD `contrainte de domaine` [ NOT VALID ]`

  Cette forme ajoute une nouvelle contrainte à un domaine. Lorsqu'une nouvelle contrainte est ajoutée à un domaine, toutes les colonnes utilisant ce domaine seront vérifiées avec cette nouvelle contrainte. Cette vérification initiale peut être annulée en ajoutant l'option `NOT VALID` lors de l'ajout de la nouvelle contrainte ; la contrainte pourra à nouveau être activée en utilisant la commande `ALTER DOMAIN ... VALIDATE CONSTRAINT`. Les lignes nouvellement ajoutées ou modifiées sont toujours vérifiées pour l'ensemble des contraintes, y compris celles marquées `NOT VALID`. À noter enfin que l'option `NOT VALID` n'est acceptée que pour les contraintes de type `CHECK`.

`DROP CONSTRAINT [ IF EXISTS ]`

  Cette forme supprime les contraintes sur un domaine. Si l'option `IF EXISTS` est spécifiée et que la contrainte n'existe pas, aucune erreur n'est retournée. Dans ce cas, un simple message d'avertissement est retourné.

`RENAME CONSTRAINT`

  Cette forme modifie le nom de la contrainte d'un domaine.

`VALIDATE CONSTRAINT`

  Cette forme valide une contrainte ajoutée précédemment avec l'option `NOT VALID`, c'est-à-dire qu'elle vérifie que les valeurs de chaque colonne utilisant ce type domaine satisfont la contrainte spécifiée.

`OWNER`

  Cette forme change le propriétaire du domaine.

`RENAME`

  Cette forme modifie le nom du domaine.

`SET SCHEMA`

  Cette forme change le schéma du domaine. Toute contrainte associée au domaine est déplacée dans le nouveau schéma.

Seul le propriétaire de la fonction d'agrégat peut utiliser `ALTER AGGREGATE`.

Seul le propriétaire du domaine peut utiliser `ALTER DOMAIN`. Pour modifier le schéma d'un domaine, le droit `CREATE` sur le nouveau schéma est également 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 domaine. Ces restrictions assurent que la modification du propriétaire n'agissent pas au-delà de ce qui est réalisable en supprimant et en re-créant le domaine. Toutefois, un super-utilisateur peut modifier le propriétaire de n'importe quel domaine.

## Paramètres

`nom`

  Le nom du domaine à modifier.

`contrainte_de_domaine`

  Nouvelle contrainte de domaine pour le domaine.

`nom_de_contrainte`

  Le nom d'une contrainte à supprimer ou renommer.

`NOT VALID`

  Ne vérifie pas la validité de la contrainte appliquée aux valeurs des colonnes existantes.

`CASCADE`

  Les objets qui dépendent de la contrainte sont automatiquement supprimés, ainsi que tous les objets dépendants de ces objets (voir Section 5.14).

`RESTRICT`

  La contrainte n'est pas supprimée si des objets en dépendent. C'est le comportement par défaut.

`nouveau_nom`

  Le nouveau nom du domaine.

`nouveau_nom_de_contrainte`

  Le nouveau nom de la contrainte.

`nouveau_propriétaire`

  Le nom de l'utilisateur nouveau propriétaire du domaine.

`nouveau_schema`

  Le nouveau schéma du domaine.

## Notes

Bien que `ALTER DOMAIN ADD CONSTRAINT` essaie de vérifier que les données existantes satisfont la nouvelle contrainte, le test n'est pas absolu, parce que la commande ne peut pas « voir » les lignes de la table qui sont nouvellement insérées ou mises à jour et dont la transaction n'est pas encore validée. S'il y a un risque que des opérations concurrentes puissent insérer des données ne satisfaisant pas la contrainte, la manière de procéder consiste à ajouter la contrainte avec l'option `NOT VALID`, valider (commit) cette commande, attendre jusqu'à ce que toutes les transactions démarrées avant cette validation aient fini, et alors exécuter `ALTER DOMAIN VALIDATE CONSTRAINT` pour chercher les données qui violeraient la contrainte. Cette méthode est fiable parce qu'une fois que la création de contrainte a fait l'objet d'un commit, il est garanti que les nouvelles transactions sont soumises à cette contrainte pour toute nouvelle valeur du type domaine.

Actuellement, `ALTER DOMAIN ADD CONSTRAINT`, `ALTER DOMAIN VALIDATE CONSTRAINT` et `ALTER DOMAIN SET NOT NULL` échoueront si le domaine nommé ou tout domaine dérivé est utilisé pour une colonne de type conteneur (type composé, tableau ou intervalle) dans toute table de la base de données. Il se pourrait que cela soit amélioré pour vérifier la nouvelle contrainte sur ce type de colonnes intégrées.

## Exemples

Ajouter une contrainte `NOT NULL` à un domaine :

    ALTER DOMAIN codezip SET NOT NULL;

Supprimer une contrainte `NOT NULL` d'un domaine :

    ALTER DOMAIN codezip DROP NOT NULL;

Ajouter une contrainte de contrôle à un domaine :

    ALTER DOMAIN codezip ADD CONSTRAINT verif_zip CHECK (char_length(VALUE) = 5);

Supprimer une contrainte de contrôle d'un domaine :

    ALTER DOMAIN codezip DROP CONSTRAINT verif_zip;

Pour renommer une contrainte de contrôle d'un domaine :

    ALTER DOMAIN codezip RENAME CONSTRAINT verif_zip TO zip_verif;

Déplacer le domaine dans un schéma différent :

    ALTER DOMAIN zipcode SET SCHEMA customers;

## Compatibilité

`ALTER DOMAIN` se conforme au standard SQL, à l'exception des variantes `OWNER`, `RENAME`, `SET SCHEMA` et `VALIDATE CONSTRAINT`, qui sont des extensions PostgreSQL. L'option `NOT VALID` de la variante `ADD CONSTRAINT` est elle-aussi une extension de PostgreSQL.

## Voir aussi

CREATE DOMAIN, DROP DOMAIN