ALTER TABLE

Ändert die Eigenschaften, Spalten oder Beschränkung für eine vorhandene Tabelle.

Siehe auch:

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

Syntax

ALTER TABLE [ IF EXISTS ] <name> RENAME TO <new_table_name>

ALTER TABLE [ IF EXISTS ] <name> SWAP WITH <target_table_name>

ALTER TABLE [ IF EXISTS ] <name> { clusteringAction | tableColumnAction | constraintAction  }

ALTER TABLE [ IF EXISTS ] <name> dataMetricFunctionAction

ALTER TABLE [ IF EXISTS ] <name> dataGovnPolicyTagAction

ALTER TABLE [ IF EXISTS ] <name> extTableColumnAction

ALTER TABLE [ IF EXISTS ] <name> searchOptimizationAction

ALTER TABLE [ IF EXISTS ] <name> SET
  [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
  [ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
  [ CHANGE_TRACKING = { TRUE | FALSE  } ]
  [ DEFAULT_DDL_COLLATION = '<collation_specification>' ]
  [ ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE } ]
  [ COMMENT = '<string_literal>' ]

ALTER TABLE [ IF EXISTS ] <name> UNSET {
                                       DATA_RETENTION_TIME_IN_DAYS         |
                                       MAX_DATA_EXTENSION_TIME_IN_DAYS     |
                                       CHANGE_TRACKING                     |
                                       DEFAULT_DDL_COLLATION               |
                                       ENABLE_SCHEMA_EVOLUTION             |
                                       COMMENT                             |
                                       }
                                       [ , ... ]
Copy

Wobei:

clusteringAction ::=
  {
     CLUSTER BY ( <expr> [ , <expr> , ... ] )
     /* RECLUSTER is deprecated */
   | RECLUSTER [ MAX_SIZE = <budget_in_bytes> ] [ WHERE <condition> ]
     /* { SUSPEND | RESUME } RECLUSTER is valid action */
   | { SUSPEND | RESUME } RECLUSTER
   | DROP CLUSTERING KEY
  }
Copy
tableColumnAction ::=
  {
     ADD [ COLUMN ] [ IF NOT EXISTS ] <col_name> <col_type>
        [
           {
              DEFAULT <default_value>
              | { AUTOINCREMENT | IDENTITY }
                 /* AUTOINCREMENT (or IDENTITY) is supported only for           */
                 /* columns with numeric data types (NUMBER, INT, FLOAT, etc.). */
                 /* Also, if the table is not empty (i.e. if the table contains */
                 /* any rows), only DEFAULT can be altered.                     */
                 [
                    {
                       ( <start_num> , <step_num> )
                       | START <num> INCREMENT <num>
                    }
                 ]
                 [  { ORDER | NOORDER } ]
           }
        ]
        [ inlineConstraint ]
        [ COLLATE '<collation_specification>' ]

   | RENAME COLUMN <col_name> TO <new_col_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> ... ]
                        [ , ... ]
                    [ ) ]

   | DROP [ COLUMN ] [ IF EXISTS ] <col1_name> [, <col2_name> ... ]
  }

  inlineConstraint ::=
    [ NOT NULL ]
    [ CONSTRAINT <constraint_name> ]
    { UNIQUE | PRIMARY KEY | { [ FOREIGN KEY ] REFERENCES <ref_table_name> [ ( <ref_col_name> ) ] } }
    [ <constraint_properties> ]
Copy

Detaillierte Syntax und Beispiele für die Änderung von Spalten finden Sie unter ALTER TABLE … ALTER COLUMN. .

Detaillierte Syntax und Beispiele für das Erstellen/Ändern von Inline-Einschränkungen finden Sie unter CREATE | ALTER TABLE … CONSTRAINT.

dataMetricFunctionAction ::=

    SET DATA_METRIC_SCHEDULE = {
        '<num> MINUTE'
      | 'USING CRON <expr> <time_zone>'
      | 'TRIGGER_ON_CHANGES'
    }

  | UNSET DATA_METRIC_SCHEDULE

  | { ADD | DROP } DATA METRIC FUNCTION <metric_name>
      ON ( <col_name> [ , ... ] )
      [ , <metric_name_2> ON ( <col_name> [ , ... ] ) ]
  | MODIFY DATA METRIC FUNCTION <metric_name>
      ON ( <col_name> [ , ... ] ) { SUSPEND | RESUME }
      [ , <metric_name_2> ON ( <col_name> [ , ... ] ) { SUSPEND | RESUME } ]
Copy
dataGovnPolicyTagAction ::=
  {
      SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ]
    | UNSET TAG <tag_name> [ , <tag_name> ... ]
  }
  |
  {
      ADD ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , ... ] )
    | DROP ROW ACCESS POLICY <policy_name>
    | DROP ROW ACCESS POLICY <policy_name> ,
        ADD ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , ... ] )
    | DROP ALL ROW ACCESS POLICIES
  }
  |
  {
      SET AGGREGATION POLICY <policy_name>
        [ ENTITY KEY ( <col_name> [, ... ] ) ]
        [ FORCE ]
    | UNSET AGGREGATION POLICY
  }
  |
  ADD [ COLUMN ] [ IF NOT EXISTS ] <col_name> <col_type>
    [ [ WITH ] MASKING POLICY <policy_name>
          [ USING ( <col1_name> , <cond_col_1> , ... ) ] ]
    [ [ WITH ] PROJECTION POLICY <policy_name> ]
    [ [ WITH ] TAG ( <tag_name> = '<tag_value>'
          [ , <tag_name> = '<tag_value>' , ... ] ) ]
  |
  {
    { ALTER | MODIFY } [ COLUMN ] <col1_name>
        SET MASKING POLICY <policy_name>
          [ USING ( <col1_name> , <cond_col_1> , ... ) ] [ FORCE ]
      | UNSET MASKING POLICY
  }
  |
  {
    { ALTER | MODIFY } [ COLUMN ] <col1_name>
        SET PROJECTION POLICY <policy_name>
          [ FORCE ]
      | UNSET PROJECTION POLICY
  }
  |
  { 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 | MODIFY } [ COLUMN ] <col1_name> UNSET TAG <tag_name> [ , <tag_name> ... ]
                   , [ COLUMN ] <col2_name> UNSET TAG <tag_name> [ , <tag_name> ... ]
Copy
extTableColumnAction ::=
  {
     ADD [ COLUMN ] [ IF NOT EXISTS ] <col_name> <col_type> AS ( <expr> )

   | RENAME COLUMN <col_name> TO <new_col_name>

   | DROP [ COLUMN ] [ IF EXISTS ] <col1_name> [, <col2_name> ... ]
  }
Copy
constraintAction ::=
  {
     ADD outoflineConstraint
   | RENAME CONSTRAINT <constraint_name> TO <new_constraint_name>
   | { ALTER | MODIFY } { CONSTRAINT <constraint_name> | PRIMARY KEY | UNIQUE | FOREIGN KEY } ( <col_name> [ , ... ] )
                         [ [ NOT ] ENFORCED ] [ VALIDATE | NOVALIDATE ] [ RELY | NORELY ]
   | DROP { CONSTRAINT <constraint_name> | PRIMARY KEY | UNIQUE | FOREIGN KEY } ( <col_name> [ , ... ] )
                         [ CASCADE | RESTRICT ]
  }

  outoflineConstraint ::=
    [ CONSTRAINT <constraint_name> ]
    {
       UNIQUE [ ( <col_name> [ , <col_name> , ... ] ) ]
     | PRIMARY KEY [ ( <col_name> [ , <col_name> , ... ] ) ]
     | [ FOREIGN KEY ] [ ( <col_name> [ , <col_name> , ... ] ) ]
                          REFERENCES <ref_table_name> [ ( <ref_col_name> [ , <ref_col_name> , ... ] ) ]
    }
    [ <constraint_properties> ]
Copy

Detaillierte Syntax und Beispiele für das Erstellen/Ändern von Out-of-Line-Einschränkungen finden Sie unter CREATE | ALTER TABLE … CONSTRAINT.

searchOptimizationAction ::=
  {
     ADD SEARCH OPTIMIZATION [
       ON <search_method_with_target> [ , <search_method_with_target> ... ]
     ]

   | DROP SEARCH OPTIMIZATION [
       ON { <search_method_with_target> | <column_name> | <expression_id> }
          [ , ... ]
     ]
  }
Copy

Weitere Details dazu finden Sie unter Suchoptimierungsaktionen (searchOptimizationAction).

Parameter

name

Bezeichner für die zu ändernde Tabelle. Wenn der Bezeichner Leerzeichen oder Sonderzeichen enthält, muss die gesamte Zeichenfolge in doppelte Anführungszeichen gesetzt werden. Bei Bezeichnern, die in doppelten Anführungszeichen eingeschlossen sind, wird ebenfalls zwischen Groß- und Kleinschreibung unterschieden.

RENAME TO new_table_name

Benennt die angegebene Tabelle mit einem neuen Bezeichner um, der derzeit von keiner anderen Tabelle im Schema verwendet wird.

Weitere Informationen zu Tabellenbezeichnern finden Sie unter Anforderungen an Bezeichner.

