Wann wurden Daten zuletzt in eine Tabelle eingefügt / aktualisiert / gelöscht?

7

Ich habe diese Lösung gefunden, aber diese Informationen gehen jedes Mal verloren, wenn der SQL Server-Dienst neu gestartet wird, oder mit anderen Worten, sie sind nicht dauerhaft.

Gibt es eine andere Möglichkeit, herauszufinden, wann eine Tabelle zuletzt aktualisiert wurde, auch wenn der Server nachträglich heruntergefahren wurde?

ivanmp
quelle
8
Wenn dies sehr wichtig ist, müssen Sie möglicherweise einige Trigger hinzufügen. SQL Server behält diese Informationen standardmäßig nicht bei, da sie so teuer werden können.
JNK
Einverstanden mit JNK. Sie möchten eine Art zuletzt aktualisiertes Tracking, das tatsächlich in Tabellen protokolliert wird.
Eric Higgins
2
@JNK Ich untersuche einen Überwachungsmechanismus wie den von Ihnen vorgeschlagenen, aber für diesen speziellen Fall benötige ich rückwirkende Daten.
ivanmp
2
@ivanmp kann leider nicht retro bekommen. Wenn SQL Server diese Daten speichert, muss ein großer Teil Ihrer Datengröße in Überwachungstabellen verwaltet werden.
JNK

Antworten:

6

Wenn die Daten in der anderen Lösung für Sie akzeptabel sind, können Sie einfach Ihre eigene Datenerfassung rollen, damit sie bestehen bleibt. Erstellen Sie beispielsweise eine Tabelle zum Speichern von object_id und zum letzten Suchen / Scannen / Aktualisieren. Machen Sie alle n Minuten einen Schnappschuss der DMV. Überprüfen Sie dann das Maximum im Snapshot. Wenn es größer als das Maximum im Rollup ist, aktualisieren Sie das Rollup. Sie können die Schnappschüsse als Verlauf behalten oder sie im Laufe der Zeit bereinigen, sobald Sie sich zusammengeschlossen haben.

Aaron Bertrand
quelle
3

Wenn Sie Zugriff auf SQL Server Enterprise Edition haben, lesen Sie Änderungsverfolgung . Das ist jedoch eine ziemlich komplexe Lösung. Letztendlich ist es möglicherweise einfacher, eine LastUpdated-Spalte hinzuzufügen, wie bereits vorgeschlagen.

Dean Goodman
quelle
3

Ich möchte auch darauf hinweisen, dass Sie eine bessere Kilometerleistung erzielen, indem Sie entweder eine Protokolltabelle erstellen (die Einfügungen / Löschungen / Aktualisierungen protokolliert) oder Flags mit Datumsangaben zu Ihren Datensätzen hinzufügen (was zusätzlichen Speicherplatz pro Datensatz kosten würde).

In beiden Fällen verfolgt SQL Server dies standardmäßig nicht, da dies für DBs mit hohen Transaktionen teuer werden würde

Jakub
quelle
0

Dies kann für Sie hilfreich sein:

SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, 
    last_user_update, *
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( 'Database Name');
Aslam Khan
quelle
2
Haben Sie die Kommentare zur Frage und die Antworten gelesen? Zumindest sollten Sie die dort
angesprochenen
2
Auch in der Frage, die Sie beantworten: this information is lost everytime the SQL Server service is restarted- Wie geht diese Antwort auf dieses Problem ein?
Aaron Bertrand