Postgres til og med 9.4 registrerer ikke i sig selv tidsstempler, når rækker blev indsat eller opdateret.
Der er nogle systemkolonner i rækkeoverskrifterne der kan hjælpe i det retsmedicinske arbejde. Den fysiske rækkefølge af rækker (ctid
) kan være en indikator, hvis der ikke er sket andet med bordet siden. I simple tilfælde tilføjes nye rækker til den fysiske ende af en tabel, når de indsættes, så ctid
angiver, hvad der blev indsat sidst - indtil noget ændres i tabellen. Postgres kan frit omarrangere den fysiske rækkefølge af rækker efter eget ønske, for eksempel med VACUUM
. Enhver UPDATE
skriver også en ny rækkeversion, som kan ændre den fysiske position. Den nye version behøver ikke at være for enden af tabellen. Postgres forsøger at beholde ny rækkeversion på den samme dataside, hvis det er muligt (VARM opdatering
) ...
Når det er sagt, er her en simpel forespørgsel for at få den fysisk sidste rækker for en given tabel:
SELECT ctid, *
FROM big
ORDER BY ctid DESC
LIMIT 10;
Relaterede svar på dba.SE med detaljerede oplysninger:
Indsæt transaktions-id'et xmin
kan være nyttigt:
Hvis du tilfældigvis har en backup for test-DB fra lige før hændelsen, ville være hjælpsom. Gendan den gamle tilstand til et separat skema af test-DB og sammenlign tabeller ...
Typisk tilføjer jeg en eller to timestamptz
kolonner til vigtige tabeller for, hvornår rækken blev indsat, og/eller hvornår den blev opdateret sidste gang. Det ville være enormt nyttig for dig lige nu ...
Hvad ville også være fantastisk for dig:"temporal"-funktionerne introduceret i SQL-standarden med SQL:2011
. Men det er ikke implementeret i Postgres endnu.
Der er en side i Postgres Wiki .
Der er også en uofficiel udvidelse på PGXN
. Jeg har ikke testet det og kan ikke sige, hvor langt det er.
Postgres 9.5 introducerer en funktion til at optage tidsstempler for forpligtelse (som @Craig kommenterede ). Skal aktiveres manuelt, før det begynder at optage.Manualen:
Og nogle funktioner til at arbejde med det.