Sie können das Objekt in eine andere Datenbank und/oder in ein anderes Schema verschieben und dabei optional das Objekt umbenennen. Geben Sie dazu einen qualifizierten new_name-Wert an, der den neuen Datenbank- und/oder Schemanamen im Format db_name.schema_name.object_name bzw. schema_name.object_name enthält.

Bemerkung

  • Die Zieldatenbank und/oder das Zielschema müssen bereits vorhanden sein. Außerdem darf in der Zieldatenbank nicht bereits ein gleichnamiges Schema vorhanden sein, da die Anweisung sonst einen Fehler zurückgibt.

  • Das Verschieben eines Objekts in ein verwaltetes Zugriffsschema ist nicht zulässig, es sei denn, der Objekteigentümer (d. h. die Rolle mit der Berechtigung OWNERSHIP für das Objekt) ist auch Eigentümer des Zielschemas.

Wenn ein Objekt (Tabelle, Spalte usw.) umbenannt wird, müssen andere Objekte, die darauf verweisen, mit dem neuen Namen aktualisiert werden.

SWAP WITH target_table_name

Swap benennt zwei Tabellen in einer einzigen Transaktion um.

Beachten Sie, dass das Austauschen einer permanenten oder transienten Tabelle durch eine temporäre Tabelle, die nur für die Dauer der Benutzersitzung, in der sie erstellt wurde, bestehen bleibt, nicht zulässig ist. Diese Einschränkung verhindert einen Namenskonflikt, der auftreten könnte, wenn eine permanente oder transiente Tabelle durch eine temporäre Tabelle ausgetauscht wird, die denselben Namen hat, wie eine bereits vorhandene permanente oder transiente Tabelle. Um eine permanente oder transiente Tabelle durch eine temporäre Tabelle zu ersetzen, verwenden Sie drei ALTER TABLE ... RENAME TO-Anweisungen: Umbenennen der Tabelle a in c, b in a und dann c in b.

Bemerkung

Um eine Tabelle umzubenennen oder zwei Tabellen auszutauschen, muss die Rolle, mit der die Operation durchgeführt wird, OWNERSHIP-Berechtigungen für die Tabellen haben. Darüber hinaus erfordert das Umbenennen einer Tabelle die Berechtigung CREATE TABLE im Schema für die Tabelle.

SET ...

Gibt eine oder mehrere Eigenschaften/Parameter an, die für die Tabelle festgelegt werden sollen (getrennt durch Leerzeichen, Kommas oder Neue-Zeile-Zeichen):

DATA_RETENTION_TIME_IN_DAYS = integer

Parameter auf Objektebene, der die Aufbewahrungsfrist der Tabelle für Time Travel ändert. Weitere Informationen dazu finden Sie unter Verstehen und Verwenden von Time Travel und Verwenden von temporären und transienten Tabellen.

Eine ausführliche Beschreibung dieses Parameters sowie weitere Informationen zu Objektparametern finden Sie unter Parameter.

Werte:

  • Standardausführung: 0 oder 1

  • Enterprise Edition:

    • 0 bis 90 für permanente Tabellen

    • 0 oder 1 für temporäre und transiente Tabellen

Bemerkung

Der Wert 0 deaktiviert Time Travel für die Tabelle.

MAX_DATA_EXTENSION_TIME_IN_DAYS = integer

Objektparameter, der die maximale Anzahl von Tagen angibt, für die Snowflake die Datenaufbewahrungsfrist für die Tabelle verlängern kann, um zu verhindern, dass Streams auf der Tabelle veraltet sind.

Eine detaillierte Beschreibung dieses Parameters finden Sie unter MAX_DATA_EXTENSION_TIME_IN_DAYS.

CHANGE_TRACKING = TRUE | FALSE

Gibt an, dass die Änderungsverfolgung in der Tabelle aktiviert oder deaktiviert werden soll.

  • TRUE aktiviert die Änderungsverfolgung der Tabelle. Diese Option fügt der Quelltabelle einige ausgeblendete Spalten hinzu und beginnt mit dem Speichern von Metadaten zur Änderungsverfolgung in den Spalten. Diese Spalten verbrauchen nur wenig Speicherplatz.

    Die Änderungsverfolgungsmetadaten können mithilfe der CHANGES-Klausel für SELECT-Anweisungen oder durch Erstellen und Abfragen eines oder mehrerer Streams der Tabelle abgefragt werden.

  • FALSE deaktiviert die Änderungsverfolgung in der Tabelle. Verknüpfte ausgeblendete Spalten werden aus der Tabelle entfernt.

DEFAULT_DDL_COLLATION = 'collation_specification'

Gibt eine Standardsortierungsspezifikation für alle der Tabelle neu hinzugefügten Spalten an.

Durch das Festlegen des Parameters ändert sich nicht die Sortierungsspezifikation für vorhandene Spalten.

Weitere Informationen zu den Parametern finden Sie unter DEFAULT_DDL_COLLATION.

ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE }

Aktiviert oder deaktiviert automatische Änderungen am Tabellenschema durch Daten, die aus Quelldateien in die Tabelle geladen werden, einschließlich:

  • Hinzugefügte Spalten.

    Standardmäßig ist die Schemaentwicklung auf maximal 10 hinzugefügte Spalten pro Ladeoperation beschränkt. Um mehr als 10 hinzugefügte Spalten pro Ladeoperation anzufordern, wenden Sie sich an den Snowflake-Support.

  • Die Einschränkung NOT NULL kann für eine beliebige Anzahl von Spalten, die in neuen Datendateien fehlen, gelöscht werden.

Wenn Sie diese Option auf TRUE setzen, wird die automatische Tabellenschemaentwicklung aktiviert. Die Standardeinstellung FALSE deaktiviert die automatische Tabellenschemaentwicklung.

Bemerkung

Beim Laden von Daten aus Dateien erfolgt eine Tabellenspaltenentwicklung, wenn die folgenden Bedingungen erfüllt sind:

  • Die COPY INTO <Tabelle>-Anweisung enthält den Parameter MATCH_BY_COLUMN_NAME.

  • Die Rolle, mit der die Daten geladen werden, hat die EVOLVE SCHEMA- oder die OWNERSHIP-Berechtigung für die Tabelle.

Außerdem muss für die Schemaentwicklung mit CSV bei Verwendung von MATCH_BY_COLUMN_NAME und PARSE_HEADER der Parameter ERROR_ON_COLUMN_COUNT_MISMATCH auf „false“ gesetzt sein.

COMMENT = 'string_literal'

Fügt einen Kommentar hinzu oder überschreibt den vorhandenen Kommentar zur Tabelle.

Bemerkung

Geben Sie keine Kopieroptionen mit den Befehlen CREATE STAGE, ALTER STAGE, CREATE TABLE oder ALTER TABLE an. Wir empfehlen Ihnen, den Befehl COPY INTO <Tabelle> zu verwenden, um Kopieroptionen anzugeben.

UNSET ...

Gibt eine oder mehrere Eigenschaften/Parameter an, die für die Tabelle nicht festgelegt werden sollen, wodurch sie auf ihre Standardwerte zurückgesetzt werden:

  • DATA_RETENTION_TIME_IN_DAYS

  • MAX_DATA_EXTENSION_TIME_IN_DAYS

  • CHANGE_TRACKING

  • DEFAULT_DDL_COLLATION

  • ENABLE_SCHEMA_EVOLUTION

  • COMMENT

Clustering-Aktionen (clusteringAction)

CLUSTER BY ( expr [ , expr , ... ] )

Gibt eine oder mehrere Tabellenspalten oder Spaltenausdrücke als Gruppierungsschlüssel für die Tabelle an (oder ändert sie). Dies sind die Spalten/Ausdrücke, für die das Clustering mit Automatic Clustering verwaltet wird.

Wichtig

Gruppierungsschlüssel sind nicht für alle Tabellen vorgesehen oder empfehlenswert. Sie eignen sich vorrangig für sehr große Tabellen (im Multi-Terabyte-Bereich).

Bevor Sie Gruppierungsschlüssel für eine Tabelle angeben, lesen Sie erst Grundlegendes zu Tabellenstrukturen in Snowflake.

RECLUSTER ...

Veraltet

Führt ein manuelles, inkrementelles Reclustering einer Tabelle durch, in der Gruppierungsschlüssel definiert sind:

MAX_SIZE = budget_in_bytes

Veraltet – Verwenden Sie ein größeres Warehouse, um ein effektiveres Reclustering zu erreichen.

Gibt die Obergrenze für die Datenmenge (in Byte) in der Reclustering-Tabelle an.

WHERE condition

Gibt eine Bedingung oder einen Bereich für die Daten an, für die in der Tabelle ein Reclustering ausgeführt werden soll.

Bemerkung

Nur Rollen mit der Berechtigung OWNERSHIP oder INSERT für eine Tabelle können ein Reclustering auf dieser ausführen.

SUSPEND | RESUME RECLUSTER

Aktiviert oder deaktiviert Automatic Clustering für die Tabelle.

DROP CLUSTERING KEY

Löscht den Gruppierungsschlüssel für die Tabelle.

Weitere Informationen zu Gruppierungsschlüsseln und Reclustering finden Sie unter Grundlegendes zu Tabellenstrukturen in Snowflake.

Tabellenspaltenaktionen (tableColumnAction)

