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 von Nullkopie-Klonen von Datenbanken, Schemas und 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 permanente 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.

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

  • Die CREATE TABLE … CLONE-Syntax enthält die COPY GRANTS-Schlüsselwörter, die sich wie folgt auf einen neuen Tabellenklon auswirken:

    • Wenn die COPY GRANTS-Schlüsselwörter nicht verwendet werden, übernimmt der neue Objektklon alle expliziten Zugriffsrechte der ursprünglichen Tabelle, aber erbt keine zukünftigen Zuweisungen, die im Schema für den Objekttyp definiert sind.

    • Wenn die COPY GRANTS-Schlüsselwörter nicht verwendet werden, übernimmt der neue Objektklon 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).

Zusätzliche Regeln für das Klonen von Objekten

Metadaten

Ein Objektklon erbt den Namen und die Struktur des Quellobjekts, das zum Zeitpunkt der Ausführung der CREATE <Objekt> CLONE-Anweisung oder zu einem angegebenen Time Travel-Zeitpunkt in der Vergangenheit aktuell war. Ein Objektklon erbt alle anderen Metadaten, wie z. B. Kommentare oder Tabellen-Gruppierungsschlüssel, die zum Zeitpunkt der Ausführung der Anweisung im Quellobjekt aktuell sind, unabhängig davon, ob Time Travel verwendet wird.

Untergeordnete Objekte

Ein Datenbank- oder Schemaklon 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 in der Vergangenheit dar. Untergeordnete Objekte erben Name und Struktur 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

Ein Datenbank- oder Schemaklon enthält nur Pipeobjekte, die auf externe (Amazon S3, Google Cloud Storage oder Microsoft Azure) Stagingbereiche verweisen. Interne (Snowflake) Pipes werden nicht geklont.

Der Standardstatus eines Pipeklons ist wie folgt:

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

Ein Pipeklon in einem der beiden Zustände kann durch Ausführen einer ALTER PIPE … RESUME-Anweisung 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).

Objektreferenzen

Objekte wie Ansichten, Streams und Aufgaben enthalten in ihrer Definition Objektreferenzen. Beispielsweise enthält eine Ansicht eine gespeicherte Abfrage, die Tabellenreferenzen enthält. Ein Stream zeigt auf eine Quelltabelle. Eine Task ruft eine gespeicherte Prozedur auf oder führt eine SQL-Anweisung aus, die auf andere Objekte verweist. Und so weiter.

Wenn eines dieser Objekte geklont wird, entweder in einer geklonten Datenbank oder einem geklonten Schema oder als einzelnes Objekt für diejenigen Objekttypen, die das Klonen unterstützen, erbt der Klon Referenzen auf andere Objekte aus der Definition des Quellobjekts. Beispielsweise erbt der Klon einer Ansicht die gespeicherte Abfrage von der Quellansicht, einschließlich der Tabellenreferenzen in der Abfrage.

Achten Sie genau darauf, ob die Objektnamen in der Definition eines Quellobjekts vollständig oder teilweise qualifiziert sind. Ein vollqualifizierter Name umfasst den Datenbank- und den Schemanamen. Jeder Klon des Quellobjekts enthält diese Teile in seine eigene Definition.

Beispiel:

-- Create a schema to serve as the source for a cloned schema.
CREATE SCHEMA source;

-- Create a table.
CREATE TABLE mytable (col1 string, col2 string);

-- Create a view that references the table with a fully-qualified name.
CREATE VIEW myview AS SELECT col1 FROM source.mytable;

-- Retrieve the DDL for the source schema.
SELECT GET_DDL ('schema', 'source', true);

+--------------------------------------------------------------------------+
| GET_DDL ('SCHEMA', 'SOURCE', TRUE)                                       |
|--------------------------------------------------------------------------|
| create or replace schema MPETERS_DB.SOURCE;                              |
|                                                                          |
| create or replace TABLE MPETERS_DB.SOURCE.MYTABLE (                      |
|   COL1 VARCHAR(16777216),                                                                                                                                                     |
|   COL2 VARCHAR(16777216)                                                                                                                                                     |
| );                                                                       |
|                                                                          |
| CREATE VIEW MPETERS_DB.SOURCE.MYVIEW AS SELECT col1 FROM source.mytable; |
|                                                                          |
+--------------------------------------------------------------------------+

-- Clone the source schema.
CREATE SCHEMA source_clone CLONE source;

-- Retrieve the DDL for the clone of the source schema.
-- The clone of the view references the source table with the same fully-qualified name
-- as in the view in the source schema.
SELECT GET_DDL ('schema', 'source_clone', true);

+--------------------------------------------------------------------------------+
| GET_DDL ('SCHEMA', 'SOURCE_CLONE', TRUE)                                       |
|--------------------------------------------------------------------------------|
| create or replace schema MPETERS_DB.SOURCE_CLONE;                              |
|                                                                                |
| create or replace TABLE MPETERS_DB.SOURCE_CLONE.MYTABLE (                      |
|   COL1 VARCHAR(16777216),                                                                                                                                                   |
|   COL2 VARCHAR(16777216)                                                                                                                                                   |
| );                                                                             |
|                                                                                |
| CREATE VIEW MPETERS_DB.SOURCE_CLONE.MYVIEW AS SELECT col1 FROM source.mytable; |
|                                                                                |
+--------------------------------------------------------------------------------+

Wenn Sie beabsichtigen, auf eine Ansicht auf gleichnamige Tabellen in anderen Datenbanken oder Schemas zu verweisen, schlagen wir vor, eine neue Ansicht zu erstellen, anstatt eine bestehende Ansicht zu klonen. Diese Anleitung bezieht sich auch auf andere Objekte, die in ihrer Definition auf Objekte verweisen.

Bemerkung

  • Für die Klonoperation 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');