CREATE DYNAMIC TABLE¶
Cria uma tabela dinâmica, com base em uma consulta especificada.
Esse comando é compatível com as seguintes variantes:
CREATE OR ALTER DYNAMIC TABLE: cria uma tabela dinâmica se ela não existir ou altera uma tabela dinâmica existente.
CREATE DYNAMIC TABLE FROM SNAPSHOT SET: restaura uma tabela dinâmica a partir de um backup.
CREATE DYNAMIC TABLE … CLONE: cria um clone de uma tabela dinâmica existente.
CREATE DYNAMIC ICEBERG TABLE: cria uma tabela dinâmica Apache Iceberg™.
- Consulte também:
ALTER DYNAMIC TABLE, DESCRIBE DYNAMIC TABLE, DROP DYNAMIC TABLE , SHOW DYNAMIC TABLES, CREATE OR ALTER <objeto>
Neste tópico:
Sintaxe¶
CREATE [ OR REPLACE ] [ TRANSIENT ] DYNAMIC TABLE [ IF NOT EXISTS ] <name> (
-- Column definition
<col_name> <col_type>
[ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col_name> , <cond_col1> , ... ) ] ]
[ [ WITH ] PROJECTION POLICY <policy_name> ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
[ WITH CONTACT ( <purpose> = <contact_name> [ , <purpose> = <contact_name> ... ] ) ]
[ COMMENT '<string_literal>' ]
-- Additional column definitions
[ , <col_name> <col_type> [ ... ] ]
)
TARGET_LAG = { '<num> { seconds | minutes | hours | days }' | DOWNSTREAM }
WAREHOUSE = <warehouse_name>
[ REFRESH_MODE = { AUTO | FULL | INCREMENTAL } ]
[ INITIALIZE = { ON_CREATE | ON_SCHEDULE } ]
[ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
[ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
[ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
[ COMMENT = '<string_literal>' ]
[ COPY GRANTS ]
[ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
[ [ WITH ] AGGREGATION POLICY <policy_name> [ ENTITY KEY ( <col_name> [ , <col_name> ... ] ) ] ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
[ REQUIRE USER ]
[ IMMUTABLE WHERE ( <expr> ) ]
[ BACKFILL FROM ]
AS <query>
Sintaxe da variante¶
CREATE OR ALTER DYNAMIC TABLE¶
CREATE OR ALTER DYNAMIC TABLE <name> (
-- Column definition
<col_name> <col_type>
[ COLLATE '<collation_specification>' ]
[ COMMENT '<string_literal>' ]
-- Additional column definitions
[ , <col_name> <col_type> [ ... ] ]
)
TARGET_LAG = { '<num> { seconds | minutes | hours | days }' | DOWNSTREAM }
WAREHOUSE = <warehouse_name>
[ REFRESH_MODE = FULL | INCREMENTAL | AUTO ]
[ IMMUTABLE WHERE ( <expr> ) ]
[ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
[ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
[ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
[ COMMENT = '<string_literal>' ]
Cria uma tabela dinâmica se ela não existir ou a altera de acordo com a definição da tabela dinâmica. A sintaxe CREATE OR ALTER DYNAMIC TABLE segue as regras de uma instrução CREATE DYNAMIC TABLE e tem as mesmas limitações de uma instrução ALTER DYNAMIC TABLE.
Para obter mais informações, consulte CREATE OR ALTER <objeto>.
Alterações nas seguintes propriedades e parâmetros da tabela dinâmica preservam os dados:
TARGET_LAG
WAREHOUSE
CLUSTER BY
DATA_RETENTION_TIME_IN_DAYS
MAX_DATA_EXTENSION_TIME_IN_DAYS
COMMENT
IMMUTABLE WHERE
Quando especificado, apenas a região mutável é reinicializada e os dados na região imutável são preservados. Para obter mais informações, consulte Criação de tabelas dinâmicas com restrições de imutabilidade.
Alterações nas seguintes propriedades e parâmetros da tabela dinâmica acionam uma reinicialização:
REFRESH_MODE
Alterações na consulta ou na lista de colunas:
A remoção de colunas existentes é compatível.
A adição de novas colunas é compatível, mas elas só podem ser adicionadas no fim de colunas existentes.
A remoção de colunas utilizadas em um predicado IMMUTABLE WHERE ou como chaves de clustering não é compatível.
Para obter mais informações, consulte Notas de uso de CREATE OR ALTER TABLE.
CREATE DYNAMIC TABLE FROM SNAPSHOT SET¶
CREATE DYNAMIC TABLE <name> FROM SNAPSHOT SET <snapshot_set> IDENTIFIER '<snapshot_id>'
A cláusula FROM SNAPSHOT SET restaura uma tabela dinâmica a partir de um backup. Você não especifica outras propriedades da tabela porque elas são todas iguais à tabela de backup.
Esse formulário não tem uma cláusula CREATE OR REPLACE. Normalmente, você restaura a tabela dinâmica com um novo nome e recupera quaisquer dados ou outros objetos dessa nova tabela, ou renomeia a tabela original e depois restaura a tabela com o nome original.
Nota
O conjunto de instantâneos está associado ao ID da tabela interna da tabela original. Quaisquer outros instantâneos que você adicionar ao conjunto de instantâneos usarão a tabela original, mesmo que você tenha alterado seu nome. Se quiser fazer backups da tabela recém-restaurada, crie um novo conjunto de instantâneos para ela.
Ao restaurar uma tabela dinâmica a partir de um instantâneo, o Snowflake inicializa automaticamente a nova tabela durante a primeira atualização.
Para obter mais informações sobre instantâneos, consulte Instantâneos para backups e armazenamento imutável.
snapshot_setEspecifica o nome de um conjunto de instantâneos criado para uma tabela dinâmica específica. Você pode usar o comando SHOW SNAPSHOT SETS para localizar o conjunto de instantâneos correto.
snapshot_idEspecifica o identificador de um instantâneo específico dentro desse conjunto de instantâneos. Você pode usar o comando SHOW SNAPSHOTS IN SNAPSHOT SET para localizar o identificador correto dentro do conjunto de instantâneos, com base na data e hora de criação do instantâneo.
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. A tabela dinâmica clonada herda o estado de agendamento da origem.
Você também pode clonar uma tabela dinâmica como ela era em um momento específico no passado. Para obter mais informações, consulte Considerações sobre clonagem.
CREATE [ OR REPLACE ] [ TRANSIENT ] 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>
]
Se a tabela dinâmica de origem tiver chaves de clustering, a tabela dinâmica clonada terá chaves de clustering. Por padrão, o Clustering automático é suspenso para a nova tabela, mesmo que o Clustering automático não tenha sido suspenso para a tabela de origem.
Para obter mais detalhes sobre clonagem, consulte CREATE <objeto> … CLONE.
CREATE DYNAMIC ICEBERG TABLE¶
Cria uma nova tabela Apache Iceberg™ dinâmica Para obter informações sobre tabelas Iceberg, consulte Tabelas Apache Iceberg™ e CREATE ICEBERG TABLE (Snowflake como o catálogo Iceberg).
CREATE [ OR REPLACE ] DYNAMIC ICEBERG TABLE <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 }
WAREHOUSE = <warehouse_name>
[ EXTERNAL_VOLUME = '<external_volume_name>' ]
[ CATALOG = 'SNOWFLAKE' ]
[ BASE_LOCATION = '<optional_directory_for_table_files>' ]
[ REFRESH_MODE = { AUTO | FULL | INCREMENTAL } ]
[ INITIALIZE = { ON_CREATE | ON_SCHEDULE } ]
[ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
[ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
[ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
[ COMMENT = '<string_literal>' ]
[ COPY GRANTS ]
[ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
[ REQUIRE USER ]
AS <query>
Para obter mais informações sobre uso e limitações, consulte Criar tabelas Apache Iceberg™ dinâmicas.
Parâmetros obrigatórios¶
nameEspecifica 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 o tempo máximo que o conteúdo da tabela dinâmica deve ficar atrasado em relação às atualizações das tabelas de origem.
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.
Deve ter um mínimo de 60 segundos. Se a tabela dinâmica depender de outra tabela dinâmica, o atraso mínimo de destino deverá ser maior ou igual ao atraso de destino da tabela dinâmica da qual ela depende.
DOWNSTREAMEspecifica que a tabela dinâmica deve ser atualizada somente quando as tabelas dinâmicas que dependem dela forem atualizadas.
WAREHOUSE = warehouse_nameEspecifica o nome do warehouse que fornece os recursos de computação para atualizar a tabela dinâmica.
Você deve usar uma função que tenha privilégio USAGE neste warehouse para criar a tabela dinâmica. Para limitações e mais informações, consulte Privilégios para criar uma tabela dinâmica.
AS queryEspecifica a consulta cujos resultados devem estar contidos na tabela dinâmica.
Parâmetros opcionais¶
TRANSIENTEspecifica que a tabela é transitória.
Assim como as tabelas dinâmicas permanentes, as tabelas dinâmicas transitórias existem até serem explicitamente descartadas e estão disponíveis para qualquer usuário com os privilégios adequados. Tabelas dinâmicas transitórias não retêm dados em armazenamento fail safe, o que ajuda a reduzir os custos de armazenamento, especialmente para tabelas que são atualizadas com frequência. Devido a esse nível reduzido de durabilidade, tabelas dinâmicas transitórias são mais bem utilizadas para dados transitórios que não precisam do mesmo nível de proteção e recuperação de dados fornecido por tabelas permanentes.
Padrão: sem valor. Se uma tabela dinâmica não for declarada como
TRANSIENT, ela é permanente.
REFRESH_MODE = { AUTO | FULL | INCREMENTAL }Especifica o modo 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, recrie a tabela dinâmica com um comando CREATE OR REPLACE DYNAMIC TABLE.
AUTOQuando o modo de atualização está definido como
AUTO, o sistema tenta aplicar uma atualização incremental por padrão. No entanto, quando a atualização incremental não é compatível ou não se espera que tenha um bom desempenho, a tabela dinâmica seleciona automaticamente a atualização completa. Para obter mais informações, consulte Modos de atualização de tabelas dinâmicas e Práticas recomendadas para escolher os modos de atualização da tabela dinâmica.Para determinar o melhor modo para seu caso de uso, experimente modos de atualização e recomendações automáticas. Para um comportamento consistente em todas as versões do Snowflake, defina explicitamente o modo de atualização em todas as tabelas dinâmicas.
Para verificar o modo de atualização de suas tabelas dinâmicas, consulte Exibição do modo de atualização de tabela dinâmica.
FULLImpõe uma atualização completa da tabela dinâmica, mesmo que a tabela dinâmica possa ser atualizada de forma incremental.
INCREMENTALImpõ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
INITIALIZEEspecifica 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_CREATEAtualiza 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_SCHEDULEAtualiza 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 programada 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_CREATECOMMENT '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_nameEspecifica a política de mascaramento a ser definida em uma coluna.
PROJECTION POLICY policy_nameEspecifica a política de projeção a ser definida em uma coluna.
column_listSe quiser alterar 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 my_dynamic_table (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 my_dynamic_table (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;
WITH CONTACT ( purpose = contact [ , purpose = contact ...] )Associe o novo objeto a um ou mais contatos.
CLUSTER BY ( expr [ , expr , ... ] )Especifica uma ou mais colunas ou expressões de colunas na tabela dinâmica como a chave de clustering. Antes de especificar uma chave de clustering para uma tabela dinâmica, você deve entender as micropartições. Para obter mais informações, consulte Explicação das estruturas de tabela do Snowflake.
Observe o seguinte ao usar chaves de clustering com tabelas dinâmicas:
As definições das colunas são necessárias e devem ser explicitamente especificadas na instrução.
Por padrão, o Clustering automático não é suspenso para a nova tabela dinâmica – mesmo que o Clustering automático seja suspenso para a tabela de origem.
As chaves de clustering não são destinadas ou recomendadas para todas as tabelas; elas normalmente são vantajosas para tabelas muito grandes (por exemplo, com vários terabytes).
Especificar CLUSTER BY não faz o clustering dos dados no momento da criação; em vez disso, CLUSTER BY conta com o clustering automático para reagrupar os dados ao longo do tempo.
Para obter mais informações, consulte Chaves de clustering e tabelas clusterizadas.
Padrão: sem valor (nenhuma chave de clustering está definida para a tabela)
DATA_RETENTION_TIME_IN_DAYS = integerEspecifica 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. Time Travel se comporta da mesma maneira para tabelas dinâmicas e tabelas tradicionais. Para obter mais informações, 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:
0ou1Enterprise Edition:
0a90para tabelas permanentes0ou1para tabelas temporárias e transitórias
Padrão:
Standard Edition:
1Enterprise 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
0desabilita efetivamente o Time Travel para a tabela.MAX_DATA_EXTENSION_TIME_IN_DAYS = integerUm parâmetro de objeto que define o número máximo de dias que o Snowflake pode estender o período de retenção de dados para evitar que os fluxos na tabela dinâmica fiquem 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 GRANTSEspecifica manter os privilégios de acesso da tabela original quando uma nova tabela dinâmica é criada usando qualquer uma das seguintes variantes CREATE DYNAMIC TABLE:
CREATE OR REPLACE DYNAMIC TABLE
CREATE OR REPLACE DYNAMIC ICEBERG TABLE
CREATE OR REPLACE 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.
Se a instrução estiver substituindo uma tabela existente com o mesmo nome, então as concessões são copiadas da tabela que está sendo substituída. Se não existir uma tabela com esse nome, então as concessões são copiadas.
Por exemplo, a instrução a seguir cria uma tabela dinâmica
dt1clonada dedt0com todas as concessões copiadas dedt0. Ao executar o comando pela primeira,dt1copia todas as concessões dedt0. Se você executar o mesmo comando novamente,dt1copiará todas as concessões dedt1e não dedt0.CREATE OR REPLACE DYNAMIC TABLE dt1 CLONE dt0 COPY GRANTS;
Observe o seguinte:
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 PRIVILEGESno 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).
Importante
O parâmetro COPY GRANTS pode ser colocado em qualquer lugar em um comando CREATE [OR REPLACE] DYNAMIC TABLE, exceto após a definição da consulta.
Por exemplo, a tabela dinâmica a seguir não será criada:
CREATE OR REPLACE DYNAMIC TABLE my_dynamic_table TARGET_LAG = DOWNSTREAM WAREHOUSE = mywh AS SELECT * FROM staging_table COPY GRANTS;
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 Cota de tags para objetos.
AGGREGATION POLICY policy_name [ ENTITY KEY ( col_name [ , col_name ... ] ) ]Especifica uma política de agregação a ser definida em uma tabela dinâmica. Você pode aplicar uma ou mais políticas de agregação em uma tabela.
Use o parâmetro opcional ENTITY KEY para definir quais colunas identificam exclusivamente uma entidade na tabela dinâmica. Para obter mais informações, consulte Implementação de privacidade ao nível de entidade com políticas de agregação. Você pode especificar uma ou mais chaves de entidade para uma política de agregação.
REQUIRE USERQuando especificado, a tabela dinâmica não pode ser executada a menos que um usuário seja especificado. A tabela dinâmica não pode ser atualizada, a menos que um usuário seja definido em uma atualização manual com o parâmetro COPY SESSION especificado.
Se essa opção estiver ativada, a tabela dinâmica deverá ser criada com o parâmetro ON_SCHEDULE para
INITIALIZE.IMMUTABLE WHEREEspecifica uma condição que define a parte imutável da tabela dinâmica. Para obter mais informações, consulte Criação de tabelas dinâmicas com restrições de imutabilidade.
BACKFILL FROM <name>Especifica a tabela da qual os dados devem ser preenchidos.
Somente os dados definidos pela restrição de imutabilidade IMMUTABLE WHERE podem ser preenchidos, porque os dados de preenchimento devem continuar inalterados, mesmo que sejam diferentes da fonte upstream.
Para obter mais informações, consulte Criação de tabelas dinâmicas usando preenchimento.
Requisitos de controle de acesso¶
A função usada para executar essa operação deve ter, no mínimo, os seguintes privilégios:
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. |
O privilégio USAGE no banco de dados e no esquema pai é necessário para executar operações em qualquer objeto de um esquema. Observe que uma função com privilégio concedido em um esquema permite que essa função resolva o esquema. Por exemplo, uma função com privilégio CREATE concedido em um esquema pode criar objetos nesse esquema sem também ter USAGE concedido nesse esquema.
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.
O uso de ORDER BY na definição de uma tabela dinâmica pode produzir resultados classificados em uma ordem inesperada. Você pode usar ORDER BY ao consultar sua tabela dinâmica para garantir que as linhas selecionadas retornem em uma ordem específica.
O Snowflake não suporta o uso de ORDER BY para criar uma exibição que seleciona de uma tabela dinâmica.
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 da tabela dinâmica.
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.
As cláusulas
OR REPLACEeIF NOT EXISTSsão mutuamente exclusivas. Elas não podem ser usadas na mesma instrução.Instruções CREATE OR REPLACE <object> são atômicas. Ou seja, quando um objeto é substituído, o objeto antigo é excluído e o novo objeto é criado em uma única transação.
Notas de uso CREATE OR ALTER DYNAMIC TABLE¶
Todas as limitações do comando ALTER DYNAMIC TABLE se aplicam.
Limitações¶
As seguintes ações não são compatíveis:
Troca de tabelas dinâmicas com o uso do parâmetro SWAP WITH.
Renomeação de uma tabela dinâmica com o uso do parâmetro RENAME TO.
Criação de um clone de uma tabela dinâmica com o uso do parâmetro CLONE.
Suspensão ou retomada com o uso dos parâmetros SUSPEND e RESUME.
Conversão de uma tabela dinâmica TRANSIENT em uma tabela não dinâmica TRANSIENT ou vice-versa.
Adicionar ou alterar tags e políticas. Todas as tags e políticas existentes são preservadas, e outras instruções ainda podem adicionar ou remover tags e políticas.
Criação ou alteração de tabelas dinâmicas Apache Iceberg™.
Clone do Time Travel para períodos anteriores à última definição ou alteração do modo de atualização.
Além disso, não há suporte para modificação dos valores das propriedades REFRESH_MODE e INITIALIZE após a criação da tabela dinâmica. Você pode alternar entre o modo de atualização AUTO e os modos de atualização específicos INCREMENTAL e FULL, mas isso não altera o modo de atualização físico real da tabela dinâmica.
Por exemplo:
Se você criar uma tabela dinâmica com o modo de atualização
AUTO, o sistema atribuirá imediatamente um modo concreto (INCREMENTALouFULL). Quando você executa uma instrução CREATE OR ALTER DYNAMIC TABLE subsequente, pode especificarAUTOou o modo de atualização concreto escolhido pelo mecanismo na criação. No entanto, isso não altera o modo de atualização atribuído; ele permanece o mesmo.Se você criar uma tabela dinâmica com um modo de atualização específico (
INCREMENTALouFULL), poderá especificarAUTOposteriormente em uma instrução CREATE OR ALTER DYNAMIC TABLE para ativar a compatibilidade futura. Por exemplo, se sua tabela dinâmica foi criada com o modoFULLe é controlada por versão, especificarAUTOem uma instrução CREATE OR ALTER DYNAMIC TABLE permite que novas tabelas usemAUTO, enquanto as tabelas existentes permanecem no modoFULLsem comprometer a compatibilidade.
Nenhuma atualização implícita¶
Se você alterar uma tabela dinâmica existente com o uso do comando CREATE OR ALTER DYNAMIC TABLE, ele não acionará uma atualização da tabela dinâmica. A tabela dinâmica é atualizada de acordo com o cronograma normal.
No entanto, se você criar uma nova tabela dinâmica com o uso do comando CREATE OR ALTER DYNAMIC TABLE e especificar INITIALIZE = ON_CREATE, ele acionará uma atualização da tabela dinâmica.
Atomicidade¶
O comando CREATE OR ALTER DYNAMIC TABLE não garante atomicidade. Isso significa que, se uma instrução CREATE OR ALTER DYNAMIC TABLE falhar durante a execução, é possível que um subconjunto de alterações tenha sido aplicado à tabela. Se houver possibilidade de alterações parciais, na maioria dos casos, a mensagem de erro incluirá o seguinte texto:
CREATE OR ALTER execution failed. Partial updates may have been applied.
Por exemplo, suponha que você queira alterar a propriedade TARGET_LAG e adicionar uma chave de clustering para uma tabela dinâmica, mas muda de ideia e encerra a instrução. Nesse caso, a propriedade TARGET_LAG ainda pode ser alterada enquanto a chave de clustering não for aplicada.
Quando as alterações são aplicadas parcialmente, a tabela resultante fica em um estado válido. No exemplo anterior, você pode usar instruções ALTER DYNAMIC TABLE adicionais para concluir o conjunto original de alterações.
Para se recuperar de atualizações parciais, tente os seguintes métodos de recuperação:
Reparo adiantado: execute novamente a instrução CREATE OR ALTER DYNAMIC TABLE. Se a instrução for bem-sucedida na segunda tentativa, o estado de destino será alcançado.
Se a instrução não for bem-sucedida, investigue a mensagem de erro. Se possível, corrija o erro e execute novamente a instrução CREATE OR ALTER DYNAMIC TABLE.
Reversão: se não for possível fazer o reparo adiantado, reverta manualmente as alterações parciais:
Investigue o estado da tabela com o uso dos comandos DESCRIBE DYNAMIC TABLE e SHOW DYNAMIC TABLES. Determine quais alterações parciais foram aplicadas, se houver.
Se alterações parciais foram aplicadas, execute as instruções ALTER DYNAMIC TABLE apropriadas para transformar a tabela dinâmica de volta à instrução original.
Para obter ajuda extra, entre em contato com o suporte Snowflake.
Exemplos¶
Crie uma tabela dinâmica chamada my_dynamic_table:
CREATE OR REPLACE DYNAMIC TABLE my_dynamic_table
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_ideproduct_nameda 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
mywhpara atualizar os dados na tabela dinâmica.
Crie uma tabela Iceberg dinâmica nomeada my_dynamic_table que faça a leitura de my_iceberg_table:
CREATE DYNAMIC ICEBERG TABLE my_dynamic_table (date TIMESTAMP_NTZ, id NUMBER, content STRING)
TARGET_LAG = '20 minutes'
WAREHOUSE = mywh
EXTERNAL_VOLUME = 'my_external_volume'
CATALOG = 'SNOWFLAKE'
BASE_LOCATION = 'my_iceberg_table'
AS
SELECT product_id, product_name FROM staging_table;
Crie uma tabela dinâmica com uma chave de clustering de várias colunas:
CREATE DYNAMIC TABLE my_dynamic_table (date TIMESTAMP_NTZ, id NUMBER, content VARIANT)
TARGET_LAG = '20 minutes'
WAREHOUSE = mywh
CLUSTER BY (date, id)
AS
SELECT product_id, product_name FROM staging_table;
Clonar uma tabela dinâmica como ela existia exatamente na data e na hora do carimbo de data/hora especificado:
CREATE DYNAMIC TABLE my_cloned_dynamic_table CLONE my_dynamic_table AT (TIMESTAMP => TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'mm/dd/yyyy hh24:mi:ss'));
Configure uma tabela dinâmica para exigir um usuário para atualizações e, em seguida, atualize a tabela dinâmica:
CREATE DYNAMIC TABLE my_dynamic_table
TARGET_LAG = 'DOWNSTREAM'
WAREHOUSE = mywh
INITIALIZE = on_schedule
REQUIRE USER
AS
SELECT product_id, product_name FROM staging_table;
ALTER DYNAMIC TABLE my_dynamic_table REFRESH COPY SESSION;
Crie uma tabela dinâmica com o uso do comando CREATE OR ALTER DYNAMIC TABLE:
CREATE OR ALTER DYNAMIC TABLE my_dynamic_table
TARGET_LAG = DOWNSTREAM
WAREHOUSE = mywh
AS
SELECT a, b FROM t;
Nota
As instruções CREATE OR ALTER TABLE para tabelas existentes só podem ser executadas por uma função com o privilégio OWNERSHIP em my_dynamic_table.
Altere uma tabela dinâmica para definir o parâmetro DATA_RETENTION_TIME_IN_DAYS e adicionar uma chave de clustering:
CREATE OR ALTER DYNAMIC TABLE my_dynamic_table
TARGET_LAG = DOWNSTREAM
WAREHOUSE = mywh
DATA_RETENTION_TIME_IN_DAYS = 2
CLUSTER BY (a)
AS
SELECT a, b FROM t;
Modifique o atraso de destino e altere o warehouse:
CREATE OR ALTER DYNAMIC TABLE my_dynamic_table
TARGET_LAG = '5 minutes'
WAREHOUSE = my_other_wh
DATA_RETENTION_TIME_IN_DAYS = 2
CLUSTER BY (a)
AS
SELECT a, b FROM t;
Desative o parâmetro DATA_RETENTION_TIME_IN_DAYS. A ausência de um parâmetro na instrução CREATE OR ALTER DYNAMIC TABLE modificada resulta no cancelamento de sua definição. Nesse caso, o cancelamento da definição do parâmetro DATA_RETENTION_TIME_IN_DAYS para a tabela dinâmica o redefine para o valor padrão de 1:
CREATE OR ALTER DYNAMIC TABLE my_dynamic_table
TARGET_LAG = '5 minutes'
WAREHOUSE = my_other_wh
CLUSTER BY (a)
AS
SELECT a, b FROM t;