ADD [ COLUMN ] [ IF NOT EXISTS ] col_name col_data_type . [ DEFAULT default_value | AUTOINCREMENT ... ] . [ inlineConstraint ] [ COLLATE 'collation_specification' ] . [ [ WITH ] MASKING POLICY policy_name ] . [ [ WITH ] PROJECTION POLICY policy_name ] . [ [ WITH ] TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] ) ] [ , ...]

Fügt eine neue Spalte hinzu. Sie können einen Standardwert, eine Inline-Einschränkung, eine Sortierungsspezifikation, eine Maskierungsrichtlinie und/oder ein oder mehrere Tags angeben.

Ein Standardwert für eine Spalte, die Sie hinzufügen, muss ein literaler Wert sein, bei dem es sich aber nicht um einen Ausdruck oder einen von einer Funktion zurückgegebenen Wert handeln darf. Der folgende Befehl gibt zum Beispiel einen erwarteten Fehler zurück:

ALTER TABLE t1 ADD COLUMN c5 VARCHAR DEFAULT 12345::VARCHAR;
Copy
002263 (22000): SQL compilation error:
Invalid column default expression [CAST(12345 AS VARCHAR(16777216))]

Wenn Sie eine Tabelle zum ersten Mal erstellen, können Sie Ausdrücke als Standardwerte verwenden, aber nicht, wenn Sie Spalten hinzufügen.

Der Standardwert für eine Spalte muss mit dem Datentyp der Spalte übereinstimmen. Der Versuch, einen Standardwert mit einem nicht übereinstimmenden Datentyp festzulegen, schlägt mit einem Fehler fehl. Beispiel:

ALTER TABLE t1 ADD COLUMN c6 DATE DEFAULT '20230101';
Copy
002023 (22000): SQL compilation error:
Expression type does not match column data type, expecting DATE but got VARCHAR(8) for column C6

Weitere Informationen zu Aktionen auf Tabellenspalten finden Sie unter:

ADD COLUMN-Operationen können mit demselben Befehl auf mehreren Spalten ausgeführt werden.

Wenn Sie nicht sicher sind, ob die Spalte bereits existiert, können Sie beim Hinzufügen der Spalte IF NOT EXISTS angeben. Wenn die Spalte bereits existiert, hat ADD COLUMN keine Auswirkungen auf die bestehende Spalte und führt nicht zu einem Fehler.

Bemerkung

Sie können IF NOT EXISTS nicht angeben, wenn Sie für die neue Spalte auch Folgendes angeben:

  • DEFAULT, AUTOINCREMENT oder IDENTITY

  • UNIQUE, PRIMARY KEY oder FOREIGN KEY

RENAME COLUMN col_name to new_col_name

Benennt die angegebene Spalte in einen neuen Namen um, der derzeit für keine andere Spalte der Tabelle verwendet wird.

Eine Spalte, die Teil eines Gruppierungsschlüssels ist, kann nicht umbenannt werden.

Wenn ein Objekt (Tabelle, Spalte usw.) umbenannt wird, müssen andere Objekte, die darauf verweisen, mit dem neuen Namen aktualisiert werden.

DROP COLUMN [ IF EXISTS ] col_name [ CASCADE | RESTRICT ]

Entfernt die angegebene Spalte aus der Tabelle.

Wenn Sie nicht sicher sind, ob die Spalte bereits existiert, können Sie beim Löschen der Spalte IF EXISTS angeben. Wenn die Spalte nicht existiert, hat DROP COLUMN keine Auswirkung und führt nicht zu einem Fehler.

Das Löschen einer Spalte ist eine reine Metadatenoperation. Die Mikropartitionen werden nicht sofort neu geschrieben, weswegen der von der Spalte belegte Speicherplatz nicht sofort freigegeben wird. In der Regel wird der Speicherplatz innerhalb einer einzelnen Mikropartition beim nächsten Überschreiben der Mikropartition freigegeben. Dies ist in der Regel der Fall, wenn ein Schreibvorgang aufgrund von DML (INSERT, UPDATE, DELETE) oder Reclustering erfolgt.

Aktionen der Datenmetrikfunktion (dataMetricFunctionAction)

DATA_METRIC_SCHEDULE ...

Gibt den Zeitplan für die regelmäßige Ausführung der Datenmetrikfunktion an.

'num MINUTE'

Gibt ein Intervall (in Minuten) für die Wartezeit an, die zwischen Ausführungen der Datenmetrikfunktion eingefügt wird. Akzeptiert nur positive ganze Zahlen.

Unterstützt auch die Syntax num M.

Verwenden Sie für Datenmetrikfunktionen einen der folgenden Werte: 5, 15, 30, 60, 720 oder 1440.

'USING CRON expr time_zone'

Gibt einen Cron-Ausdruck und eine Zeitzone für die regelmäßige Ausführung der Datenmetrikfunktion an. Unterstützt eine Teilmenge der Standardsyntax des Cron-Dienstprogramms.

Eine Liste der Zeitzonen finden Sie unter List of tz database time zones (Liste der Zeitzonen aus der Zeitzonen-Datenbank) (Wikipedia).

Der cron-Ausdruck besteht aus den folgenden Feldern, und das periodische Intervall muss mindestens 5 Minuten betragen:

# __________ minute (0-59)
# | ________ hour (0-23)
# | | ______ day of month (1-31, or L)
# | | | ____ month (1-12, JAN-DEC)
# | | | | _ day of week (0-6, SUN-SAT, or L)
# | | | | |
# | | | | |
  * * * * *
Copy

Folgende Sonderzeichen werden unterstützt:

*

Platzhalter. Gibt jedes vorkommende Feld an.

L

Steht für „last“ (letzte). Bei Verwendung im Feld Wochentag können Sie Konstrukte wie „den letzten Freitag“ („5L“) eines bestimmten Monats angeben. Im Feld Tag des Monats wird der letzte Tag des Monats angegeben.

/{n}

Gibt die n-te Instanz einer bestimmten Zeiteinheit an. Jeder Zeitanteil wird unabhängig berechnet. Wenn beispielsweise im Monatsfeld 4/3 angegeben ist, ist die Datenmetrikfunktion für April, Juli und Oktober geplant (d. h. alle 3 Monate, beginnend mit dem 4. Monat des Jahres). In den Folgejahren wird derselbe Zeitplan beibehalten. Das heißt, die Datenmetrikfunktion ist nicht für eine Ausführung im Januar (3 Monate nach der Oktober-Ausführung) geplant.

Bemerkung

  • Der Cron-Ausdruck wird derzeit nur für die angegebene Zeitzone ausgewertet. Das Ändern des TIMEZONE-Parameterwerts für das Konto (oder das Festlegen des Werts auf Benutzer- oder Sitzungsebene) führt nicht zur Änderung der Zeitzone der Datenmetrikfunktion.

  • Der Cron-Ausdruck definiert alle gültigen Ausführungszeiten für die Datenmetrikfunktion. Snowflake versucht, eine Datenmetrikfunktion basierend auf diesem Zeitplan auszuführen. Eine gültige Laufzeit wird jedoch übersprungen, wenn eine vorherige Laufzeit nicht vor dem Start der nächsten gültigen Laufzeit abgeschlossen wurde.

  • Wenn sowohl ein bestimmter Tag des Monats als auch ein bestimmter Wochentag im Cron-Ausdruck enthalten sind, wird die Datenmetrikfunktion an Tagen geplant, die entweder dem Tag des Monats oder dem Wochentag entsprechen. Beispielsweise plant DATA_METRIC_SCHEDULE = 'USING CRON 0 0 10-20 * TUE,THU UTC' eine Datenmetrikfunktion um 0:00 Uhr an jedem 10. bis 20. Tag des Monats und auch an jedem Dienstag oder Donnerstag außerhalb dieser Tage.

  • Der kleinste Zeitwert in Cron ist Minute.

    Wird eine Datenmetrikfunktion innerhalb der in ihrem Cron-Ausdruck definierten Minute fortgesetzt, ist die erste geplante Ausführung der Datenmetrikfunktion das nächste Auftreten der Instanz des Cron-Ausdrucks. Wenn zum Beispiel eine Datenmetrikfunktion, die täglich um Mitternacht ausgeführt werden soll (USING CRON 0 0 * * *), um Mitternacht plus 5 Sekunden (00:00:05) fortgesetzt wird, wird die erste Ausführung der Datenmetrikfunktion für die folgende Mitternacht geplant.

'TRIGGER_ON_CHANGES'

Legt fest, dass die DMF ausgeführt wird, wenn eine DML-Operation die Tabelle verändert, wie z. B. das Einfügen einer neuen Zeile oder das Löschen einer Zeile.

Sie können 'TRIGGER_ON_CHANGES' für die folgenden Objekte angeben:

  • Dynamische Tabellen

  • Externe Tabellen

  • Apache Iceberg™-Tabellen

  • Reguläre Tabelle

  • Temporäre Tabellen

  • Transiente Tabellen

Änderungen an der Tabelle als Ergebnis von Reclustering lösen keine Ausführung der DMF aus.

{ ADD | DROP } DATA METRIC FUNCTION metric_name

Bezeichner der Datenmetrikfunktion, die der Tabelle oder Ansicht hinzugefügt oder aus der Tabelle oder Ansicht entfernt werden soll.

ON ( col_name [ , ... ] )

