ALTER TABLE … ALTER COLUMN

Unter diesem Thema wird beschrieben, wie Sie die Spalteneigenschaften einer Tabelle mit der ALTER COLUMN-Klausel in einer ALTER TABLE-Anweisung ändern können.

Die folgende Tabelle beschreibt die unterstützten/nicht unterstützten Aktionen beim Ändern von Spalteneigenschaften:

Aktion

Unterstützt

Nicht unterstützt

Anmerkungen

Standardwerte

Löschen des Standards einer Spalte (d. h. DROP DEFAULT).

Nicht zulässig, wenn Spalte und Standardwert durch einen ALTER TABLE-Befehl definiert wurden. Weitere Details dazu finden Sie in den Nutzungshinweisen unten.

Ändern der Standardsequenz einer Spalte (d. h. SET DEFAULT seq_name.NEXTVAL).

Nur für Spalten verwenden, die bereits eine Sequenz haben.

Ändern des Standards einer Spalte, wenn der Standard keine Sequenz ist.

Hinzufügen eines Standards für eine Spalte

NULL-Zulässigkeit

Ändern der NULL-Zulässigkeit einer Spalte (z. B. SET NOT NULL oder DROP NOT NULL)

Datentypen

Ändern des Datentyps einer Spalte in einen synonymen Typ (z. B. STRING in VARCHAR).

Ändern des Datentyps einer Spalte in einen anderen Typ (z. B. STRING in NUMBER).

Erhöhen der Länge einer Text-/Zeichenfolgenspalte (z. B. VARCHAR(50) auf VARCHAR(100)).

Verringern der Länge einer Text-/Zeichenfolgenspalte (z. B. VARCHAR(50) auf VARCHAR(25)).

Erhöhen der Genauigkeit einer Zahlenspalte (z. B. NUMBER(10,2) auf NUMBER(20,2)).

Verringern der Genauigkeit einer Zahlenspalte (z. B. NUMBER(20,2) auf NUMBER(10,2)).

Nur zulässig, wenn die neue Genauigkeit ausreicht, um alle aktuell in der Spalte vorhandenen Werte zu speichern. Darüber hinaus kann sich eine Verringerung der Genauigkeit auf Time Travel auswirken (weitere Informationen dazu finden Sie unter Nutzungshinweise).

Ändern der Skalierung einer Zahlenspalte (z. B. NUMBER(10,2) in NUMBER(10,4)).

Kommentare

Festlegen oder Löschen des Kommentars für eine Spalte.

Maskierungsrichtlinie

Festlegen oder Aufheben einer Maskierungsrichtlinie für eine Spalte.

Objekt-Tagging

Tag einer Spalte zuordnen oder entziehen

Eine Spalte kann bis zu 20 Tags unterstützen, und die maximale Anzahl von Zeichen für einen Tag-Zeichenfolgenwert ist 256.

Siehe auch:

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

Syntax

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 <col1_name> SET MASKING POLICY <policy_name> [ USING ( <col1_name> , cond_col_1 , ... ) ]
                                                                                          [ FORCE ]

ALTER TABLE <name> { ALTER | MODIFY } COLUMN <col1_name> UNSET MASKING POLICY

ALTER TABLE <name> { ALTER | MODIFY }
                                       [ COLUMN ] <col1_name> SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ]
                                     , [ COLUMN ] <col2_name> SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ]
                                     ...

ALTER TABLE <name> { ALTER | MODIFY }
                                       COLUMN <col1_name> UNSET TAG <tag_name> [ , <tag_name> ... ]
                                     , COLUMN <col2_name> UNSET TAG <tag_name> [ , <tag_name> ... ]
                                     ...
Copy

