ALTER TABLE … ALTER COLUMN

Ce chapitre décrit comment modifier les propriétés de une ou plusieurs colonnes d’une table en utilisant la clause ALTER COLUMN dans une instruction ALTER TABLE.

Le tableau suivant décrit les actions prises en charge/non prises en charge lors de la modification des propriétés de colonne :

Action

Pris en charge

Aucune prise en charge

Remarques

Valeurs par défaut

Détruire la valeur par défaut d’une colonne (c.-à-d. DROP DEFAULT).

Non autorisé si la colonne et le défaut ont été définis par une commande ALTER TABLE. Pour plus de détails, voir les notes sur l’utilisation ci-dessous.

Modifier la séquence par défaut d’une colonne (à savoir SET DEFAULT seq_name.NEXTVAL).

Utiliser uniquement pour les colonnes qui ont déjà une séquence.

Modifier la valeur par défaut d’une colonne, sauf si la valeur par défaut est une séquence.

Ajouter une valeur par défaut pour une colonne.

Nullabilité

Modifier la possibilité de valeur NULL d’une colonne (c.-à-d. SET NOT NULL ou DROP NOT NULL).

Types de données

Modifier le type de données d’une colonne en un type synonyme (par exemple, STRING en VARCHAR).

Modifier le type de données d’une colonne en un type différent (par exemple, STRING en NUMBER).

Augmenter la longueur d’une colonne texte/chaîne (par exemple, de VARCHAR(50) à VARCHAR(100)).

Raccourcir la longueur d’une colonne texte/chaîne (par exemple, de VARCHAR(50) à VARCHAR(25)).

Augmenter la précision d’une number column (par exemple, NUMBER(10,2) à NUMBER(20,2)).

Diminuer la précision d’une number column (par exemple, NUMBER(20,2) à NUMBER(10,2)).

Autorisé uniquement si la nouvelle précision est suffisante pour contenir toutes les valeurs actuellement comprises dans la colonne. De plus, une diminution de la précision peut avoir un impact sur Time Travel (voir les notes sur l’utilisation pour plus de détails).

Modifier l’échelle d’une number column (par exemple, NUMBER(10,2) en NUMBER(10,4)).

Commentaires

Définir ou annuler le commentaire d’une colonne.

Politique de masquage

Définir ou annuler une politique de masquage sur une colonne.

Politique de projection

Définir ou annuler une politique de projection sur une colonne.

Balisage d’objets

Définir ou annuler une balise sur une colonne.

Une colonne peut prendre en charge jusqu’à 20 balises et le nombre maximal de caractères pour une valeur de chaîne de balises est 256.

Voir aussi :

ALTER TABLE , CREATE TABLE , DROP TABLE , SHOW TABLES , DESCRIBE TABLE

Syntaxe

ALTER TABLE <name> { ALTER | MODIFY } [ ( ]
                                              [ COLUMN ] <col1_name> DROP DEFAULT
                                            , [ COLUMN ] <col1_name> SET DEFAULT <seq_name>.NEXTVAL
                                            , [ COLUMN ] <col1_name> { [ SET ] NOT NULL | DROP NOT NULL }
                                            , [ COLUMN ] <col1_name> [ [ SET DATA ] TYPE ] <type>
                                            , [ COLUMN ] <col1_name> COMMENT '<string>'
                                            , [ COLUMN ] <col1_name> UNSET COMMENT
                                          [ , [ COLUMN ] <col2_name> ... ]
                                          [ , ... ]
                                      [ ) ]

ALTER TABLE <name> { ALTER | MODIFY } [ COLUMN ] dataGovnPolicyTagAction
Copy

