none
Alarm auslösen, wenn ein bestimmtes Feld in einer Tabelle mit einem bestimmten Wert überschrieben wird. RRS feed

  • Frage

  • Hallo,

    ich habe in einer Datenbank eine Tabelle, in der ein bestimmtes Feld ständig mit einem bestimmten Wert überschrieben wird.
    Auch nach langer Suche konnte ich nicht herausfinden, wer dieses Feld überschreibt.
    Gibt es eine Möglichkeit das Überschreiben dieses Feldes mit einem bestimmten Wert zu protokollieren?
    Wichtig ist eben, dass ich heraus bekommen wodurch dieses Feld überschrieben wird.

    Geht das irgendwie mit einem Trigger?

    Bin für jeden Tipp dankbar.

    Gruß

    cheapy

    Donnerstag, 7. Mai 2015 07:04

Antworten

Alle Antworten

  • Hallo cheapy,

    Klar kannst Du einen Trigger nutzen um die Änderungen zu protokollieren. Im Trigger kannst Du über die Security Functions (Transact-SQL) den aktuellen Benutzer ermitteln, über

    SELECT *
    FROM sys.sysprocesses
    WHERE spid = @@SPID

    bekommst Du Applikations- und den Hostnamen (nicht zu verlässlich/zugesichert!!) etc. heraus.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]


    Donnerstag, 7. Mai 2015 07:19
  • OK, und wie finde ich heraus, dass der Inhalt eines Feldes auf z.B. 'X' geändert wurde?

    Es soll ja auch nur Änderungen auf 'X' protokolliert werden, nicht wenn der Wert zuvor schon 'X' war.
    Ich habe bisher noch nie mit Triggern gearbeitet.

    Donnerstag, 7. Mai 2015 07:44
  • Gibt es zwei Möglichkeiten: Einmal die UPDATE() (Transact-SQL) Funktion, mit der man prüfen kann, welches Feld aktualisiert wurde. Dann stehen in einem UPDATE Trigger 2 virtuelle Tabellen zur Verfügung: "deleted" enthält die betroffenen Datensätze, bevor sie geändert wurden und "inserted" die neuen Daten; siehe CREATE TRIGGER (Transact-SQL) und  Verwenden der Tabellen inserted und deleted ; hierüber könnte man auch prüfen, was geändert wurde.

    Olaf Helper

    [ Blog] [ Xing] [ MVP]



    Donnerstag, 7. Mai 2015 07:56
  • Hallo,

    ein Beispiel für die Northwind.Orders, der Änderungen der CustomerID "überwacht":

    CREATE TRIGGER TR_Orders_Update
    	ON dbo.Orders
    	FOR UPDATE
    AS
    	SET NOCOUNT ON;
    	
    	IF UPDATE(CustomerID)
    	BEGIN
    		IF EXISTS(SELECT * 
    			FROM inserted AS i
    			INNER JOIN deleted AS d ON i.OrderID = d.OrderID
    			WHERE i.CustomerID <> d.CustomerID)
    			BEGIN
    				RAISERROR('Die Kundennummer darf nicht geändert werden.', 16, 1)
    				-- optional Abbruch der Transaktion
    				ROLLBACK TRAN;
    			END;
    	END;

    Oben wird die Änderung durch Abbruch der Transaktion gestoppt. In Deinem Falle wäre es vermutlich erst einmal sinnvoll eine Information einer Protokoll-Tabelle abzustellen, um den Grund / Verursache zu ermitteln.

    Gruß Elmar

    Donnerstag, 7. Mai 2015 08:53