9 Stimmen

Wie bekomme ich das letzte Einfüge-/Update-/Lösch-Datumzeit auf dem Sql Server 2005?

Nicht doppelt von meiner vorherigen Frage

Gibt es einen Weg, das neueste Datum und Uhrzeit zu erhalten, wenn in SQL Server 2005 eine Tabelle/Datenbank eingefügt/aktualisiert/gelöscht wurde? Am besten ohne Trigger zu erstellen..

Ich weiß, dass man Trigger benötigt, wenn man das letzte Update pro Zeile benötigt. Aber ich bin mir nicht sicher, ob sie benötigt werden, wenn man einfach das letzte Update für die gesamte Tabelle erhalten möchte.

19voto

KAWAMO Punkte 191
SELECT t.name,
       user_seeks,
       user_scans,
       user_lookups,
       user_updates,
       last_user_seek,
       last_user_scan,
       last_user_lookup,
       last_user_update
FROM   sys.dm_db_index_usage_stats i
       JOIN sys.tables t
         ON ( t.object_id = i.object_id )
WHERE  database_id = DB_ID()

10voto

Manoj Kanojiya Punkte 132

Sie können die zuletzt eingefügten/aktualisierten/gelöschten Daten ganz einfach wie folgt erhalten:

CREATE FUNCTIOn fn_TablesLastUpdateDate(@Date NVARCHAR(20))

RETURNS @table TABLE(TableName NVARCHAR(40), LastUpdated Datetime)

AS

BEGIN

IF(@Date='') OR (@Date Is Null) OR (@Date='0')

    BEGIN
        INSERT INTO @table
        SELECT TOP 100 PERCENT TABLENAME,LASTUPDATED FROM 
        (
            SELECT  B.NAME AS 'TABLENAME', MAX(STATS_DATE (ID,INDID)) AS LASTUPDATED
            FROM    SYS.SYSINDEXES AS A
                    INNER JOIN SYS.OBJECTS AS B ON A.ID = B.OBJECT_ID
            WHERE   B.TYPE = 'U'  AND STATS_DATE (ID,INDID) IS NOT NULL 
            GROUP BY B.NAME
        ) AS A
        ORDER BY LASTUPDATED DESC
    END
ELSE

    BEGIN
        INSERT INTO @table
        SELECT TOP 100 PERCENT TABLENAME,LASTUPDATED FROM 
        (
            SELECT  B.NAME AS 'TABLENAME', MAX(STATS_DATE (ID,INDID)) AS LASTUPDATED,
                    CONVERT(VARCHAR, MAX(STATS_DATE (ID,INDID)), 103) as Date
            FROM    SYS.SYSINDEXES AS A
                    INNER JOIN SYS.OBJECTS AS B ON A.ID = B.OBJECT_ID
            WHERE   B.TYPE = 'U'  AND STATS_DATE (ID,INDID) IS NOT NULL 
            GROUP BY B.NAME
        ) AS A
        WHERE Date=@Date
        ORDER BY LASTUPDATED DESC
    END
RETURN

END

-- SELECT * from fn_TablesLastUpdateDate('06/11/2012')

6voto

marc_s Punkte 701497

Wie die beiden vorherigen Antworten zeigen, gibt es wirklich keine integrierte Funktionalität in SQL Server, die für Ihre Anforderungen direkt verfügbar ist.

Es gibt eine Reihe von dynamischen Managementansichten, die Ihnen einige Ihrer Interessenspunkte mitteilen können, z.B. sys.dm_db_index_usage_stats, die Ihnen zeigen, wann ein bestimmter Index zuletzt gesucht oder aktualisiert wurde.

Aber es gibt wirklich nichts im Lieferumfang, das Sie nutzen könnten, um alle Informationen zu erhalten, nach denen Sie suchen - Sie müssen dies wirklich selbst tun, indem Sie z.B. Datumsfelder zu Ihren Tabellen hinzufügen und sie mit Triggern füllen.

Es tut mir leid, dass ich Ihnen keine besseren Nachrichten geben kann - so ist es leider im Moment.

In SQL Server 2008 gibt es zusätzliche neue Funktionen, die einige Ihrer Anforderungen abdecken könnten - schauen Sie sich an:

Marc

3voto

Angesichtsfehler noch keine Antworten gibt, hier sind meine 2 Cent:

  • Für Insert würde ich ein DateTime-Feld mit Standardwert GETDATE() verwenden
  • Für Update würde ich auch ein DateTime-Feld verwenden, das bei jeder Aktualisierung durch Trigger geändert wird.
  • Bei Löschen ist der Datensatz nicht verfügbar, daher können Sie ihn nicht abfragen.

Ich dachte daran, Zeitstempel zu verwenden, um Trigger zu vermeiden, aber Sie können Zeitstempel nicht in Datetime konvertieren.

BEARBEITEN: Oder vielleicht können Sie eine "Metatabelle" verwenden, in der Sie in den Triggern die Änderungsdaten speichern

CREATE TABLE metatable (
table_name VARCHAR(40) NOT NULL PRIMARY KEY,
last_insert DATETIME NOT NULL,
last_update DATETIME NOT NULL,
last_delete DATETIME NOT NULL
)

INSERT metatable VALUES ('table1', GETDATE(), GETDATE(), GETDATE())

CREATE TRIGGER trg_table1_ins ON table1 FOR INSERT AS BEGIN
    UPDATE metatable SET last_insert = GETDATE() WHERE table_name = 'table1'
END

CREATE TRIGGER trg_table1_upd ON table1 FOR UPDATE AS BEGIN
    UPDATE metatable SET last_update = GETDATE() WHERE table_name = 'table1'
END

CREATE TRIGGER trg_table1_del ON table1 FOR DELETE AS BEGIN
    UPDATE metatable SET last_delete = GETDATE() WHERE table_name = 'table1'
END

Ich hoffe es ist nützlich

2voto

Remus Rusanu Punkte 280155

Über kurze Zeiträume (seit dem Start des Servers) überprüfen Sie sys.dm_db_index_usage_stats last_user_update column. Da dies jedoch nur Updates seit dem Serverstart zählt, kann es über einen längeren Zeitraum nicht verwendet werden.

Für längere Zeiträume, wenn die Tabelle nicht riesig ist, kann Ihre Anwendung die Tabelle CHECKSUM_AGG(ALL) speichern. Es muss nur einmal beim Anwendungsstart neu berechnet und mit dem zuvor gespeicherten Wert verglichen werden. Außerdem kann die Anwendung Änderungen mithilfe des DMV erkennen. Beim Herunterfahren der Anwendung sollte sie den aktuellen Tabellenchecksumme speichern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X