Hintergrundinformation:
- Ich erstelle eine Sammlung von Überwachungstabellen, um Aktualisierungen zu verfolgen und eine Reihe von Datentabellen für meine App zu löschen.
- Audit-Datensätze werden über Trigger erstellt.
- DML in der Datenbank meiner App stammt im Allgemeinen aus einem Login, mit dem ein Dienst in die Datenbank gelangt. Aus diesem Grund denke ich, dass das Ergebnis von
SYSTEM_USER
immer das gleiche sein wird, wenn ein Trigger aufgerufen wird. - Meine App speichert derzeit keine Benutzerdaten, obwohl
UserId
ihr jedes Mal eine Zeichenfolge zugewiesen wird , wenn DML ausgeführt werden soll (ausschließlich in gespeicherten Prozeduren).
Das Problem, auf das ich gestoßen bin, ist, dass ich wissen möchte, wer es getan hat, wenn ein Benutzer einen Datensatz löscht. Da dies durch dieselbe Anmeldung erfolgt, möchte ich nicht sehen, dass alle Aktionen vom Dienst ausgeführt wurden. Ich möchte sehen, welcher Benutzer dies getan hat. Dies ist kein Problem bei einem Update, da wir ModifiedBy
Spalten haben, die über eine bei UserId
Updates gesendete Datei aktualisiert werden.
Die Frage ist: Gibt es eine Möglichkeit SYSTEM_USER
, die Benutzerinformationen festzulegen oder auf andere Weise in den Trigger zu bekommen, wenn ein Löschvorgang ausgeführt wird?
Die "beste" Idee, die ich derzeit habe, obwohl ich noch nicht sicher bin, ob es eine gute Idee ist, ist, dass ich im Dienst überprüfe, ob sich der aktuelle UserId
als Benutzer in der Datenbank befindet, und wenn nicht, einen Benutzer zu erstellen Objekt für sie. Führen Sie dann gespeicherte Prozeduren mit aus EXECUTE AS User = @UserId
. Wenn dann DML in der gespeicherten Prozedur ausgeführt wird und der Trigger ausgelöst wird, SYSTEM_USER
sollte der Benutzer von der zurückgegeben werden EXECUTE AS
.