Kategorien:

DDL für Datenbanken, Schemas und Freigaben, DDL für Tabellen, Ansichten und Sequenzen, DDL zum Laden/Entladen von Daten

CREATE <Objekt> … CLONE

Legt eine Kopie eines vorhandenen Objekts im System an. Dieser Befehl wird in erster Linie zum Erstellen der Nullkopie-Klone von Datenbanken, Schemas und nicht temporären Tabellen verwendet, kann aber auch zum schnellen/einfachen Erstellen von Klonen anderer Schemaobjekte (d. h. externer Stagingbereiche, Dateiformate und Sequenzen) verwendet werden.

Der Befehl ist eine Variation der objektspezifischen CREATE <Objekt>-Befehle mit dem zusätzlichen Schlüsselwort CLONE.

Bemerkung

Für Datenbanken, Schemas und Tabellen unterstützt CLONE eine zusätzliche AT | BEFORE-Klausel für das Klonen mit Time Travel.

Unter diesem Thema:

Syntax

Datenbanken, Schemata, Tabellen, Streams

CREATE [ OR REPLACE ] { DATABASE | SCHEMA | TABLE | STREAM } [ IF NOT EXISTS ] <object_name>
  CLONE <source_object_name>
        [ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) ]
  ...

Andere Schemaobjekte

CREATE [ OR REPLACE ] { STAGE | FILE FORMAT | SEQUENCE | TASK } [ IF NOT EXISTS ] <object_name>
  CLONE <source_object_name>
  ...

Allgemeine Nutzungshinweise

  • Ein Klon ist beschreibbar und unabhängig von seiner Quelle (d. h. Änderungen an der Quelle oder dem Klon werden nicht im anderen Objekt berücksichtigt).

  • Um einen Klon zu erstellen, muss Ihre aktuelle Rolle die folgenden Berechtigungen für das Quellobjekt haben:

    Tabellen

    SELECT

    Pipes, Streams, Aufgaben

    OWNERSHIP

    Andere Objekte

    USAGE

    Damit Ihre aktuelle Rolle eine Tabelle oder ein Schema klonen kann, muss sie über die erforderlichen Berechtigungen für die Containerobjekte von Quelle und Klon verfügen.

  • Bei Tabellen unterstützt Snowflake nur das Klonen permanenter und transienter Tabellen. Temporäre Tabellen können nicht geklont werden.

  • Für Datenbanken und Schemas ist das Klonen rekursiv:

    • Beim Klonen einer Datenbank werden alle in der Datenbank enthaltenen Schemata und anderen Objekte geklont.

    • Beim Klonen eines Schemas werden alle im Schema enthaltenen Objekte geklont.

    Die folgenden Objekttypen werden jedoch nicht geklont:

    • Externe Tabellen

    • Interne (d. h. Snowflake) Stagingbereiche

  • Bei Datenbanken, Schemas und Tabellen trägt ein Klon erst dann zum gesamten Datenspeicher für das Objekt bei, wenn Operationen am Klon durchgeführt werden, die bestehende Daten ändern oder neue Daten hinzufügen. Beispiel:

    • Hinzufügen, Löschen oder Ändern von Zeilen in einer geklonten Tabelle.

    • Erstellen einer neuen, ausgefüllten Tabelle in einem geklonten Schema.

  • Beim Klonen einer Tabelle werden die Struktur, die Daten und bestimmte andere Eigenschaften (z. B. STAGE FILE FORMAT) der Quelltabelle repliziert. Eine geklonte Tabelle enthält nicht den Ladeverlauf der Quelltabelle. Datendateien, die in eine Quelltabelle geladen wurden, können wieder in ihre Klone geladen werden.

  • Beim Klonen von Tabellen enthält die Befehlssyntax CREATE <Objekt> die Schlüsselwörter COPY GRANTS:

    • Wenn die Schlüsselwörter COPY GRANTS nicht in der CREATE <Objekt>-Anweisung enthalten sind, übernimmt das neue Objekt keine expliziten Zugriffsrechte der ursprünglichen Tabelle, aber alle zukünftigen Zuweisungen, die im Schema für den Objekttyp definiert sind (mit der Syntax GRANT <Berechtigungen> … TO ROLE … ON FUTURE).

    • Wenn die Option COPY GRANTS in der CREATE <Objekt>-Anweisung angegeben ist, behält das neue Objekt die Zugriffsrechte der ursprünglichen Tabelle bei, übernimmt aber keine zukünftigen Zuweisungen, die im Schema für den Objekttyp definiert sind.

Zusätzliche Regeln für das Klonen von Objekten

Metadaten

Ein Klon erbt die aktuelle Metadatendefinition des Quellobjekts zum Zeitpunkt der Erstellung des Klons. Die Definition beinhaltet den aktuellen Objektnamen, den Kommentar, andere Eigenschaften usw. Dies muss beachtet werden, wenn Sie Time Travel verwenden, um Tabellen, Schemata und Datenbanken zu einem Zeitpunkt in der Vergangenheit zu klonen. Wenn beispielsweise eine Tabelle geklont wird, weil Spalten in früheren Versionen der Tabelle umbenannt, hinzugefügt oder gelöscht wurden, erbt der Klon nicht die vorherigen Spaltenmetadaten, sondern die Metadaten zum Zeitpunkt der Ausführung der Klonanweisung.

Untergeordnete Objekte

Eine geklonte Datenbank oder ein geklontes Schema enthält alle Unterobjekte, die zum Zeitpunkt der Ausführung der Anweisung oder zum angegebenen Zeitpunkt/Punkt in der Vergangenheit aktiv waren. Ein Snapshot der Tabellendaten stellt den Status der Quelldaten beim Ausführen der Anweisung oder zum angegebenen Zeitpunkt/Punkt in der Vergangenheit dar. Untergeordnete Objekte erben die aktuellen Definitionen der untergeordneten Quellobjekte zum Zeitpunkt der Ausführung der Anweisung.