Notes sur l’utilisation

  • Une seule instruction ALTER TABLE peut être utilisée pour modifier plusieurs colonnes d’une table. Chaque modification est spécifiée comme une clause composée de la colonne et de la propriété de la colonne à modifier, séparées par des virgules :

    • Utiliser le mot clé ALTER ou MODIFY pour lancer la liste des clauses (c’est-à-dire, les colonnes/propriétés à modifier) dans l’instruction.

    • Des parenthèses peuvent être utilisées pour regrouper les clauses, mais ne sont pas obligatoires.

    • Le mot clé COLUMN peut être spécifié dans chaque clause, mais n’est pas obligatoire.

    • Les clauses peuvent être spécifiées dans n’importe quel ordre.

  • Lorsque vous définissez une colonne sur NOT NULL, si la colonne contient des valeurs NULL, une erreur est renvoyée, et aucun changement n’est appliqué à la colonne.

  • Les colonnes qui utilisent des types de données semi-structurées (ARRAY, OBJECT et VARIANT) ne peuvent pas être définies sur NOT NULL, sauf si la table est vide. La définition de ces colonnes sur NOT NULL lorsque la table contient des lignes n’est pas prise en charge et entraîne une erreur.

  • Pour modifier la séquence par défaut d’une colonne, celle-ci doit déjà avoir une séquence par défaut. Vous ne pouvez pas utiliser la commande ALTER TABLE ... SET DEFAULT <nom_seq> pour ajouter une séquence à une colonne qui n’en contient pas déjà.

  • Si vous modifiez une table pour ajouter une colonne avec une valeur DEFAULT alors vous ne pouvez pas supprimer la valeur par défaut de cette colonne. Par exemple, dans la séquence d’instructions suivante, la dernière instruction ALTER TABLE ... ALTER COLUMN provoque une erreur :

    CREATE TABLE t(x INT);
    INSERT INTO t VALUES (1), (2), (3);
    ALTER TABLE t ADD COLUMN y INT DEFAULT 100;
    INSERT INTO t(x) VALUES (4), (5), (6);
    
    ALTER TABLE t ALTER COLUMN y DROP DEFAULT;
    
    Copy

    Cette restriction permet d’éviter toute incohérence entre les valeurs des lignes insérées avant l’ajout de la colonne et celles des lignes insérées après l’ajout de la colonne. Si la valeur par défaut était détruite, la colonne contiendrait alors :

    • Une valeur NULL pour les lignes insérées avant l’ajout de la colonne.

    • La valeur par défaut des lignes insérée après l’ajout de la colonne.

    Il est également interdit de supprimer la valeur de colonne par défaut de n’importe quel clone de la table.

  • Lorsque vous réglez TYPE pour une colonne, le type spécifié (c’est-à-dire type) doit être NUMBER ou un type de données texte (VARCHAR, STRING, TEXT, etc.).

    • Pour le type de données NUMBER, TYPE peut être utilisé pour :

      • Augmenter la précision de la colonne de nombre spécifiée.

      • Diminuer la précision de la colonne de nombre spécifiée si la nouvelle précision est suffisante pour contenir toutes les valeurs de données actuellement comprises dans la colonne.

    • Pour les types de données texte, TYPE ne peut être utilisé que pour augmenter la longueur de la colonne.

  • Si la précision d’une colonne est inférieure à la précision maximale de toutes les données de colonne conservées dans Time Travel, vous ne pouvez pas restaurer la table sans d’abord augmenter la précision.

  • Pour les politiques de masquage :

    • La clause USING et le mot-clé FORCE sont tous deux facultatifs ; ils ne sont pas nécessaires pour définir une politique de masquage sur une colonne. La clause USING et le mot-clé FORCE peuvent être utilisés séparément ou ensemble. Pour plus de détails, voir :

    • Une seule politique de masquage qui utilise des colonnes conditionnelles peut être appliquée à plusieurs tables, à condition que la structure des colonnes de la table corresponde aux colonnes spécifiées dans la politique.

    • Lorsque vous modifiez une ou plusieurs colonnes de la table avec une politique de masquage ou la table elle-même avec une politique d’accès aux lignes, utilisez la fonction POLICY_CONTEXT pour simuler une requête sur la ou les colonnes protégées par une politique de masquage et la table protégée par une politique d’accès aux lignes.

  • Concernant les métadonnées (par exemple, le champ COMMENT) :

    Attention

    Les clients doivent s’assurer qu’aucune donnée personnelle (autre que pour un objet utilisateur), donnée sensible, donnée à exportation contrôlée ou autre donnée réglementée n’est saisie comme métadonnée lors de l’utilisation du service Snowflake. Pour plus d’informations, voir Champs de métadonnées dans Snowflake.

Exemples

Exemple de configuration :

CREATE OR REPLACE TABLE t1 (
   c1 NUMBER NOT NULL,
   c2 NUMBER DEFAULT 3,
   c3 NUMBER DEFAULT seq1.nextval,
   c4 VARCHAR(20) DEFAULT 'abcde',
   c5 STRING);