Nutzungshinweise

  • Eine einzelne ALTER TABLE-Anweisung kann verwendet werden, um mehrere Spalten in einer Tabelle zu ändern. Jede Änderung wird als Klausel angegeben, die aus der zu ändernden Spalte und der Spalteneigenschaft besteht, getrennt durch Kommas:

    • Verwenden Sie entweder das Schlüsselwort ALTER oder MODIFY, um die Liste der Klauseln (d. h. der zu ändernden Spalten/Eigenschaften) zu starten.

    • Klammern können für die Gruppierung der Klauseln verwendet werden, sind aber nicht erforderlich.

    • Das Schlüsselwort COLUMN kann in jeder Klausel angegeben werden, ist aber nicht erforderlich.

    • Die Klauseln können in beliebiger Reihenfolge angegeben werden.

  • Wenn für eine Spalte NOT NULL festgelegt wird und die Spalte NULL-Werte enthält, wird ein Fehler zurückgegeben und es werden keine Änderungen an der Spalte vorgenommen.

  • Spalten, die semistrukturierte Daten verwenden (ARRAY, OBJECT und VARIANT), können nicht auf NOT NULL gesetzt werden, außer wenn die Tabelle leer ist. Das Setzen dieser Spalten auf NOT NULL, wenn die Tabelle Zeilen enthält, wird nicht unterstützt und führt zu einem Fehler.

  • Um die Standardsequenz für eine Spalte zu ändern, muss die Spalte bereits eine Standardsequenz haben. Sie können mit dem Befehl ALTER TABLE ... SET DEFAULT < Sequenzname> nur dann eine Sequenz zu einer Spalte hinzufügen, wenn die Spalte bereits eine Sequenz hat.

  • Wenn Sie eine Tabelle ändern, um eine Spalte mit einem DEFAULT-Wert hinzuzufügen, können Sie den Standardwert für diese Spalte nicht löschen. In der folgenden Anweisungsfolge führt beispielsweise die letzte Anweisung ALTER TABLE ... ALTER COLUMN zu einem Fehler:

    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

    Diese Einschränkung verhindert Inkonsistenzen zwischen Werten in Zeilen, die vor dem Hinzufügen der Spalte eingefügt wurden, und Werten in Zeilen, die nach dem Hinzufügen der Spalte eingefügt wurden. Wenn der Standardwert wegfallen würde, würde die Spalte Folgendes enthalten:

    • NULL-Wert für Zeilen, die vor dem Hinzufügen der Spalte eingefügt wurden.

    • Standardwert für Zeilen, die nach dem Hinzufügen der Spalte eingefügt wurden.

    Das Löschen des Standardspaltenwerts aus einem beliebigen Klon der Tabelle ist ebenfalls nicht zulässig.

  • Wenn Sie TYPE für eine Spalte festlegen, muss der angegebene Typ (d. h. type) entweder NUMBER oder ein Text-Datentyp (VARCHAR, STRING, TEXT usw.) sein.

    • Für den Datentyp NUMBER kann TYPE verwendet werden, um Folgendes zu erreichen:

      • Erhöhung der Genauigkeit der angegebenen Zahlenspalte

      • Verringerung der Genauigkeit der angegebenen Zahlenspalte, wenn die neue Genauigkeit ausreicht, um alle aktuell in der Spalte enthaltenen Datenwerte zu speichern

    • Bei Textdatentypen kann TYPE nur verwendet werden, um die Länge der Spalte zu erhöhen.

  • Wenn die Genauigkeit einer Spalte unter die maximale Genauigkeit aller in Time Travel gespeicherten Spaltendaten verringert wird, können Sie die Tabelle erst wiederherstellen, wenn Sie die Genauigkeit wieder erhöht haben.

  • Bei Maskierungsrichtlinien:

    • Die USING-Klausel und das Schlüsselwort FORCE sind beide optional, d. h. beide sind nicht erforderlich, um eine Maskierungsrichtlinie für eine Spalte festzulegen. Die USING-Klausel und das Schlüsselwort FORCE können einzeln oder zusammen verwendet werden. Weitere Details dazu finden Sie unter:

    • Eine einzelne Maskierungsrichtlinie, die bedingte Spalten verwendet, kann auf mehrere Tabellen angewendet werden, sofern die Spaltenstruktur der Tabelle mit den in der Richtlinie angegebenen Spalten übereinstimmt.

    • Wenn Sie eine oder mehrere Tabellenspalten mit Maskierungsrichtlinie oder die Tabelle selbst mit Zeilenzugriffsrichtlinie ändern, können Sie mit der Funktion POLICY_CONTEXT eine Abfrage auf den mit einer Maskierungsrichtlinie geschützten Spalten bzw. auf der mit einer Zeilenzugriffsrichtlinie geschützten Tabelle simulieren.

  • Hinweis zu Metadaten (z. B. das Feld COMMENT):

    Achtung

    Kunden müssen sicherstellen, dass bei der Nutzung des Snowflake-Dienstes keine personenbezogenen Daten (außer für ein Objekt „Benutzer“), sensible Daten, exportkontrollierte Daten oder andere regulierte Daten als Metadaten eingegeben werden. Weitere Informationen dazu finden Sie unter Metadatenfelder in Snowflake.

Beispiele

Beispiel-Setup:

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

Nehmen Sie folgende Änderungen an t1 vor:

  • Ändern Sie die NOT NULL-Spalte c1 in NULL.

  • Löschen Sie die Standardeinstellung für Spalte c2, und ändern Sie die Standardsequenz für Spalte c3.

  • Vergrößern Sie die Länge der Spalte c4, und entfernen Sie die Standardeinstellung für die Spalte.

  • Fügen Sie einen Kommentar für Spalte c5 hinzu.

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

Um die Vielseitigkeit/Flexibilität des Befehls zu veranschaulichen, wird das vorherige Beispiel mit folgenden Änderungen verwendet:

  • Alle Aktionen werden mit einer einzigen ALTER COLUMN-Klausel ausgeführt.

  • Die Reihenfolge der Spalten in der Klausel ist verändert.

  • SET DATA TYPE ist auf ein einfaches TYPE verkürzt.

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

Dieses Beispiel liefert die gleichen Ergebnisse.

Anwenden einer Maskierungsrichtlinie für Sicherheit auf Spaltenebene auf eine Tabellenspalte:

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

Deaktivieren der auf eine Tabellenspalte angewendeten Maskierungsrichtlinie für Sicherheit auf Spaltenebene:

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