Nicht geklont

Durch das Klonen einer Datenbank oder eines Schemas werden keine Objekte der folgenden Typen in die Datenbank oder das Schema geklont:

  • Externe Tabellen

  • Interne (d. h. Snowflake) Stagingbereiche

Pipes

Eine geklonte Datenbank oder ein geklontes Schema enthält nur Pipeobjekte, die auf externe (Amazon S3, Google Cloud Storage oder Microsoft Azure) Stagingbereiche verweisen.

  • Bei AUTO_INGEST = FALSE wird eine geklonte Pipe standardmäßig angehalten.

  • Bei AUTO_INGEST = TRUE wird eine geklonte Pipe auf den Status STOPPED_CLONED gesetzt. In diesem Zustand sammeln Pipes keine Ereignisbenachrichtigungen, wenn Dateien im Stagingbereich bereitgestellt werden. Wenn eine Pipe explizit fortgesetzt wird, verarbeitet sie nur Datendateien, die aufgrund neuer Ereignisbenachrichtigungen ausgelöst wurden.

Eine geklonte Pipe in einem der beiden Zustände kann durch Ausführen des folgenden Befehls fortgesetzt werden:

Tabellendaten

Beim Klonen einer Datenbank, eines Schemas oder einer Tabelle wird ein Snapshot der Daten in jeder Tabelle erstellt und dem Klon zur Verfügung gestellt. Der Snapshot stellt den Status der Quelldaten entweder zum Zeitpunkt der Ausführung der Anweisung oder zum angegebenen Zeitpunkt in der Vergangenheit dar (mittels Time Travel).

Bemerkung

  • Für das Klonen gelten bestimmte Einschränkungen. Beispielsweise können DDL-Anweisungen, die das Quellobjekt während einer Klonierungsoperation betreffen, das Ergebnis verändern oder Fehler verursachen.

  • Das Klonen erfolgt nicht sofort, insbesondere bei großen Objekten (Datenbanken, Schemata, Tabellen), und sperrt das zu klonierende Objekt nicht. Daher spiegelt ein Klon keine DML-Anweisungen wider, die gegebenenfalls auf Tabellendaten angewendet werden, während die Klonierungsoperation noch ausgeführt wird.

Weitere Informationen zu diesem und anderen Anwendungsfällen, die sich auf das Klonen auswirken können, finden Sie unter Hinweise zum Klonen.

Hinweise zum Klonen mit Time Travel (nur Datenbanken, Schemas, Tabellen und Streams)

  • Die AT | BEFORE-Klausel klont eine Datenbank, ein Schema oder eine Tabelle ab einem bestimmten Zeitpunkt in der Vergangenheit oder auf Basis einer bestimmten SQL-Anweisung:

    • Das Schlüsselwort AT gibt an, dass die Anforderung alle Änderungen beinhaltet, die durch eine Anweisung oder Transaktion mit einem Zeitstempel gleich dem angegebenen Parameter vorgenommen werden.

    • Das Schlüsselwort BEFORE gibt an, dass sich die Anforderung auf einen Zeitpunkt unmittelbar vor dem angegebenen Parameter bezieht.

  • Das Klonen mit STATEMENT entspricht dem Verwenden von TIMESTAMP mit einem Wert, der der aufgezeichneten Ausführungszeit der SQL-Anweisung (oder ihrer umschließenden Transaktion) entspricht, wie sie durch die angegebene Anweisung-ID identifiziert wird.

  • In folgenden Fällen wird ein Fehler zurückgegeben:

    • Das zu klonende Objekt existierte nicht an der in der AT | BEFORE-Klausel angegebenen Stelle in der Vergangenheit.

    • Die historischen Daten, die zum Klonen des Objekts oder eines seiner Unterobjekte benötigt werden (z. B. Tabellen in geklonten Schemata oder Datenbanken), wurden bereinigt.

  • Wenn ein untergeordnetes Objekt in einer geklonten Datenbank oder einem geklonten Schema an der in der AT | BEFORE-Klausel angegebenen Stelle in der Vergangenheit nicht vorhanden war, wird das untergeordnete Objekt nicht geklont.

Weitere Informationen finden Sie unter Verstehen und Verwenden von Time Travel.

Beispiele

Klonen Sie eine Datenbank und alle Objekte innerhalb der Datenbank in ihrem aktuellen Status:

CREATE DATABASE mytestdb_clone CLONE mytestdb;

Klonen Sie ein Schema und alle Objekte innerhalb des Schemas in seinem aktuellen Status:

CREATE SCHEMA mytestschema_clone CLONE testschema;

Klonen Sie eine Tabelle in ihrem aktuellen Status:

CREATE TABLE orders_clone CLONE orders;

Klonen Sie ein Schema so, wie es vor dem Datum und der Uhrzeit im angegebenen Zeitstempel existierte:

CREATE SCHEMA mytestschema_clone_restore CLONE testschema BEFORE (TIMESTAMP => TO_TIMESTAMP(40*365*86400));

Klonen Sie eine Tabelle so, wie sie genau zum Datum und zur Uhrzeit des angegebenen Zeitstempels existierte:

CREATE TABLE orders_clone_restore CLONE orders AT (TIMESTAMP => TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'mm/dd/yyyy hh24:mi:ss'));

Klonen Sie eine Tabelle so, wie sie unmittelbar vor der Ausführung der angegebenen Anweisung existierte (d. h. Abfrage-ID):

CREATE TABLE orders_clone_restore CLONE orders BEFORE (STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726');