DESC TABLE t1;

+------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------+
| name | type              | kind   | null? | default                 | primary key | unique key | check | expression | comment |
|------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------|
| C1   | NUMBER(38,0)      | COLUMN | N     | NULL                    | N           | N          | NULL  | NULL       | NULL    |
| C2   | NUMBER(38,0)      | COLUMN | Y     | 3                       | N           | N          | NULL  | NULL       | NULL    |
| C3   | NUMBER(38,0)      | COLUMN | Y     | DB1.PUBLIC.SEQ1.NEXTVAL | N           | N          | NULL  | NULL       | NULL    |
| C4   | VARCHAR(20)       | COLUMN | Y     | 'abcde'                 | N           | N          | NULL  | NULL       | NULL    |
| C5   | VARCHAR(16777216) | COLUMN | Y     | NULL                    | N           | N          | NULL  | NULL       | NULL    |
+------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------+
Copy

Apporter les modifications suivantes à t1 :

  • Modifiez la colonne NOT NULL c1 en NULL.

  • Détruisez la valeur par défaut de la colonne c2 et modifiez la séquence par défaut de la colonne c3.

  • Augmentez la longueur de la colonne c4 et détruisez la valeur par défaut de la colonne.

  • Ajoutez un commentaire pour la colonne c5.

ALTER TABLE t1 ALTER COLUMN c1 DROP NOT NULL;

ALTER TABLE t1 MODIFY c2 DROP DEFAULT, c3 SET DEFAULT seq5.nextval ;

ALTER TABLE t1 ALTER c4 SET DATA TYPE VARCHAR(50), COLUMN c4 DROP DEFAULT;

ALTER TABLE t1 ALTER c5 COMMENT '50 character column';

DESC TABLE t1;

+------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------------------+
| name | type              | kind   | null? | default                 | primary key | unique key | check | expression | comment             |
|------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------------------|
| C1   | NUMBER(38,0)      | COLUMN | Y     | NULL                    | N           | N          | NULL  | NULL       | NULL                |
| C2   | NUMBER(38,0)      | COLUMN | Y     | NULL                    | N           | N          | NULL  | NULL       | NULL                |
| C3   | NUMBER(38,0)      | COLUMN | Y     | DB1.PUBLIC.SEQ5.NEXTVAL | N           | N          | NULL  | NULL       | NULL                |
| C4   | VARCHAR(50)       | COLUMN | Y     | NULL                    | N           | N          | NULL  | NULL       | NULL                |
| C5   | VARCHAR(16777216) | COLUMN | Y     | NULL                    | N           | N          | NULL  | NULL       | 50 character column |
+------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------------------+
Copy

Identique à l’exemple précédent, mais avec les modifications suivantes pour illustrer la polyvalence/flexibilité de la commande :

  • Toutes les actions exécutées dans une seule clause ALTER COLUMN.

  • L’ordre des colonnes de la clause est différent.

  • SET DATA TYPE raccourci à simplement TYPE.

ALTER TABLE t1 ALTER (
   c1 DROP NOT NULL,
   c5 COMMENT '50 character column',
   c4 TYPE VARCHAR(50),
   c2 DROP DEFAULT,
   COLUMN c4 DROP DEFAULT,
   COLUMN c3 SET DEFAULT seq5.nextval
  );
Copy

Cet exemple produit les mêmes résultats.

Appliquez une politique de masquage de sécurité au niveau des colonnes à une colonne de table :

-- single column

ALTER TABLE empl_info MODIFY COLUMN empl_id SET MASKING POLICY mask_empl_id;

-- multiple columns

ALTER TABLE empl_info MODIFY
    COLUMN empl_id SET MASKING POLICY mask_empl_id
  , COLUMN empl_dob SET MASKING POLICY mask_empl_dob
;
Copy

Annulez une politique de masquage de sécurité au niveau des colonnes depuis une colonne de table :

-- single column

ALTER TABLE empl_info modify column empl_id unset masking policy;

-- multiple columns

ALTER TABLE empl_info MODIFY
    COLUMN empl_id UNSET MASKING POLICY
  , COLUMN empl_dob UNSET MASKING POLICY
;
Copy