CREATE DYNAMIC TABLE

Cria uma tabela dinâmica, com base em uma consulta especificada.

Consulte também:

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

Neste tópico:

Sintaxe

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

Sintaxe da variante

CREATE DYNAMIC TABLE … CLONE

Cria uma nova tabela dinâmica com as mesmas definições de coluna e contendo todos os dados existentes da tabela dinâmica de origem, sem realmente copiar os dados. Esta variante também pode ser usada para clonar uma tabela dinâmica em um ponto específico no passado. Consulte Considerações sobre clonagem.

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

Para obter mais detalhes sobre clonagem, consulte CREATE <objeto> … CLONE.

Parâmetros obrigatórios

name

Especifica o identificador (ou seja, nome) da tabela dinâmica; deve ser único para o esquema no qual a tabela dinâmica é criada.

Além disso, o identificador deve começar com um caractere alfabético e não pode conter espaços ou caracteres especiais, a menos que toda a cadeia de caracteres do identificador esteja entre aspas duplas (por exemplo, "My object"). Os identificadores delimitados por aspas duplas também diferenciam letras maiúsculas de minúsculas.

Para obter mais detalhes, consulte Requisitos para identificadores.

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

Especifica o atraso para a tabela dinâmica:

'num seconds | minutes | hours | days'

Especifica a quantidade máxima de tempo que o conteúdo da tabela dinâmica deve atrasar as atualizações nas tabelas de base.

Por exemplo:

  • Se os dados na tabela dinâmica não demorarem mais de 5 minutos, especifique 5 minutes.

  • Se os dados na tabela dinâmica não demorarem mais de 5 horas, especifique 5 hours.

O valor mínimo é de 1 minuto. Se a tabela dinâmica A depender de outra tabela dinâmica B, o atraso mínimo de A deverá ser maior ou igual ao atraso de B.

DOWNSTREAM

Especifica que a tabela dinâmica deve ser atualizada somente quando as tabelas dinâmicas que dependem dela forem atualizadas.

REFRESH_MODE = { AUTO | FULL | INCREMENTAL }

Especifica o tipo de atualização para a tabela dinâmica. Esta propriedade não pode ser alterada após a criação da tabela dinâmica. Para modificar a propriedade, replique a tabela dinâmica com um comando CREATE OR REPLACE DYNAMIC TABLE.

AUTO

Impõe uma atualização incremental da tabela dinâmica por padrão. Se a instrução CREATE DYNAMIC TABLE não oferecer suporte ao modo de atualização incremental, a tabela dinâmica será criada automaticamente com o modo de atualização completa.

Você pode verificar o modo de atualização usando a instrução SHOW DYNAMIC TABLES. A coluna refresh_mode mostra o modo de atualização em uso, enquanto a coluna text mostra o modo de atualização especificado pelo usuário.

FULL

Impõe uma atualização completa da tabela dinâmica, mesmo que a tabela dinâmica possa ser atualizada de forma incremental.

INCREMENTAL

Impõe uma atualização incremental da tabela dinâmica. Se a consulta subjacente à tabela dinâmica não puder executar uma atualização incremental, a criação da tabela dinâmica falhará e exibirá uma mensagem de erro.

Padrão: AUTO

INITIALIZE

Especifica o comportamento da atualização inicial da tabela dinâmica. Esta propriedade não pode ser alterada após a criação da tabela dinâmica. Para modificar a propriedade, substitua a tabela dinâmica com um comando CREATE OR REPLACE DYNAMIC TABLE.

ON_CREATE

Atualiza a tabela dinâmica de forma síncrona na criação. Se esta atualização falhar, a criação da tabela dinâmica falhará e exibirá uma mensagem de erro.

ON_SCHEDULE

Atualiza a tabela dinâmica na próxima atualização agendada.

A tabela dinâmica é preenchida quando o processo de agendamento de atualização é executado. Nenhum dado é preenchido quando a tabela dinâmica é criada. Se você tentar consultar a tabela usando SELECT * FROM DYNAMIC TABLE, poderá ver o seguinte erro porque a primeira atualização agendada ainda não ocorreu.

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

