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>
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>
]
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 colunatext
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;
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;
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
ou1
Enterprise Edition:
0
a90
para tabelas permanentes0
ou1
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;
No exemplo acima:
A tabela dinâmica materializa os resultados de uma consulta das colunas
product_id
eproduct_name
da tabelastaging_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'));