Die Spalten der Tabelle oder Ansicht, denen die Datenmetrikfunktion zugeordnet werden soll. Die Datentypen der Spalten müssen mit den Datentypen der in der Definition der Datenmetrikfunktion angegebenen Spalten übereinstimmen.

[ , metric_name_2 ON ( col_name [ , ... ] ) [ , ... ] ]

Zusätzliche Datenmetrikfunktionen, die Sie der Tabelle oder Ansicht hinzufügen können. Verwenden Sie ein Komma, um jede Datenmetrikfunktion und die angegebenen Spalten zu trennen.

MODIFY DATA METRIC FUNCTION metric_name

Bezeichner der zu ändernden Datenmetrikfunktion.

ON ( col_name [ , ... ] ) { SUSPEND | RESUME }

Setzt die Datenmetrikfunktion für die angegebenen Spalten aus oder setzt sie fort. Wenn eine Datenmetrikfunktion für eine Tabelle oder Ansicht festgelegt ist, wird die Datenmetrikfunktion automatisch in den Zeitplan aufgenommen.

  • SUSPEND entfernt die Datenmetrikfunktion aus dem Zeitplan.

  • RESUME bringt eine ausgesetzte Datenmetrikfunktion zurück in den Zeitplan.

[ , metric_name_2 ON ( col_name [ , ... ] ) [ , ... ] { SUSPEND | RESUME } ]

Zusätzliche Datenmetrikfunktionen zum Aussetzen oder Fortsetzen. Verwenden Sie ein Komma, um jede Datenmetrikfunktion und die angegebenen Spalten zu trennen.

Einzelheiten zu den Anforderungen an die Zugriffssteuerung für diese Aktionen finden Sie unter DMF-Berechtigungen.

Spaltenaktionen für externe Tabellen (extTableColumnAction)

Alle anderen Änderungen an externen Tabellen finden Sie unter ALTER EXTERNAL TABLE.

ADD [ COLUMN ] [ IF NOT EXISTS ] <col_name> <col_type> AS ( <expr> ) [, ...]

Fügt der externen Tabelle eine neue Spalte hinzu.

Wenn Sie nicht sicher sind, ob die Spalte bereits existiert, können Sie beim Hinzufügen der Spalte IF NOT EXISTS angeben. Wenn die Spalte bereits existiert, hat ADD COLUMN keine Auswirkungen auf die bestehende Spalte und führt nicht zu einem Fehler.

Diese Operation kann mit demselben Befehl auf mehreren Spalten ausgeführt werden.

col_name

Zeichenfolge, die den Spaltenbezeichner (z. B. Name) angibt. Alle Anforderungen an Tabellenbezeichner gelten auch für Spaltenbezeichner.

Weitere Informationen dazu finden Sie unter Anforderungen an Bezeichner.

col_type

Zeichenfolge (Konstante), die den Datentyp für die Spalte angibt. Der Datentyp der Spalte muss mit dem Ergebnis von expr übereinstimmen.

Einzelheiten zu den Datentypen, die für Tabellenspalten angegeben werden können, finden Sie unter Referenz der SQL-Datentypen.

expr

Zeichenfolge, die den Ausdruck für die Spalte angibt. Bei einer Abfrage gibt die Spalte Ergebnisse zurück, die von diesem Ausdruck abgeleitet sind.

Externe Tabellenspalten sind virtuelle Spalten, die mit einem expliziten Ausdruck definiert werden. Fügen Sie virtuelle Spalten als Ausdrücke hinzu, indem Sie die VALUE-Spalte und/oder die METADATA$FILENAME-Pseudospalte verwenden:

VALUE:

Eine Spalte vom Typ VARIANT, die eine einzelne Zeile in der externen Datei darstellt.

CSV:

Die VALUE-Spalte strukturiert jede Zeile als ein Objekt mit Elementen, die durch die Spaltenposition identifiziert werden (d. h. {c1: <Spalte_1_Wert>, c2: <Spalte_2_Wert>, c3: <Spalte_1_Wert> ...}).

Fügen Sie z. B. eine VARCHAR-Spalte mit dem Namen mycol hinzu, die auf die erste Spalte in den CSV-Stagingdateien verweist:

mycol varchar as (value:c1::varchar)
Copy
Semistrukturierte Daten:

Schließen Sie Elementnamen und Werte in doppelte Anführungszeichen ein. Durchlaufen Sie den Pfad in der VALUE-Spalte mithilfe der punktierten Schreibweise.

Nehmen wir zum Beispiel an, dass das Folgende eine einzelne Zeile mit semistrukturierten Daten in einer Stagingdatei darstellt:

{ "a":"1", "b": { "c":"2", "d":"3" } }
Copy

Fügen Sie eine VARCHAR-Spalte mit dem Namen mycol hinzu, die auf das verschachtelte, sich wiederholende Element c in der Stagingdatei verweist:

mycol varchar as (value:"b"."c"::varchar)
Copy
METADATA$FILENAME:

Eine Pseudospalte, die den Namen jeder in der externen Tabelle enthaltenen Staging-Datendatei einschließlich ihres Pfads im Stagingbereich angibt.

RENAME COLUMN col_name to new_col_name

Benennt die angegebene Spalte in einen neuen Namen um, der derzeit für keine andere Spalte der Tabelle verwendet wird.

DROP COLUMN [ IF EXISTS ] col_name

Entfernt die angegebene Spalte aus der Tabelle.

Wenn Sie nicht sicher sind, ob die Spalte bereits existiert, können Sie beim Löschen der Spalte IF EXISTS angeben. Wenn die Spalte nicht existiert, hat DROP COLUMN keine Auswirkung und führt nicht zu einem Fehler.

Einschränkungsaktionen (constraintAction)

ADD CONSTRAINT

Fügt einer oder mehreren Spalten in der Tabelle eine Out-of-Line-Integritätseinschränkung hinzu. Informationen zum Hinzufügen einer Inline-Einschränkung (für eine Spalte) finden Sie unter Spaltenaktionen (unter diesem Thema).

RENAME CONSTRAINT constraint_name TO new_constraint_name

Benennt die angegebene Einschränkung um.

ALTER | MODIFY CONSTRAINT ...

Ändert die Eigenschaften für die angegebene Einschränkung.

DROP CONSTRAINT constraint_name | PRIMARY KEY | UNIQUE | FOREIGN KEY ( col_name [ , ... ] ) [ CASCADE | RESTRICT ]

Löscht die angegebene Einschränkung für die angegebene Spalte oder den Satz von Spalten.

Detaillierte Syntax und Beispiele für das Hinzufügen oder Ändern von Einschränkungen finden Sie unter CREATE | ALTER TABLE … CONSTRAINT.

Data-Governance-Richtlinie und Tag-Aktionen (dataGovnPolicyTagAction)

TAG tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ]

Gibt den Namen des Tags und den Wert der Tag-Zeichenfolge an.

Der Tag-Wert ist immer eine Zeichenfolge, die maximale 256 Zeichen lang sein kann.

Weitere Informationen zur Angabe von Tags in einer Anweisung finden Sie unter Tag-Kontingente für Objekte und Spalten.

policy_name

Bezeichner für die Richtlinie. Dieser muss für Ihr Konto eindeutig sein.

Die folgenden Klauseln gelten für alle Tabellentypen, die Zeilenzugriffsrichtlinien unterstützen, wie z. B. Tabellen, Ansichten und Ereignistabellen. Der Einfachheit halber wird in den Klauseln nur von „Tabelle“ gesprochen.

ADD ROW ACCESS POLICY policy_name ON (col_name [ , ... ])

Fügt der Tabelle eine Zeilenzugriffsrichtlinie hinzu.

Es muss mindestens ein Spaltenname angegeben werden. Zusätzliche Spalten können mit einem Komma zwischen den einzelnen Spaltennamen angegeben werden. Verwenden Sie diesen Ausdruck, um eine Zeilenzugriffsrichtlinie sowohl zu einer Ereignistabelle als auch zu einer externen Tabelle hinzuzufügen.

DROP ROW ACCESS POLICY policy_name

Entfernt eine Zeilenzugriffsrichtlinie aus der Tabelle.

Verwenden Sie diese Klausel, um die Richtlinie in der Tabelle zu löschen.

DROP ROW ACCESS POLICY policy_name, ADD ROW ACCESS POLICY policy_name ON ( col_name [ , ... ] )

Löscht mit nur einer einzigen SQL-Anweisung die für die Tabelle festgelegte Zeilenzugriffsrichtlinie und fügt eine Zeilenzugriffsrichtlinie zu derselben Tabelle hinzu.

DROP ALL ROW ACCESS POLICIES

Löscht alle Zuordnungen von Zeilenzugriffsrichtlinien aus der Tabelle.

Dieser Ausdruck ist hilfreich, wenn eine Zeilenzugriffsrichtlinie aus einem Schema gelöscht wird, bevor die Richtlinie aus einer Ereignistabelle gelöscht wird. Verwenden Sie diesen Ausdruck, um Zuordnungen von Zeilenzugriffsrichtlinien aus der Tabelle zu löschen.

SET AGGREGATION POLICY policy_name
[ ENTITY KEY (col_name [ , ... ]) ] [ FORCE ]

Weist der Tabelle eine Aggregationsrichtlinie zu.

