Catégories :

Base de données, schéma et partage DDL , Table, vue et séquence DDL , Chargement et déchargement des données DDL

CREATE <objet> … CLONE

Crée une copie d’un objet existant dans le système. Cette commande est principalement utilisée pour créer des clones à zéro copie de bases de données, de schémas et de tables ; cependant, elle peut également être utilisée pour créer rapidement et facilement des clones d’autres objets de schéma (c’est-à-dire des zones de préparation externes, des formats de fichiers et des séquences).

La commande est une variation des commandes spécifiques à l’objet CREATE <objet> avec l’ajout du mot clé CLONE.

Note

Pour les bases de données, les schémas et les tables (hors tables temporaires), CLONE prend en charge une clause AT | BEFORE supplémentaire pour le clonage en utilisant Time Travel.

Dans ce chapitre :

Syntaxe

Bases de données, schémas, tables, flux

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> } ) ]
  ...

Autres objets du schéma

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

Notes générales sur l’utilisation

  • Un clone est inscriptible et est indépendant de sa source (c’est-à-dire que les modifications apportées à la source ou au clone ne se reflètent pas dans l’autre objet).

  • Pour créer un clone, votre rôle actuel doit avoir les privilèges suivants sur l’objet source :

    Tables

    SELECT

    Canaux, flux, tâches

    OWNERSHIP

    Autres objets

    USAGE

    En outre, pour cloner un schéma ou un objet au sein d’un schéma, votre rôle actuel doit avoir les privilèges requis sur les objets du conteneur pour la source et le clone.

  • Pour les bases de données et les schémas, le clonage est récursif :

    • Le clonage d’une base de données clone tous les schémas et autres objets dans la base de données.

    • Le clonage d’un schéma clone tous les objets contenus dans le schéma.

    Cependant, les types d’objets suivants ne sont pas clonés :

    • Tables externes

    • Zones de préparation internes (c.-à-d. Snowflake)

  • Pour les bases de données, les schémas et les tables, un clone ne contribue pas au stockage global des données de l’objet jusqu’à ce que des opérations soient effectuées sur le clone qui modifient les données existantes ou ajoutent de nouvelles données, telles que :

    • Ajouter, supprimer ou modifier des lignes dans une table clonée.

    • Créer une nouvelle table remplie dans un schéma cloné.

  • Le clonage d’une table reproduit la structure, les données et certaines autres propriétés (par exemple STAGE FILE FORMAT) de la table source. Une table clonée n’inclut pas l’historique de chargement de la table source. Les fichiers de données qui ont été chargés dans une table source peuvent être à nouveau chargés dans ses clones.

  • La syntaxe CREATE TABLE … CLONE comprend les mots-clés COPY GRANTS, qui affectent un nouveau clone de table comme suit :

    • Si les mots-clés COPY GRANTS sont utilisés, alors le nouvel objet hérite des privilèges d’accès explicites accordés sur la table d’origine, mais n’hérite pas des autorisations futures définies pour le type d’objet dans le schéma.

    • Si les mots-clés COPY GRANTS ne sont pas utilisés, alors le nouveau clone d’objet n’hérite pas des privilèges d’accès explicites accordés sur la table d’origine, mais hérite des autorisations futures définies pour le type d’objet dans le schéma (en utilisant la syntaxe GRANT <privileges> … TO ROLE … ON FUTURE).

Règles supplémentaires qui s’appliquent aux objets clonés

Métadonnées

Un clone d’objet hérite de la structure et du nom de l’objet source actuel au moment de l’exécution de l’instruction CREATE <objet> CLONE ou à l’heure/au point spécifié dans le passé à l’aide de Time Travel. Un clone d’objet hérite de toutes les autres métadonnées, telles que les commentaires ou les clés de clustering de table, qui sont actuels dans l’objet source au moment de l’exécution de l’instruction, que l’on utilise ou non Time Travel.

Objets enfants

Une base de données ou un schéma clone comprend tous les objets enfants actifs au moment de l’exécution de l’instruction ou à l’heure/au point spécifié dans le passé. Un instantané des données de la table représente l’état des données sources lorsque l’instruction est exécutée ou à l’heure/au point spécifié dans le passé. Les objets enfants héritent du nom et de la structure des objets enfants sources au moment de l’exécution de l’instruction.

Non cloné

Le clonage d’une base de données ou d’un schéma ne clone pas d’objets des types suivants dans la base de données ou le schéma :

  • Tables externes

  • Zones de préparation internes (c.-à-d. Snowflake)

Canaux

Une base de données ou un schéma clone incluent uniquement des objets de canal faisant référence à des zones de préparation externes (Amazon S3, Google Cloud Storage ou Microsoft Azure) ; les canaux internes (Snowflake) ne sont pas clonés.