Padrão: ON_CREATE

WAREHOUSE = warehouse_name

Especifica o nome do warehouse que fornece os recursos de computação para atualizar a tabela dinâmica.

Você deve ter o privilégio USAGE neste warehouse para criar a tabela dinâmica.

AS query

Especifica a consulta cujos resultados devem estar contidos na tabela dinâmica.

Parâmetros opcionais

COMMENT 'string_literal'

Especifica um comentário para a coluna.

(Observe que os comentários podem ser especificados no nível da coluna ou da tabela. A sintaxe de cada um é um pouco diferente).

MASKING POLICY = policy_name

Especifica a política de mascaramento a ser definida em uma coluna.

column_list

Se você quiser mudar o nome de uma coluna ou adicionar um comentário a uma coluna na tabela dinâmica, inclua uma lista de colunas que especifique os nomes das colunas e, se necessário, comentários sobre as colunas. Você não precisa especificar os tipos de dados das colunas.

Se qualquer uma das colunas na tabela dinâmica for baseada em expressões, por exemplo, não apenas em nomes simples de colunas, então você deverá fornecer um nome de coluna para cada coluna na tabela dinâmica. Por exemplo, os nomes das colunas são necessários no caso a seguir:

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

Você pode especificar um comentário opcional para cada coluna. Por exemplo:

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

Especifica o período de retenção da tabela dinâmica para que as ações do Time Travel (SELECT, CLONE) possam ser executadas nos dados históricos na tabela dinâmica. O Time Travel se comporta de forma idêntica para tabelas dinâmicas e tabelas tradicionais. Para obter mais detalhes, consulte Compreensão e uso do Time Travel.

Para uma descrição detalhada deste parâmetro de nível de objeto, bem como mais informações sobre parâmetros de objeto, consulte Parâmetros.

Valores:

  • Standard Edition: 0 ou 1

  • Enterprise Edition:

    • 0 a 90 para tabelas permanentes

    • 0 ou 1 para tabelas temporárias e transitórias

Padrão:

  • Standard Edition: 1

  • Enterprise Edition (ou superior): 1 (a menos que um valor padrão diferente tenha sido especificado no esquema, banco de dados ou nível de conta)

Nota

Um valor de 0 desabilita efetivamente o Time Travel para a tabela.

MAX_DATA_EXTENSION_TIME_IN_DAYS = integer

Parâmetro de objeto que especifica o número máximo de dias para os quais o Snowflake pode estender o período de retenção de dados da tabela dinâmica para evitar que os fluxos na tabela dinâmica se tornem obsoletos.

Para uma descrição detalhada deste parâmetro, consulte MAX_DATA_EXTENSION_TIME_IN_DAYS.

COMMENT = 'string_literal'

Especifica um comentário para a tabela dinâmica.

(Observe que os comentários podem ser especificados no nível da coluna ou da tabela. A sintaxe de cada um é um pouco diferente).

Padrão: sem valor.

COPY GRANTS

Especifica a retenção dos privilégios de acesso da tabela dinâmica original quando uma nova tabela dinâmica é criada usando a opção da variante CREATE DYNAMIC TABLE CLONE:

Este parâmetro copia todos os privilégios, exceto OWNERSHIP, da tabela dinâmica existente para a nova tabela dinâmica. A nova tabela dinâmica não herda as concessões futuras definidas para o tipo de objeto no esquema. Por padrão, a função que executa a instrução CREATE DYNAMIC TABLE é a proprietária da nova tabela dinâmica.

Se este parâmetro não estiver incluído na instrução CREATE DYNAMIC TABLE, então a nova tabela não herdará nenhum privilégio de acesso explícito concedido na tabela dinâmica original, mas herda qualquer concessão futura definida para o tipo de objeto no esquema.