Verwenden Sie den optionalen Parameter ENTITY KEY, um festzulegen, welche Spalten eine Entität innerhalb der Tabelle eindeutig identifizieren. Weitere Informationen dazu finden Sie unter Implementieren von Datenschutz auf Entitätsebene mit Aggregationsrichtlinien.

Verwenden Sie den optionalen Parameter FORCE, um eine bestehende Aggregationsrichtlinie atomar durch die neue Aggregationsrichtlinie zu ersetzen.

UNSET AGGREGATION POLICY

Löst die Zuordnung einer Aggregationsrichtlinie zu der Tabelle auf.

{ ALTER | MODIFY } [ COLUMN ] ...
USING ( col_name , cond_col_1 ... )

Gibt die Argumente an, die an den SQL-Ausdruck für die bedingte Maskierungsrichtlinie übergeben werden sollen.

Die erste Spalte in der Liste gibt die Spalte für die Richtlinienbedingungen zur Maskierung oder Tokenisierung der Daten an. Sie muss mit der Spalte übereinstimmen, für die die Maskierungsrichtlinie festgelegt ist.

Die zusätzlichen Spalten geben an, welche Spalten ausgewertet werden sollen, um zu ermitteln, ob die Daten in der jeweiligen Zeile des Abfrageergebnisses maskiert oder tokenisiert werden sollen, wenn auf der ersten Spalte eine Abfrage ausgeführt wird.

Wenn die USING-Klausel weggelassen wird, behandelt Snowflake die bedingte Maskierungsrichtlinie wie eine normale Maskierungsrichtlinie.

FORCE

Ersetzt mit nur einer Anweisung eine Maskierungs- oder Projektionsrichtlinie, die derzeit für eine Spalte festgelegt ist, durch eine andere Richtlinie.

Beachten Sie, dass die Verwendung des Schlüsselworts FORCE mit einer Maskierungsrichtlinie voraussetzt, dass der Datentyp der Richtlinie in der ALTER TABLE-Anweisung (d. h. STRING) mit dem Datentyp der aktuell für die Spalte festgelegten Maskierungsrichtlinie (d. h. STRING) übereinstimmt.

Wenn für die Spalte derzeit keine Maskierungsrichtlinie festgelegt ist, hat die Angabe dieses Schlüsselworts keine Auswirkungen.

Weitere Details dazu finden Sie unter Maskierungsrichtlinie auf einer Spalte ersetzen oder Projektionsrichtlinie ersetzen.

Suchoptimierungsaktionen (searchOptimizationAction)

ADD SEARCH OPTIMIZATION

Fügt die Suchoptimierung für die gesamte Tabelle oder bei Angabe der optionale ON-Klausel für bestimmte Spalten hinzu.

Hinweis:

  • Die Wartung der Suchoptimierung kann teuer werden, insbesondere wenn sich die Daten in der Tabelle häufig ändern. Weitere Informationen dazu finden Sie unter Abschätzen und Verwalten der Kosten für die Suchoptimierung.

  • Wenn Sie versuchen, einer materialisierten Ansicht eine Suchoptimierung hinzuzufügen, gibt Snowflake eine Fehlermeldung zurück.

ON search_method_with_target [, search_method_with_target ... ]

Gibt an, dass Sie die Suchoptimierung für bestimmte Spalten oder VARIANT-Felder (und nicht für die gesamte Tabelle) konfigurieren möchten.

Verwenden Sie für search_method_with_target einen Ausdruck mit der folgenden Syntax:

<search_method>( <target> [ , <target> , ... ] [ , ANALYZER => '<analyzer_name>' ] )
Copy

Wobei:

  • search_method gibt eine der folgenden Methoden an, die Abfragen für einen bestimmten Prädikatstyp optimieren:

    Suchmethode

    Beschreibung

    FULL_TEXT

    Prädikate, die die Typen VARCHAR (Text), VARIANT, ARRAY und OBJECT verwenden

    EQUALITY

    Gleichheits- und IN-Prädikate.

    SUBSTRING

    Prädikate, die mit Teilzeichenfolgen und regulären Ausdrücken übereinstimmen (z. B. [ NOT ] LIKE, [ NOT ] ILIKE, [ NOT ] RLIKE, REGEXP_LIKE usw.)

    GEO

    Prädikate, die GEOGRAPHY-Typen verwenden.

  • target gibt die Spalte, das VARIANT-Feld oder ein Sternchen (*) an.

    Je nach dem Wert von search_method können Sie eine Spalte oder ein VARIANT-Feld eines der folgenden Typen angeben:

    Suchmethode

    Unterstützte Ziele

    FULL_TEXT

    Spalten der Datentypen VARCHAR (Text), VARIANT, ARRAY und OBJECT, einschließlich Pfade zu Feldern in VARIANTs.

    EQUALITY

    Spalten mit numerischen, Zeichenfolgen-, Binär- und VARIANT-Datentypen, einschließlich Pfaden zu Feldern in VARIANT-Werten.

    SUBSTRING

    Spalten mit Zeichenfolgen- oder VARIANT-Datentypen, einschließlich Pfaden zu Feldern in VARIANT-Werten. Geben Sie Pfade zu Feldern an, wie oben unter EQUALITY beschrieben. Die Suche nach verschachtelten Feldern wird auf die gleiche Weise verbessert.

    GEO

    Spalten vom Datentyp GEOGRAPHY

    Um ein Feld VARIANT anzugeben, verwenden Sie Punkt- oder Klammerschreibweise (zum Beispiel my_column:my_field_name.my_nested_field_name oder my_column['my_field_name']['my_nested_field_name']). Sie können auch einen durch Doppelpunkte getrennten Pfad zu dem Feld verwenden (z. B. my_column:my_field_name:my_nested_field_name).

    Wenn Sie ein VARIANT-Feld angeben, gilt die Konfiguration für alle verschachtelten Felder unter diesem Feld. So geben Sie beispielsweise ON EQUALITY(src:a.b) an:

    • Diese Konfiguration kann Abfragen verbessern on src:a.b und auf allen verschachtelten Feldern (z. B. src:a.b.c, src:a.b.c.d usw.).

    • Diese Konfiguration wirkt sich nicht auf Abfragen aus, die nicht das Präfix src:a.b verwenden (z. B. src:a, src:z, usw.).

    Um alle zutreffenden Spalten in der Tabelle als Ziele anzugeben, verwenden Sie das Sternchen (*).

    Beachten Sie, dass Sie für eine gegebene Suchmethode nicht sowohl Sternchen als auch spezifische Spaltennamen angeben können. Sie können jedoch Sternchen bei verschiedenen Suchmethoden angeben.

    Sie können zum Beispiel die folgenden Ausdrücke angeben:

    -- Allowed
    ON SUBSTRING(*)
    ON EQUALITY(*), SUBSTRING(*), GEO(*)
    
    Copy

    Die folgenden Ausdrücke können Sie nicht angeben:

    -- Not allowed
    ON EQUALITY(*, c1)
    ON EQUALITY(c1, *)
    ON EQUALITY(v1:path, *)
    ON EQUALITY(c1), EQUALITY(*)
    
    Copy
  • ANALYZER => 'analyzer_name' gibt den Namen des Textanalysators an, wenn search_method FULL_TEXT ist.

    Wenn die Suchmethode FULL_TEXT verwendet wird und Abfragen mit der Funktion SEARCH oder SEARCH_IP ausgeführt werden, zerlegt der Analysator die Suchbegriffe (und den Text der durchsuchten Spalte) in Token. Eine Zeile stimmt überein, wenn eines der aus der Zeichenfolge extrahierten Token mit einem Token übereinstimmt, das aus einer der durchsuchten Spalten oder Felder extrahiert wurde. Der Analysator ist nicht relevant, wenn die Suchmethode FULL_TEXT nicht verwendet wird oder für Abfragen, die nicht die Funktion SEARCH oder SEARCH_IP verwenden.

    Der Analysator übersetzt eine Zeichenfolge in Token, indem er sie an bestimmten Trennzeichen aufbricht. Diese Trennzeichen sind in den resultierenden Token nicht enthalten, und leere Token werden nicht extrahiert.

    Dieser Parameter akzeptiert einen der folgenden Werte:

    • DEFAULT_ANALYZER: Unterteile den Text anhand folgender Trennzeichen in Token:

      Zeichen

      Unicode-Code

      Beschreibung

      U+0020

      Leerzeichen

      [

      U+005B

      Linke eckige Klammer

      ]

      U+005D

      Rechte eckige Klammer

      ;

      U+003B

      Semikolon

      <

      U+003C

      Weniger-als-Zeichen

      >

      U+003E

      Größer-als-Zeichen

      (

      U+0028

      Linke Klammer

      )

      U+0029

      Rechte Klammer

      {

      U+007B

      Linke geschweifte Klammer

      }

      U+007D

      Rechte geschweifte Klammer

      |

      U+007C

      Vertikaler Balken

      !

      U+0021

      Ausrufezeichen

      ,

      U+002C

      Komma

      '

      U+0027

      Apostroph

      "

      U+0022

      Anführungszeichen

      *

      U+002A

      Asterisk

      &

      U+0026

      Ampersand

      ?

      U+003F

      Fragezeichen

      +

      U+002B

      Pluszeichen

      /

      U+002F

      Schrägstrich

      :

      U+003A

      Doppelpunkt

      =

      U+003D

      Gleichheitszeichen

      @

      U+0040

      Bei Zeichen

      .

      U+002E

      Punkt (Punkt)

      -

      U+002D

      Bindestrich

      $

      U+0024

      Dollarzeichen

      %

      U+0025

      Prozentzeichen

      \

      U+005C

      Backslash

      _

      U+005F

      Unterstrich (untere Linie)

      \n

      U+000A

      Neue Zeile (Zeilenvorschub)

      \r

      U+000D

      Zeilenumbruch

      \t

      U+0009

      Horizontale Registerkarte

    • UNICODE_ANALYZER: Tokenisierung auf der Grundlage von Unicode-Segmentierungsregeln, die Leerzeichen und bestimmte Satzzeichen als Trennzeichen behandeln. Diese internen Regeln sind für die Suche in natürlicher Sprache (in vielen verschiedenen Sprachen) konzipiert. Zum Beispiel behandelt der Standardanalysator Punkte in IP-Adressen und Apostrophe in Kontraktionen als Trennzeichen, der Unicode-Analysator jedoch nicht. Siehe Verwendung eines Analysators zur Anpassung des Suchverhaltens.

      Weitere Informationen über den Algorithmus zur Segmentierung von Unicode-Text finden Sie unter https://unicode.org/reports/tr29/.

    • NO_OP_ANALYZER: Übersetzt weder die Daten noch die Zeichenfolge der Abfrage in Token. Ein Suchbegriff muss exakt mit dem vollständigen Text in einer Spalte oder einem Feld übereinstimmen, einschließlich der Groß- und Kleinschreibung; andernfalls gibt die Funktion SEARCH FALSE zurück. Auch wenn die Zeichenfolge der Abfrage so aussieht, als enthielte sie mehrere Token (z. B. 'sky blue'), muss die Spalte oder das Feld genau der gesamten Zeichenfolge der Abfrage entsprechen. In diesem Fall ist nur 'sky blue' eine Übereinstimmung; 'sky' und 'blue' sind keine Übereinstimmungen.

    • ENTITY_ANALYZER: Übersetzt die Daten für die IP-Adressensuche in Token.

      Dieser Analysator wird nur für Abfragen verwendet, die mit der Funktion SEARCH_IP ausgeführt werden.