L’état par défaut d’un clone de canal est le suivant :

  • Lorsque AUTO_INGEST = FALSE, un canal cloné est suspendu par défaut.

  • Lorsque AUTO_INGEST = TRUE, un canal cloné est défini sur l’état STOPPED_CLONED. Dans cet état, les canaux n’accumulent pas de notifications d’événements à la suite de nouveaux fichiers mis en zone de préparation. Lorsqu’un canal est explicitement repris, il ne traite que les fichiers de données déclenchés à la suite de nouvelles notifications d’événements.

Un canal clone dans l’un ou l’autre état peut être repris en exécutant une instruction ALTER PIPE … RESUME.

Données de table

Lors du clonage d’une base de données, d’un schéma ou d’une table, un instantané des données de chaque table est pris et mis à la disposition du clone. L’instantané représente l’état des données sources au moment de l’exécution de l’instruction ou à l’heure/au point spécifié dans le passé (à l’aide de la fonction Time Travel).

Références de l’objet

Les objets tels que les vues, les flux et les tâches incluent des références d’objets dans leur définition. Par exemple, une vue contient une requête stockée qui comprend des références de table. Un flux pointe vers une table source. Une tâche appelle une procédure stockée ou exécute une instruction SQL qui fait référence à d’autres objets. Et ainsi de suite.

Lorsqu’un de ces objets est cloné, soit dans une base de données ou un schéma cloné, soit en tant qu’objet individuel, pour les types d’objets qui prennent en charge le clonage, le clone hérite des références aux autres objets de la définition de l’objet source. Par exemple, un clone d’une vue hérite de la requête stockée de la vue source, y compris les références de la table dans la requête.

Soyez attentif à ce que les noms d’objets dans la définition d’un objet source soient entièrement ou partiellement qualifiés. Un nom pleinement qualifié comprend les noms de la base de données et des schémas. Tout clone de l’objet source inclut ces parties dans sa propre définition.

Par exemple :

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

Si vous avez l’intention de pointer une vue vers des tables portant le même nom dans d’autres bases de données ou schémas, nous vous suggérons de créer une nouvelle vue plutôt que de cloner une vue existante. Cette orientation concerne également les autres objets qui font référence à des objets dans leur définition.

Note

  • Certaines limitations s’appliquent aux opérations de clonage. Par exemple, les instructions DDL qui affectent l’objet source pendant une opération de clonage peuvent modifier le résultat ou provoquer des erreurs.

  • Le clonage n’est pas instantané, en particulier pour les gros objets (bases de données, schémas, tables), et ne verrouille pas l’objet à cloner. Ainsi, un clone ne reflète pas les instructions DML appliquées aux données de la table, le cas échéant, pendant que l’opération de clonage est toujours en cours.

Pour plus d’informations sur ce cas d’utilisation et d’autres qui pourraient affecter vos opérations de clonage, voir Remarques relatives au clonage.

Notes pour le clonage avec Time Travel (bases de données, schémas, tables et flux uniquement)

  • La clause AT | BEFORE clone une base de données, un schéma, une table ou un flux à partir d’une date spécifiée dans le passé ou sur la base d’une instruction SQL spécifiée :

    • Le mot clé AT spécifie que la requête inclut tous les changements apportés par une instruction ou une transaction dont l’horodatage est égal au paramètre spécifié.

    • Le mot clé BEFORE spécifie que la requête se réfère à un point précédant immédiatement le paramètre spécifié.

  • Cloner en utilisant STATEMENT équivaut à utiliser TIMESTAMP avec une valeur égale au temps d’exécution enregistré de l’instruction SQL (ou de la transaction qui l’accompagne), identifiée par l’ID de l’instruction spécifiée.

  • Une erreur est renvoyée si :

    • L’objet cloné n’existait pas au moment précisé dans la clause AT | BEFORE.

    • Les données historiques nécessaires au clonage de l’objet ou de l’un de ses objets enfants (par exemple, les tables dans les schémas ou bases de données clonés) ont été supprimées.

  • Si un objet enfant d’une base de données ou d’un schéma cloné n’existait pas au moment spécifié dans la clause AT | BEFORE, l’objet enfant n’est pas cloné.

Pour plus d’informations, voir Comprendre et utiliser la fonction « Time Travel ».

Exemples

Cloner une base de données et tous les objets de la base de données dans son état actuel :

CREATE DATABASE mytestdb_clone CLONE mytestdb;

Cloner un schéma et tous les objets du schéma dans son état actuel :

CREATE SCHEMA mytestschema_clone CLONE testschema;

Cloner une table dans son état actuel :

CREATE TABLE orders_clone CLONE orders;

Cloner un schéma tel qu’il existait avant la date et l’heure dans l’horodatage spécifié :

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

Cloner une table telle qu’elle existait exactement à la date et à l’heure de l’horodatage spécifié :

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

Cloner une table telle qu’elle existait immédiatement avant l’exécution de l’instruction spécifiée (c’est-à-dire l’ID de requête) :

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