CREATE DYNAMIC TABLE

Crée une table dynamique, sur la base d’une requête spécifiée.

Voir aussi :

ALTER DYNAMIC TABLE, DESCRIBE DYNAMIC TABLE, DROP DYNAMIC TABLE , SHOW DYNAMIC TABLES

Dans ce chapitre :

Syntaxe

CREATE [ OR REPLACE ] DYNAMIC TABLE [ IF NOT EXISTS ] <name> (
    -- Column definition
    <col_name> <col_type>
      [ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col_name> , <cond_col1> , ... ) ] ]
      [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
      [ COMMENT '<string_literal>' ]

    -- Additional column definitions
    [ , <col_name> <col_type> [ ... ] ]

  )
  TARGET_LAG = { '<num> { seconds | minutes | hours | days }' | DOWNSTREAM }
  REFRESH_MODE = { AUTO | FULL | INCREMENTAL }
  INITIALIZE = { ON_CREATE | ON_SCHEDULE }
  WAREHOUSE = <warehouse_name>
  [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
  [ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
  [ COMMENT = '<string_literal>' ]
  [ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
  AS <query>
Copy

Syntaxe des variantes

CREATE DYNAMIC TABLE … CLONE

Crée une nouvelle table dynamique avec les mêmes définitions de colonnes et contenant toutes les données existantes de la table dynamique source, sans réellement copier les données. Cette variante peut également être utilisée pour cloner une table dynamique à un moment précis dans le passé. Voir Remarques relatives au clonage.

CREATE [ OR REPLACE ] DYNAMIC TABLE <name>
  CLONE <source_dynamic_table>
        [ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) ]
  [
    COPY GRANTS
    TARGET_LAG = { '<num> { seconds | minutes | hours | days }' | DOWNSTREAM }
    WAREHOUSE = <warehouse_name>
  ]
Copy

Pour plus de détails sur le clonage, voir CREATE <objet> … CLONE.

Paramètres requis

name

Indique l’identificateur (c’est-à-dire le nom) de la table dynamique ; doit être unique pour le schéma dans lequel la table dynamique est créée.

De plus, l’identificateur doit commencer par un caractère alphabétique et ne peut pas contenir d’espaces ou de caractères spéciaux à moins que toute la chaîne d’identificateur soit délimitée par des guillemets doubles (p. ex. "My object"). Les identificateurs entre guillemets doubles sont également sensibles à la casse.

Pour plus de détails, voir Exigences relatives à l’identificateur.

TARGET_LAG = { num { seconds | minutes | hours | days } | DOWNSTREAM }

Spécifie le décalage de la table dynamique :

'num seconds | minutes | hours | days'

Spécifie le délai maximum pendant lequel le contenu de la table dynamique doit être décalé par rapport aux mises à jour des tables de base.

Par exemple :

  • Si les données de la table dynamique ne doivent pas être décalées de plus de 5 minutes, indiquez 5 minutes.

  • Si les données de la table dynamique ne doivent pas être décalées de plus de 5 heures, indiquez 5 hours.

La valeur minimale est de 1 minute. Si la table dynamique A dépend d’une autre table dynamique B, le décalage minimum pour A doit être supérieur ou égal au décalage pour B.

DOWNSTREAM

Spécifie que la table dynamique ne doit être actualisée que lorsque les tables dynamiques qui en dépendent sont actualisées.

REFRESH_MODE = { AUTO | FULL | INCREMENTAL }

Spécifie le type d’actualisation pour la table dynamique. Cette propriété ne peut pas être modifiée après la création de la table dynamique. Pour modifier la propriété, répliquez la table dynamique avec une commande CREATE OR REPLACE DYNAMIC TABLE.

AUTO

Par défaut, la table dynamique est actualisée de manière incrémentielle. Si l’instruction CREATE DYNAMIC TABLE ne prend pas en charge le mode d’actualisation incrémentiel, la table dynamique est automatiquement créée avec le mode d’actualisation complet.

Vous pouvez vérifier le mode d’actualisation à l’aide de l’instruction SHOW DYNAMIC TABLES. La colonne refresh_mode indique le mode d’actualisation utilisé, tandis que la colonne text indique le mode d’actualisation spécifié par l’utilisateur.

FULL

Impose une actualisation complète de la table dynamique, même si celle-ci peut être actualisée de manière incrémentielle.

INCREMENTAL

Permet une actualisation incrémentielle de la table dynamique. Si la requête qui sous-tend la table dynamique ne peut pas effectuer une actualisation incrémentielle, la création de la table dynamique échoue et affiche un message d’erreur.

Par défaut : AUTO

INITIALIZE

Spécifie le comportement de l’actualisation initiale de la table dynamique. Cette propriété ne peut pas être modifiée après la création de la table dynamique. Pour modifier la propriété, remplacez la table dynamique avec une commande CREATE OR REPLACE DYNAMIC TABLE.

ON_CREATE

Actualise la table dynamique de manière synchrone lors de sa création. Si cette actualisation échoue, la création de la table dynamique échoue et affiche un message d’erreur.

ON_SCHEDULE

Actualise la table dynamique lors de la prochaine actualisation planifiée.

La table dynamique est alimentée lors de l’exécution du processus de planification de l’actualisation. Aucune donnée n’est ajoutée lors de la création de la table dynamique. Si vous essayez d’interroger la table en utilisant SELECT * FROM DYNAMIC TABLE, vous risquez d’obtenir l’erreur suivante, car la première actualisation planifiée n’a pas encore eu lieu.

Dynamic Table is not initialized. Please run a manual refresh or wait for a scheduled refresh before querying.

Par défaut : ON_CREATE

WAREHOUSE = warehouse_name

Spécifie le nom de l’entrepôt qui fournit les ressources de calcul pour l’actualisation de la table dynamique.

Vous devez disposer du privilège USAGE sur cet entrepôt pour pouvoir créer la table dynamique.

AS query

Spécifie la requête dont les résultats doivent être contenus dans la table dynamique.

Paramètres facultatifs

COMMENT 'string_literal'

Spécifie un commentaire pour la colonne.

(Notez que les commentaires peuvent être spécifiés au niveau de la colonne ou de la table. La syntaxe de chacun est légèrement différente).

MASKING POLICY = policy_name

Spécifie la politique de masquage à définir sur une colonne.

column_list

Si vous voulez modifier le nom d’une colonne ou ajouter un commentaire à une colonne dans la table dynamique, incluez une liste de colonnes qui spécifie les noms des colonnes et, le cas échéant, les commentaires sur les colonnes. Vous n’avez pas besoin de spécifier les types de données des colonnes.

Si l’une des colonnes de la table dynamique est basée sur des expressions (pas seulement des noms de colonnes simples, par exemple), vous devez fournir un nom de colonne pour chaque colonne de la table dynamique. Par exemple, les noms de colonnes sont obligatoires dans le cas suivant :

CREATE DYNAMIC TABLE product (pre_tax_profit, taxes, after_tax_profit)
  TARGET_LAG = '20 minutes'
    WAREHOUSE = mywh
    AS
      SELECT revenue - cost, (revenue - cost) * tax_rate, (revenue - cost) * (1.0 - tax_rate)
      FROM staging_table;
Copy

Vous pouvez spécifier un commentaire facultatif pour chaque colonne. Par exemple :

CREATE DYNAMIC TABLE product (pre_tax_profit COMMENT 'revenue minus cost',
                taxes COMMENT 'assumes taxes are a fixed percentage of profit',
                after_tax_profit)
  TARGET_LAG = '20 minutes'
    WAREHOUSE = mywh
    AS
      SELECT revenue - cost, (revenue - cost) * tax_rate, (revenue - cost) * (1.0 - tax_rate)
      FROM staging_table;
Copy
DATA_RETENTION_TIME_IN_DAYS = integer

Spécifie la période de conservation de la table dynamique pour que les actions Time Travel (SELECT, CLONE) puissent être effectuées sur les données historiques de la table dynamique. Time Travel se comporte de la même manière pour les tables dynamiques que pour les tables traditionnelles. Pour plus de détails, voir Comprendre et utiliser la fonction « Time Travel ».

Pour une description détaillée de ce paramètre de niveau objet, ainsi que plus d’informations sur les paramètres d’objet, voir Paramètres.

Valeurs :

  • Édition Standard : 0 ou 1

  • Édition Enterprise :

    • 0 à 90 pour les tables permanentes

    • 0 ou 1 pour les tables temporaires et transitoires

Par défaut :

  • Édition Standard : 1

  • Édition Enterprise (ou supérieure) : 1 (sauf si une valeur par défaut différente a été spécifiée au niveau du compte, du schéma ou de la base de données)

Note

Une valeur de 0 désactive effectivement Time Travel pour la table.

MAX_DATA_EXTENSION_TIME_IN_DAYS = integer

Paramètre d’objet qui spécifie le nombre maximum de jours pendant lesquels Snowflake peut prolonger la période de conservation des données de la table dynamique, afin d’éviter que les flux sur la table dynamique ne deviennent obsolètes.

Pour une description détaillée de ce paramètre, voir MAX_DATA_EXTENSION_TIME_IN_DAYS.

COMMENT = 'string_literal'

Spécifie un commentaire pour la table dynamique.

(Notez que les commentaires peuvent être spécifiés au niveau de la colonne ou de la table. La syntaxe de chacun est légèrement différente).

Par défaut : aucune valeur.

COPY GRANTS

Spécifie de conserver les privilèges d’accès de la table dynamique d’origine lorsqu’une nouvelle table dynamique est créée à l’aide de la variante CREATE DYNAMIC TABLE … CLONE.

Ce paramètre copie tous les privilèges, excepté OWNERSHIP, de la table dynamique existante vers la nouvelle table dynamique. La nouvelle table dynamique n’hérite pas des attributions futures définies pour le type d’objet dans le schéma. Par défaut, le rôle qui exécute l’instruction CREATE DYNAMICTABLE possède la nouvelle table dynamique.

Si ce paramètre n’est pas inclus dans l’instruction CREATE DYNAMIC TABLE, la nouvelle table n’hérite pas des privilèges d’accès explicites accordés sur la table dynamique d’origine, mais des attributions futures définies pour le type d’objet dans le schéma.

Remarque :

  • Avec le partage des données :

    • Si la table dynamique existante a été partagée avec un autre compte, la table dynamique de remplacement est également partagée.

    • Si la table dynamique existante a été partagée avec votre compte en tant que consommateur de données et que l’accès a été accordé à d’autres rôles dans le compte (en utilisant GRANT IMPORTED PRIVILEGES sur la base de données mère), l’accès est également accordé à la table dynamique de remplacement.

  • La sortie SHOW GRANTS pour la table dynamique de remplacement liste le concessionnaire des privilèges copiés comme le rôle qui a exécuté l’instruction CREATE TABLE avec l’horodatage courant lorsque l’instruction a été exécutée.

  • La sortie SHOW GRANTS pour la table dynamique de remplacement liste le concessionnaire des privilèges copiés comme le rôle qui a exécuté l’instruction CREATE TABLE avec l’horodatage courant lorsque l’instruction a été exécutée.

  • L’opération de copie des accords s’effectue atomiquement dans la commande CREATE DYNAMIC TABLE (c’est-à-dire dans la même transaction).

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

Spécifie la politique d’accès aux lignes à définir sur une table dynamique.

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

Spécifie le nom de la balise et la valeur de la chaîne de la balise.

La valeur de la balise est toujours une chaîne de caractères et le nombre maximum de caractères pour la valeur de la balise est 256.

Pour plus d’informations sur la spécification des balises dans une instruction, voir Quotas de balises pour les objets et les colonnes.

Exigences en matière de contrôle d’accès

Un rôle utilisé pour exécuter cette commande SQL doit avoir les privilèges suivants définis au minimum ainsi :

Privilège

Objet

Remarques

CREATE DYNAMIC TABLE

Schéma dans lequel vous prévoyez de créer la table dynamique.

SELECT

Tables, vues et tables dynamiques que vous prévoyez d’interroger pour la nouvelle table dynamique.

USAGE

Entrepôt que vous prévoyez d’utiliser pour actualiser la table.

Notez que l’exploitation d’un objet dans un schéma requiert également le privilège USAGE sur la base de données et le schéma parents.

Pour obtenir des instructions sur la création d’un rôle personnalisé avec un ensemble spécifique de privilèges, voir Création de rôles personnalisés.

Pour des informations générales sur les rôles et les privilèges accordés pour effectuer des actions SQL sur des objets sécurisables, voir Aperçu du contrôle d’accès.

Notes sur l’utilisation

  • Lorsque vous exécutez la commande CREATE DYNAMIC TABLE, le rôle en cours d’utilisation devient propriétaire de la table dynamique. Ce rôle est utilisé pour effectuer des actualisations de la table dynamique en arrière-plan.

  • Vous ne pouvez pas modifier le schéma après avoir créé une table dynamique.

  • Les tables dynamiques sont mises à jour lorsque les objets de la base de données sous-jacente changent. Le suivi des modifications doit être activé pour tous les objets sous-jacents utilisés par une table dynamique. Voir Activer le suivi des modifications.

  • Si vous souhaitez remplacer une table dynamique existant et que vous avez besoin de voir sa définition actuelle, appelez la fonction GET_DDL.

  • Certaines expressions, clauses et fonctions ne sont actuellement pas prises en charge dans les tables dynamiques. Pour une liste complète, voir Limitations connues relatives aux tables dynamiques.

  • Les clients doivent s’assurer qu’aucune donnée personnelle (autre que pour un objet utilisateur), donnée sensible, donnée à exportation contrôlée ou autre donnée réglementée n’est saisie comme métadonnée lors de l’utilisation du service Snowflake. Pour plus d’informations, voir Champs de métadonnées dans Snowflake.

Exemples

Créez une table dynamique nommée product :

CREATE OR REPLACE DYNAMIC TABLE product
 TARGET_LAG = '20 minutes'
  WAREHOUSE = mywh
  AS
    SELECT product_id, product_name FROM staging_table;
Copy

Dans l’exemple ci-dessus :

  • La table dynamique matérialise les résultats d’une requête sur les colonnes product_id et product_name de la table staging_table.

  • Le temps de latence cible est de 20 minutes, ce qui signifie que les données de la table dynamique ne devraient idéalement pas être antérieures de plus de 20 minutes à celles de la staging_table.

  • Le processus d’actualisation automatisé utilise les ressources informatiques de l’entrepôt mywh pour actualiser les données de la table dynamique.

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

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