- Categorias:
AT | BEFORE¶
A cláusula AT ou BEFORE é usada para o Snowflake Time Travel. Em uma consulta, ela é especificada na cláusula FROM imediatamente após o nome da tabela e determina o ponto no passado do qual os dados históricos são solicitados para o objeto:
A palavra-chave AT especifica que a solicitação inclui quaisquer alterações feitas por uma instrução ou transação com um carimbo de data/hora igual ao parâmetro especificado.
A palavra-chave BEFORE especifica que o pedido se refere a um ponto imediatamente anterior ao parâmetro especificado.
Para obter mais informações, consulte Compreensão e uso do Time Travel.
- Consulte também:
Sintaxe¶
SELECT ...
FROM ...
{
AT( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> | STREAM => '<name>' } ) |
BEFORE( STATEMENT => <id> )
}
[ ... ]
TIMESTAMP => timestamp
Especifica uma data e hora exatas a serem usadas para o Time Travel. Note que o valor deve ser convertido explicitamente em um TIMESTAMP.
OFFSET => time_difference
Especifica a diferença em segundos do tempo atual a ser usado para o Time Travel, na forma
-N
ondeN
pode ser uma expressão inteira ou aritmética (por exemplo,-120
é 120 segundos,-30*60
é 1800 segundos ou 30 minutos).STATEMENT => id
Especifica a ID de consulta de uma instrução a ser usada como ponto de referência para o Time Travel. Este parâmetro oferece suporte a qualquer instrução de um dos seguintes tipos:
DML (por exemplo, INSERT, UPDATE, DELETE)
TCL (transação BEGIN, COMMIT)
SELECT
A ID da consulta deve fazer referência a uma consulta que tenha sido executada nos últimos 14 dias. Se a ID da consulta fizer referência a uma consulta com mais de 14 dias, o seguinte erro é retornado:
Error: statement <query_id> not found
Para contornar esta limitação, use o carimbo de data/hora para a consulta referenciada.
STREAM => 'name'
Especifica o identificador (ou seja, nome) de um fluxo existente na tabela ou exibição consultada. O offset atual no fluxo é usado como o ponto
AT
no tempo para retornar os dados de alteração para o objeto de origem.Essa palavra-chave é suportada somente ao criar um fluxo (usando CREATE STREAM) ou ao consultar dados de modificação (usando a cláusula CHANGES). Para obter exemplos, consulte esses tópicos.
Notas de uso¶
Os dados em Snowflake são identificados por carimbos de data/hora que podem diferir um pouco do valor exato do tempo do sistema.
O valor para TIMESTAMP ou OFFSET deve ser uma expressão constante.
A menor resolução de tempo para TIMESTAMP é de milissegundos.
Se os dados solicitados estiverem além do período de retenção de Time Travel (o padrão é 1 dia), a instrução falha.
Além disso, se os dados solicitados estiverem dentro do período de retenção do Time Travel, mas não houver dados históricos disponíveis (por exemplo, se o período de retenção foi prorrogado), a instrução falha.
Se o tempo do Time Travel especificado for no momento ou antes do momento em que o objeto foi criado, a instrução falha.
Ao acessar os dados da tabela histórica, é utilizado o esquema de tabela atual (colunas, valores padrão etc.).
Os dados históricos têm os mesmos requisitos de controle de acesso que os dados atuais. Quaisquer alterações são aplicadas retroativamente.
Solução de problemas¶
Mensagem de erro: Time travel data is not available for table <nome da tabela>
¶
- Causa
Em alguns casos, isto é causado pelo uso de uma cadeia de caracteres onde é esperado um carimbo de data/hora.
- Solução
Converter a cadeia de caracteres em um carimbo de data/hora.
... AT(TIMESTAMP => '2018-07-27 12:00:00') -- wrong ... AT(TIMESTAMP => '2018-07-27 12:00:00'::TIMESTAMP) -- right
Exemplos¶
Selecionar os dados históricos de uma tabela usando um carimbo de data/hora específico:
SELECT * FROM my_table AT(TIMESTAMP => 'Fri, 01 May 2015 16:20:00 -0700'::timestamp);SELECT * FROM my_table AT(TIMESTAMP => TO_TIMESTAMP(1432669154242, 3));
Selecionar dados históricos de uma tabela de 5 minutos atrás:
SELECT * FROM my_table AT(OFFSET => -60*5) AS T WHERE T.flag = 'valid';
Selecionar dados históricos de uma tabela até, sem incluir, quaisquer alterações feitas pela transação especificada:
SELECT * FROM my_table BEFORE(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726');
Retornar a diferença nos dados da tabela resultante da transação especificada:
SELECT oldt.* ,newt.* FROM my_table BEFORE(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726') AS oldt FULL OUTER JOIN my_table AT(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726') AS newt ON oldt.id = newt.id WHERE oldt.id IS NULL OR newt.id IS NULL;