Wenn Sie mehr als eine Suchmethode für ein Ziel angeben möchten, trennen Sie jede nachfolgende Methode und jedes Ziel durch ein Komma:

ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1), EQUALITY(c2, c3);
Copy

Wenn Sie den Befehl ALTER TABLE … ADD SEARCH OPTIMIZATION ON … mehrfach für dieselbe Tabelle ausführen, wird jeder nachfolgende Befehl zu der bestehenden Konfiguration der Tabelle hinzugefügt. Angenommen, Sie führen die folgenden Befehle aus:

ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1, c2);
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c3, c4);
Copy

Damit werden Gleichheitsprädikate für die Spalten c1, c2, c3 und c4 zur Konfiguration der Tabelle hinzugefügt. Dies ist gleichbedeutend mit der Ausführung des Befehls:

ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1, c2, c3, c4);
Copy

Weitere Beispiele finden Sie unter Aktivieren der Suchoptimierung für bestimmte Spalten.

DROP SEARCH OPTIMIZATION

Entfernt die Suchoptimierung von der gesamten Tabelle oder bei Angabe der optionale ON-Klausel von bestimmten Spalten.

Hinweis:

  • Wenn eine Tabelle die Suchoptimierungseigenschaft hat, bleibt die Suchoptimierungseigenschaft erhalten, wenn Sie die Tabelle löschen und entfernen.

  • Das Entfernen der Suchoptimierungseigenschaft aus einer Tabelle und das anschließende Hinzufügen verursachen die gleichen Kosten wie das erstmalige Hinzufügen.

ON search_method_with_target | column_name | expression_id [ , ... ]

Gibt an, dass Sie die Suchoptimierung von bestimmte Spalten oder VARIANT-Feldern (und nicht von der gesamten Tabelle) entfernen möchten.

Um die zu löschende Spaltenkonfiguration zu identifizieren, verwenden Sie eine der folgenden Optionen:

  • Geben Sie für search_method_with_target eine Methode zur Optimierung von Abfragen für ein oder mehrere bestimmte Ziele an, die Spalten oder VARIANT-Felder sein können. Verwenden Sie die oben beschriebene Syntax.

  • Geben Sie für column_name den Namen der für die Suchoptimierung konfigurierten Spalte an. Durch die Angabe des Spaltennamens werden alle Ausdrücke für diese Spalte gelöscht, einschließlich der Ausdrücke, die VARIANT-Felder in der Spalte verwenden.

  • Geben Sie für expression_id die ID eines Ausdrucks an, der in der Ausgabe des Befehls DESCRIBE SEARCH OPTIMIZATION aufgeführt ist.

Wenn Sie mehr als eine dieser Optionen angeben möchten, trennen Sie die Elemente durch ein Komma.

Sie können beliebige Kombinationen von Suchmethoden mit Zielen, Spaltennamen und Ausdruck-IDs angeben.

Weitere Beispiele finden Sie unter Löschen der Suchoptimierung für bestimmte Spalten.

Nutzungshinweise: Allgemein

  • Änderungen an einer Tabelle werden nicht automatisch an Ansichten weitergegeben, die für diese Tabelle erstellt wurden. Wenn Sie beispielsweise eine Spalte in einer Tabelle löschen und eine Ansicht so definiert ist, dass sie diese Spalte enthält, wird die Ansicht ungültig. Die Ansicht wird nicht angepasst, um die Spalte zu entfernen.

  • Durch das Löschen einer Spalte wird der Speicherplatz der Spalte nicht sofort freigegeben.

    • Der Speicherplatz in jeder Mikropartition wird erst freigegeben, wenn diese Mikropartition neu geschrieben wird. Schreiboperationen (Einfügen, Aktualisieren, Löschen usw.) auf einer oder mehreren Zeilen dieser Mikropartition bewirken, dass die Mikropartition neu geschrieben wird. Wenn Sie das Freigeben von Speicherplatz erzwingen möchten, können Sie folgende Schritte ausführen:

      1. Verwenden Sie eine CREATE TABLE AS SELECT (CTAS)-Anweisung, um eine neue Tabelle zu erstellen, die nur die Spalten der alten Tabelle enthält, die Sie behalten möchten.

      2. Setzen Sie den Parameter DATA_RETENTION_TIME_IN_DAYS für die alte Tabelle auf 0 (optional).

      3. Löschen Sie die alte Tabelle.

    • Wenn die Tabelle durch das Time Travel-Feature geschützt ist, wird der vom Time Travel-Speicher verwendete Speicherplatz erst nach Ablauf der Time Travel-Aufbewahrungsfrist freigegeben.

  • Wenn eine neue Spalte mit einem Standardwert zu einer Tabelle mit vorhandenen Zeilen hinzugefügt wird, werden alle vorhandenen Zeilen mit dem Standardwert gefüllt.

  • Das Hinzufügen einer neuen Spalte mit einem Standardwert, der eine Funktion enthält, wird derzeit nicht unterstützt. Der folgende Fehler wird zurückgegeben:

    Invalid column default expression (expr)

  • Um eine Tabelle zu ändern, müssen Sie eine Rolle verwenden, die über Eigentümerrechte für die Tabelle verfügt.

  • Für das Hinzufügen von Clustering zu einer Tabelle müssen Sie auch über USAGE- oder OWNERSHIP-Berechtigungen für das Schema und die Datenbank verfügen, die die Tabelle enthalten.

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

  • Für Zeilenzugriffsrichtlinien:

    • Snowflake unterstützt das Hinzufügen und Löschen von Zeilenzugriffsrichtlinien mit einer einzigen SQL-Anweisung.

      Wenn Sie z. B. eine bereits für eine Tabelle festgelegte Zeilenzugriffsrichtlinie durch eine andere Richtlinie ersetzen möchten, müssen Sie zuerst die Zeilenzugriffsrichtlinie löschen und dann die neue Zeilenzugriffsrichtlinie hinzufügen.

    • Für eine gegebene Ressource (d. h. Tabelle oder Ansicht) müssen Sie für ein ADD oder DROP der Zeilenzugriffsrichtlinie entweder über die APPLY ROW ACCESS POLICY-Berechtigung für das Schema oder über die OWNERSHIP-Berechtigung für die Ressource und die APPLY-Berechtigung für die Ressource der Zeilenzugriffsrichtlinie verfügen.

    • Eine Tabelle oder Ansicht kann nur durch jeweils eine einzige Zeilenzugriffsrichtlinie geschützt werden. Das Hinzufügen einer Richtlinie schlägt fehl, wenn sich der Richtlinientext auf eine Tabellen- oder Ansichtsspalte bezieht, die durch eine Zeilenzugriffsrichtlinie geschützt ist, oder auf eine Spalte, die durch eine Maskierungsrichtlinie geschützt ist.

      In ähnlicher Weise schlägt das Hinzufügen einer Maskierungsrichtlinie zu einer Tabellenspalte fehl, wenn der Richtlinientext der Maskierungsrichtlinie auf eine Tabelle verweist, die durch eine Zeilenzugriffsrichtlinie oder eine andere Maskierungsrichtlinie geschützt ist.

    • Zeilenzugriffsrichtlinien können nicht auf systemspezifische Ansichten oder Tabellenfunktionen angewendet werden.

    • Ähnlich wie bei anderen DROP <Objekt>-Operationen gibt Snowflake einen Fehler zurück, wenn versucht wird, eine Zeilenzugriffsrichtlinie aus einer Ressource zu löschen, der keine Zeilenzugriffsrichtlinie hinzugefügt wurde.

    • Wenn ein Objekt sowohl eine Zeilenzugriffsrichtlinie als auch eine oder mehrere Maskierungsrichtlinien hat, wird die Zeilenzugriffsrichtlinie zuerst ausgewertet.

  • Wenn Sie einen Fremdschlüssel erstellen, müssen die Spalten in der REFERENCES-Klausel in der gleichen Reihenfolge aufgeführt werden, wie sie für den Primärschlüssel aufgeführt wurden. Beispiel:

    CREATE TABLE parent ... CONSTRAINT primary_key_1 PRIMARY KEY (c_1, c_2) ...
    CREATE TABLE child  ... CONSTRAINT foreign_key_1 FOREIGN KEY (...) REFERENCES parent (c_1, c_2) ...
    
    Copy

    In beiden Fällen ist die Reihenfolge der Spalten c_1, c_2. Wäre die Reihenfolge der Spalten im Fremdschlüssel eine andere gewesen (z. B. c_2, c_1), wäre der Versuch, den Fremdschlüssel zu erstellen, fehlgeschlagen.

  • Hinweis zu Metadaten:

    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.

  • ALTER TABLE … CHANGE_TRACKING = TRUE

    • Wenn eine Tabelle geändert wird, um die Änderungsverfolgung zu aktivieren, wird die Tabelle für die Dauer der Operation gesperrt. Sperren können bei einigen damit verbundenen DDL/DML-Operationen eine Latenz verursachen. Weitere Informationen dazu finden Sie unter Ressourcensperrung.

  • Indizes in Hybridtabellen:

    • Wenn Sie den Befehl ALTER TABLE verwenden, um eine eindeutige Einschränkung oder eine Fremdschlüssel-Einschränkung zu einer Hybridtabelle hinzuzufügen oder zu löschen, wird der entsprechende Index ebenfalls erstellt bzw. gelöscht. Weitere Informationen zu Indizes in einer Hybridtabelle finden Sie unter CREATE INDEX.

    • Fremdschlüssel-Einschränkungen werden nur für Hybridtabellen unterstützt, die in derselben Datenbank gespeichert sind. Die Möglichkeit, eine Hybridtabelle von einer Datenbank in eine andere zu verschieben, wird nicht unterstützt. Bei Einschränkungen für Primärschlüssel, eindeutige Schlüssel und Fremdschlüssel, die für Hybridtabellen definiert sind, ist das RELY-Feld mit TRUE markiert.

    • Eine Spalte, die von einem Index verwendet wird, kann erst gelöscht werden, wenn zuvor der entsprechende Index gelöscht wurde.