Nota:

  • Com compartilhamento de dados:

    • Se a tabela dinâmica existente foi compartilhada com outra conta, a tabela dinâmica de substituição também será compartilhada.

    • Se a tabela dinâmica existente foi compartilhada com sua conta como consumidor de dados, e o acesso foi ainda concedido a outras funções na conta (usando GRANT IMPORTED PRIVILEGES no banco de dados pai), o acesso também é concedido à tabela dinâmica de substituição.

  • A saída SHOW GRANTS para a tabela dinâmica de substituição relaciona o cessionário para os privilégios copiados como a função que executou a instrução CREATE TABLE, com o carimbo de data/hora atual quando a instrução foi executada.

  • A saída SHOW GRANTS para a tabela dinâmica de substituição relaciona o cessionário para os privilégios copiados como a função que executou a instrução CREATE TABLE, com o carimbo de data/hora atual quando a instrução foi executada.

  • A operação de cópia de concessões ocorre atomicamente no comando CREATE DYNAMIC TABLE (isto é, dentro da mesma transação).

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

Especifica a política de acesso a linhas a ser definida em uma tabela dinâmica.

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

Especifica o nome da tag e o valor da cadeia de caracteres dela.

O valor de tag é sempre uma cadeia de caracteres, e o número máximo de caracteres do valor da tag é 256.

Para obter informações sobre como especificar tags em uma instrução, consulte Cotas de tags para objetos e colunas.

Requisitos de controle de acesso

Uma função usada para executar este comando SQL deve ter os seguintes privilégios no mínimo:

Privilégio

Objeto

Notas

CREATE DYNAMIC TABLE

Esquema no qual você planeja criar a tabela dinâmica.

SELECT

Tabelas, exibições e tabelas dinâmicas que você planeja consultar para a nova tabela dinâmica.

USAGE

Warehouse que você planeja usar para atualizar a tabela.

Observe que operar em qualquer objeto de um esquema também requer o privilégio USAGE no banco de dados e esquema principais.

Para instruções sobre como criar uma função personalizada com um conjunto específico de privilégios, consulte Criação de funções personalizadas.

Para informações gerais sobre concessões de funções e privilégios para executar ações de SQL em objetos protegíveis, consulte Visão geral do controle de acesso.

Notas de uso

  • Quando você executar o comando CREATE DYNAMIC TABLE, a função atual em uso se torna a proprietária da tabela dinâmica. Essa função é usada para executar atualizações da tabela dinâmica em segundo plano.

  • Você não pode fazer alterações no esquema depois de criar uma tabela dinâmica.

  • As tabelas dinâmicas são atualizadas à medida que os objetos de banco de dados subjacentes mudam. O rastreamento de alterações deve ser ativado em todos os objetos subjacentes usados por uma tabela dinâmica. Consulte Habilitar o rastreamento de alterações.

  • Se você quiser substituir uma tabela dinâmica existente e precisar ver sua definição atual, chame a função GET_DDL.

  • Algumas expressões, cláusulas e funções não são atualmente suportadas em tabelas dinâmicas. Para obter uma lista completa, consulte Limitações conhecidas para tabelas dinâmicas.

  • Os clientes devem garantir que nenhum dado pessoal (exceto para um objeto do usuário), dados sensíveis, dados controlados por exportação ou outros dados regulamentados sejam inseridos como metadados ao usar o serviço Snowflake. Para obter mais informações, consulte Campos de metadados no Snowflake.

Exemplos

Crie uma tabela dinâmica chamada product:

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

No exemplo acima:

  • A tabela dinâmica materializa os resultados de uma consulta das colunas product_id e product_name da tabela staging_table.

  • A meta do tempo de atraso é de 20 minutos, o que significa que os dados na tabela dinâmica não devem ser mais de 20 minutos mais antigos do que os dados em staging_table.

  • O processo de atualização automatizada usa os recursos de computação no warehouse mywh para atualizar os dados na tabela dinâmica.

Clonar uma tabela dinâmica como ela existia exatamente na data e na hora do carimbo de data/hora especificado:

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