Kategorien:

Abfragesyntax

AT | BEFORE

Die AT- oder BEFORE-Klausel wird für Snowflake Time Travel verwendet. In einer Abfrage wird sie in der FROM-Klausel unmittelbar nach dem Tabellennamen angegeben und bestimmt den Punkt in der Vergangenheit, ab dem historische Daten für das Objekt angefordert werden:

  • Das Schlüsselwort AT gibt an, dass die Anfrage alle Änderungen beinhaltet, die durch eine Anweisung oder Transaktion vorgenommen wurden, deren Zeitstempel dem angegebenen Parameter entspricht.

  • Das Schlüsselwort BEFORE gibt an, dass sich die Anfrage auf einen Punkt unmittelbar vor dem angegebenen Parameter bezieht.

Weitere Informationen dazu finden Sie unter Verstehen und Verwenden von Time Travel.

Siehe auch:

FROM

Syntax

SELECT ...
FROM ...
  {
   AT( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) |
   BEFORE( STATEMENT => <id> )
  }
[ ... ]
TIMESTAMP => Zeitstempel

Gibt ein genaues Datum und eine genaue Zeit für Time Travel an. Beachten Sie, dass der Wert explizit in einen TIMESTAMP umgewandelt werden muss.

OFFSET => Zeitunterschied

Gibt für Time Travel die Differenz in Sekunden von der aktuellen Zeit im Format -N an, wobei N eine Ganzzahl oder ein arithmetischer Ausdruck sein kann (z. B. entspricht -120 120 Sekunden; -30*60 entspricht 1.800 Sekunden oder 30 Minuten).

STATEMENT => ID

Gibt die Abfrage-ID einer Anweisung an, die als Referenzpunkt für Time Travel verwendet werden soll. Dieser Parameter unterstützt alle Anweisungen eines der folgenden Typen:

  • DML (z. B. INSERT, UPDATE, DELETE)

  • TCL (BEGIN, COMMIT-Transaktion)

  • SELECT

Nutzungshinweise

  • Daten in Snowflake werden durch Zeitstempel identifiziert, die geringfügig vom genauen Wert der Systemzeit abweichen können.

  • Der Wert für TIMESTAMP oder OFFSET muss ein konstanter Ausdruck sein.

  • Die kleinste Zeitauflösung für TIMESTAMP sind Millisekunden.

  • Wenn die angeforderten Daten die Aufbewahrungsfrist von Time Travel überschreiten (der Standardwert ist 1 Tag), schlägt die Anweisung fehl.

    Wenn außerdem die angeforderten Daten innerhalb der Aufbewahrungsfrist von Time Travel liegen, aber keine historischen Daten verfügbar sind (z. B. wenn der Aufbewahrungszeitraum verlängert wurde), schlägt die Anweisung fehl.

  • Für Zugriffe auf historische Tabellendaten wird das aktuelle Tabellenschema verwendet (Spalten, Standardwerte usw.).

  • Historische Daten haben die gleichen Anforderungen an die Zugriffssteuerung wie aktuelle Daten. Änderungen werden rückwirkend übernommen.

Problembehandlung

Fehlermeldung: Time travel data is not available for table <Tabellenname>

Ursache

In einigen Fällen wird das Problem durch Verwendung einer Zeichenfolge verursacht, bei der ein Zeitstempel erwartet wird.

Lösung

Wandeln Sie die Zeichenfolge in einen Zeitstempel um.

... AT(TIMESTAMP => '2018-07-27 12:00:00')               -- wrong
... AT(TIMESTAMP => '2018-07-27 12:00:00'::TIMESTAMP)    -- right

select * from tab1 where c1 = 'This is a string', c2 = 10 and "Column 2" = 20;

Beispiele

Auswählen historischer Daten aus einer Tabelle mit einem bestimmten Zeitstempel:

SELECT * FROM my_table AT(TIMESTAMP => 'Mon, 01 May 2015 16:20:00 -0700'::timestamp);
SELECT * FROM my_table AT(TIMESTAMP => TO_TIMESTAMP(1432669154242, 3));

Auswählen historischer Daten aus einer Tabelle von vor 5 Minuten:

SELECT * FROM my_table AT(OFFSET => -60*5) AS T WHERE T.flag = 'valid';

Auswählen historischer Daten aus einer Tabelle bis zu einer Änderung (Änderung exklusive), die von der angegebenen Transaktion vorgenommen wurde:

SELECT * FROM my_table BEFORE(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726');

Zurückgeben der Differenz in Tabellendaten zurück, die sich aus der angegebenen Transaktion ergibt:

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;