Nutzungshinweise: Datenmetrikfunktionen

Hinzufügen einer DMF zu einer Tabelle:

Bevor Sie eine Datenmetrikfunktion zu einer Tabelle hinzufügen, müssen Sie Folgendes tun:

  • Festlegen des Zeitplans für die Ausführung der Datenmetrikfunktion. Weitere Details dazu finden Sie unter DATA_METRIC_SCHEDULE.

  • Konfigurieren der Ereignistabelle, um die Ergebnisse des Aufrufs der Datenmetrikfunktion zu speichern. Weitere Details dazu finden Sie unter DMF-Ergebnisse anzeigen.

  • Sicherstellen, dass die Tabelle oder Ansicht nicht für eine Freigabe freigegeben ist, da Sie keine Datenmetrikfunktion für eine freigegebene Tabelle oder Ansicht festlegen können.

Außerdem:

  • Sie können einer Tabelle, einer externen Tabelle, einer Ansicht oder einer materialisierten Ansicht eine Datenmetrikfunktion hinzufügen. Sie können keine andere Art von Tabelle, wie z. B. eine dynamische Tabelle, mit einer Datenmetrikfunktion versehen.

  • Wenn Sie eine Spalte angeben, verwendet Snowflake die Ordinalposition. Wenn Sie eine Spalte umbenennen, nachdem Sie der Tabelle oder Ansicht eine Datenmetrikfunktion hinzugefügt haben, bleibt die Zuordnung der Datenmetrikfunktion zu der Spalte gültig.

  • Zu einer Spalte kann nur eine Datenmetrikfunktion ihrer Art hinzugefügt werden. Beispielsweise kann eine NULL_COUNT-Datenmetrikfunktion nicht zweimal zu einer einzelnen Spalte hinzugefügt werden.

  • Wenn Sie eine Spalte löschen, nachdem Sie eine Datenmetrikfunktion hinzugefügt haben, die auf diese Spalte verweist, kann Snowflake die Datenmetrikfunktion nicht auswerten.

  • Verweise auf virtuelle Spalten werden nicht unterstützt.

Löschen einer DMF aus einer Tabelle:
  • Löschen Sie die Datenmetrikfunktion aus der Tabelle, bevor Sie den Befehl DROP FUNCTION verwenden, um die Datenmetrikfunktion aus dem System zu entfernen.

  • Sie können die Funktion DATA_METRIC_FUNCTION_REFERENCES verwenden, um die Tabellen- und Ansichtsobjekte zu identifizieren, für die eine Datenmetrikfunktion festgelegt wurde.

DMF planen

Sobald der Zeitplan festgelegt ist, dauert es zehn Minuten, bis er in Kraft tritt.

Ebenso dauert es zehn Minuten, bis die Änderungen in der Zeitplanung wirksam werden, sobald die DMF deaktiviert wird. Weitere Informationen dazu finden Sie unter Ausführung von DMFs planen.

Beispiele

Die folgenden Abschnitte enthalten Beispiele für die Verwendung des ALTER COLUMN-Befehls:

Umbenennen einer Tabelle

Eine Tabelle namens t1 wird wie folgt erstellt:

CREATE OR REPLACE TABLE t1(a1 number);
Copy
SHOW TABLES LIKE 't1';
Copy
+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+
| created_on                    | name | database_name | schema_name | kind  | comment | cluster_by | rows | bytes | owner  | retention_time | change_tracking | is_external | enable_schema_evolution | owner_role_type | is_event | budget |
|-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------|
| 2023-10-19 10:37:04.858 -0700 | T1   | TESTDB        | MY_SCHEMA   | TABLE |         |            |    0 |     0 | PUBLIC | 1              | OFF             | N           | N                       | ROLE            | N        | NULL   |
+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+

Die folgende Anweisung ändert den Namen der Tabelle in tt1:

ALTER TABLE t1 RENAME TO tt1;
Copy
SHOW TABLES LIKE 'tt1';
Copy
+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+
| created_on                    | name | database_name | schema_name | kind  | comment | cluster_by | rows | bytes | owner  | retention_time | change_tracking | is_external | enable_schema_evolution | owner_role_type | is_event | budget |
|-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------|
| 2023-10-19 10:37:04.858 -0700 | TT1  | TESTDB        | MY_SCHEMA   | TABLE |         |            |    0 |     0 | PUBLIC | 1              | OFF             | N           | N                       | ROLE            | N        | NULL   |
+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+

Austauschen von Tabellen

Die folgenden Anweisungen erstellen Tabellen mit den Namen t1 und t2:

CREATE OR REPLACE TABLE t1(a1 NUMBER, a2 VARCHAR, a3 DATE);
CREATE OR REPLACE TABLE t2(b1 VARCHAR);
Copy
DESC TABLE t1;
Copy
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1   | NUMBER(38,0)      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A2   | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | DATE              | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
DESC TABLE t2;
Copy
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1   | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+

Die folgende Anweisung vertauscht Tabelle t1 mit Tabelle t2:

ALTER TABLE t1 SWAP WITH t2;
Copy
DESC TABLE t1;
Copy
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1   | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
DESC TABLE t2;
Copy
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1   | NUMBER(38,0)      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A2   | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | DATE              | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+

Hinzufügen von Spalten

Eine Tabelle namens t1 wird wie folgt erstellt:

CREATE OR REPLACE TABLE t1(a1 NUMBER);
Copy
DESC TABLE t1;
Copy
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1   | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+

Die folgende Anweisung fügt eine Spalte mit dem Namen a2 zu dieser Tabelle hinzu:

ALTER TABLE t1 ADD COLUMN a2 NUMBER;
Copy

Die folgende Anweisung fügt eine Spalte namens a3 mit einer NOT NULL-Einschränkung hinzu:

ALTER TABLE t1 ADD COLUMN a3 NUMBER NOT NULL;
Copy

Die folgende Anweisung fügt eine Spalte namens a4 mit einem Standardwert und einer NOT NULL-Einschränkung hinzu:

ALTER TABLE t1 ADD COLUMN a4 NUMBER DEFAULT 0 NOT NULL;
Copy

Die folgende Anweisung fügt eine VARCHAR-Spalte namens a5 mit einer sprachspezifischen Sortierungsspezifikation hinzu:

ALTER TABLE t1 ADD COLUMN a5 VARCHAR COLLATE 'en_US';
Copy
DESC TABLE t1;
Copy
+------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type                              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1   | NUMBER(38,0)                      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A2   | NUMBER(38,0)                      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | NUMBER(38,0)                      | COLUMN | N     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A4   | NUMBER(38,0)                      | COLUMN | N     | 0       | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A5   | VARCHAR(16777216) COLLATE 'en_us' | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+

Die folgende Anweisung verwendet die IF NOT EXISTS-Klausel, um eine Spalte mit dem Namen a2 nur dann hinzuzufügen, wenn die Spalte nicht existiert. Es gibt bereits eine Spalte mit dem Namen a2. Durch die Angabe der IF NOT EXISTS-Klausel wird verhindert, dass die Anweisung mit einem Fehler fehlschlägt.

ALTER TABLE t1 ADD COLUMN IF NOT EXISTS a2 NUMBER;
Copy

Wie die Ausgabe des Befehls DESCRIBE TABLE zeigt, hat die obige Anweisung keine Auswirkung auf die vorhandene Spalte namens a2:

DESC TABLE t1;
Copy
+------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type                              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1   | NUMBER(38,0)                      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A2   | NUMBER(38,0)                      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | NUMBER(38,0)                      | COLUMN | N     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A4   | NUMBER(38,0)                      | COLUMN | N     | 0       | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A5   | VARCHAR(16777216) COLLATE 'en_us' | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+

Umbenennen von Spalten

Die folgende Anweisung ändert den Namen der Spalte a1 in b1:

ALTER TABLE t1 RENAME COLUMN a1 TO b1;
Copy
DESC TABLE t1;
Copy
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1   | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A2   | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | NUMBER(38,0) | COLUMN | N     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A4   | NUMBER(38,0) | COLUMN | N     | 0       | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+

Löschen von Spalten

Die folgende Anweisung löscht die Spalte a2:

ALTER TABLE t1 DROP COLUMN a2;
Copy
DESC TABLE t1;
Copy
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1   | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | NUMBER(38,0) | COLUMN | N     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A4   | NUMBER(38,0) | COLUMN | N     | 0       | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+

Die folgende Anweisung verwendet die IF EXISTS-Klausel, um eine Spalte mit dem Namen a2 nur dann zu löschen, wenn die Spalte existiert. Es gibt keine existierende Spalte mit dem Namen a2. Durch die Angabe der IF EXISTS-Klausel wird verhindert, dass die Anweisung mit einem Fehler fehlschlägt.

ALTER TABLE t1 DROP COLUMN IF EXISTS a2;
Copy

Wie die Ausgabe des Befehls DESCRIBE TABLE zeigt, hat die obige Anweisung keine Auswirkungen auf die bestehende Tabelle:

+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1   | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | NUMBER(38,0) | COLUMN | N     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A4   | NUMBER(38,0) | COLUMN | N     | 0       | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
Copy

Hinzufügen, Umbenennen und Löschen von Spalten einer externen Tabelle

Die folgende Anweisung erstellt eine externe Tabelle mit dem Namen exttable1:

CREATE EXTERNAL TABLE exttable1
  LOCATION=@mystage/logs/
  AUTO_REFRESH = true
  FILE_FORMAT = (TYPE = PARQUET)
  ;
Copy
DESC EXTERNAL TABLE exttable1;
Copy
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| name      | type              | kind      | null? | default | primary key | unique key | check | expression                                               | comment               |
|-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------|
| VALUE     | VARIANT           | COLUMN    | Y     | NULL    | N           | N          | NULL  | NULL                                                     | The value of this row |
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+

Die folgende Anweisung fügt eine neue Spalte mit dem Namen a1 in die externe Tabelle ein:

ALTER TABLE exttable1 ADD COLUMN a1 VARCHAR AS (value:a1::VARCHAR);
Copy
DESC EXTERNAL TABLE exttable1;
Copy
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| name      | type              | kind      | null? | default | primary key | unique key | check | expression                                               | comment               |
|-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------|
| VALUE     | VARIANT           | COLUMN    | Y     | NULL    | N           | N          | NULL  | NULL                                                     | The value of this row |
| A1        | VARCHAR(16777216) | VIRTUAL   | Y     | NULL    | N           | N          | NULL  | TO_CHAR(GET(VALUE, 'a1'))                                | NULL                  |
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+

Die folgende Anweisung ändert den Namen der Spalte a1 in b1:

ALTER TABLE exttable1 RENAME COLUMN a1 TO b1;
Copy
DESC EXTERNAL TABLE exttable1;
Copy
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| name      | type              | kind      | null? | default | primary key | unique key | check | expression                                               | comment               |
|-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------|
| VALUE     | VARIANT           | COLUMN    | Y     | NULL    | N           | N          | NULL  | NULL                                                     | The value of this row |
| B1        | VARCHAR(16777216) | VIRTUAL   | Y     | NULL    | N           | N          | NULL  | TO_CHAR(GET(VALUE, 'a1'))                                | NULL                  |
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+

Die folgende Anweisung löscht die Spalte namens b1:

ALTER TABLE exttable1 DROP COLUMN b1;
Copy
DESC EXTERNAL TABLE exttable1;
Copy
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| name      | type              | kind      | null? | default | primary key | unique key | check | expression                                               | comment               |
|-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------|
| VALUE     | VARIANT           | COLUMN    | Y     | NULL    | N           | N          | NULL  | NULL                                                     | The value of this row |
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+

Ändern der Reihenfolge der Gruppierungsschlüssel

Die folgende Anweisung erstellt eine Tabelle namens t1, die nach den Spalten id und date geclustert wird:

CREATE OR REPLACE TABLE T1 (id NUMBER, date TIMESTAMP_NTZ, name STRING) CLUSTER BY (id, date);
Copy
SHOW TABLES LIKE 'T1';
Copy
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
           created_on            | name | database_name | schema_name | kind  | comment | cluster_by | rows | bytes |    owner     | retention_time |
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
 Tue, 21 Jun 2016 15:42:12 -0700 | T1   | TESTDB        | TESTSCHEMA  | TABLE |         | (ID,DATE)  | 0    | 0     | ACCOUNTADMIN | 1              |
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+

Die folgende Anweisung ändert die Reihenfolge des Gruppierungsschlüssels:

ALTER TABLE t1 CLUSTER BY (date, id);
Copy
SHOW TABLES LIKE 'T1';
Copy
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
           created_on            | name | database_name | schema_name | kind  | comment | cluster_by | rows | bytes |    owner     | retention_time |
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
 Tue, 21 Jun 2016 15:42:12 -0700 | T1   | TESTDB        | TESTSCHEMA  | TABLE |         | (DATE,ID)  | 0    | 0     | ACCOUNTADMIN | 1              |
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+

Hinzufügen und Entfernen von Zeilenzugriffsrichtlinien

Das folgende Beispiel fügt eine Zeilenzugriffsrichtlinie zu einer Tabelle unter Angabe einer einzelnen Spalte hinzu. Nach dem Einstellen der Richtlinie können Sie diese durch Überprüfen des Information Schema verifizieren.

alter table t1 add row access policy rap_t1 on (empl_id);
Copy

Das folgende Beispiel fügt eine Zeilenzugriffsrichtlinie unter Angabe von zwei Spalten in einer einzelnen Tabelle hinzu.

alter table t1
  add row access policy rap_test2 on (cost, item);
Copy

Im folgenden Beispiel wird eine Zeilenzugriffsrichtlinie aus einer Tabelle entfernt. Überprüfen Sie, ob die Richtlinien gelöscht wurden, indem Sie das Information Schema abfragen.

alter table t1 drop row access policy rap_v1;
Copy

Das folgende Beispiel zeigt, wie Sie das Hinzufügen und Löschen von Zeilenzugriffsrichtlinien in einer einzigen SQL-Anweisung für eine Tabelle kombinieren. Überprüfen Sie die Ergebnisse, indem Sie das Information Schema überprüfen.

alter table t1
  drop row access policy rap_t1_version_1,
  add row access policy rap_t1_version_2 on (empl_id);
Copy

Planen der Ausführung einer Datenmetrikfunktion

Stellen Sie den Zeitplan der Datenmetrikfunktion so ein, dass sie alle 5 Minuten ausgeführt wird:

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = '5 MINUTE';
Copy

Stellen Sie den Zeitplan der Datenmetrikfunktion so ein, dass sie täglich um 8:00 Uhr ausgeführt wird:

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = 'USING CRON 0 8 * * * UTC';
Copy

Stellen Sie den Zeitplan der Datenmetrikfunktion so ein, dass sie nur an Wochentagen um 8:00 Uhr ausgeführt wird:

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = 'USING CRON 0 8 * * MON,TUE,WED,THU,FRI UTC';
Copy

Stellen Sie den Zeitplan der Datenmetrikfunktion so ein, dass sie dreimal täglich um 0600, 1200 und 1800 UTC ausgeführt wird:

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = 'USING CRON 0 6,12,18 * * * UTC';
Copy

Stellen Sie die Datenmetrikfunktion so ein, dass sie ausgeführt wird, wenn eine allgemeine DML-Operation, wie z. B. das Einfügen einer neuen Zeile, die Tabelle verändert:

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = 'TRIGGER_ON_CHANGES';
Copy