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 (hors tables temporaires) ; 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 tables, Snowflake ne prend en charge que le clonage des tables permanentes et transitoires. Les tables temporaires ne peuvent pas être clonées.

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

  • Lorsque vous clonez des tables, la syntaxe de la commande CREATE <objet> inclut les mots-clés COPY GRANTS :

    • Si les mots-clés COPY GRANTS ne sont pas inclus dans l’instruction CREATE <objet>, le nouvel 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)

    • Si l’option COPY GRANTS est spécifiée dans l’instruction CREATE <objet>, le nouvel objet conserve les privilèges d’accès explicites de la table d’origine et n’hérite pas des autorisations futures définies pour le type d’objet dans le schéma.

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

Métadonnées

Un clone hérite de la définition de métadonnées actuelle de l’objet source au moment où le clone est créé. La définition inclut le nom de l’objet courant, le commentaire, les autres propriétés, etc. Ceci est important à noter lorsque vous utilisez Time Travel pour cloner des tables, des schémas et des bases de données à un moment donné dans le passé. Par exemple, lorsqu’une table est clonée, si des colonnes ont été renommées, ajoutées ou détruites dans des versions antérieures de la table, le clone hérite des métadonnées de la colonne au moment où l’instruction de clonage est exécutée, plutôt que des métadonnées précédentes.

Objets enfants

Une base de données ou un schéma cloné 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/point spécifié dans le passé. Les objets enfants héritent des définitions actuelles 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 cloné 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.

  • 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 cloné dans l’un ou l’autre état peut être repris en exécutant la commande suivante :

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

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');