2016-06-21 22 views
0

Ich brauche eine Reihe von relativ einfachen Update-Anweisungen auf einem großen Tisch zu verwenden, zum Beispiel wie folgt:SQL Server-Trigger: identifizieren spezifische Update-Anweisung verwendet

UPDATE Table1 
SET Col1 = 'A' 
WHERE Col2 = '1' 

UPDATE Table1 
SET Col1 = 'A' 
WHERE Col3 = 'X' 

UPDATE Table1 
SET Col1 = 'B' 
WHERE Col2 = '2' 

ich einen Trigger bin mit, welche Datensätze zu verfolgen sind aktualisiert. Wie würde ich herausfinden, welche spezifische Update-Anweisung zu der Aktualisierung in der vom Trigger ausgegebenen Tabelle geführt hat?

Wäre es möglich, im Triggerskript auf einen Variablensatz neben der update-Anweisung zu verweisen?

+0

DROP TRIGGER', 'PROCEDURE CREATE. –

+1

Suche nach 'DBCC INPUTBUFFER'. – Arvo

+0

'WHERE', nicht' WHEN' ... –

Antwort

1

Manchmal möchten Sie vielleicht herausfinden, welche genaue Aussage Ihre Tabelle aktualisiert hat. Oder Sie möchten herausfinden, wie die WHERE-Klausel der DELETE-Anweisung (von jemandem ausgeführt) aussieht.

DBCC INPUTBUFFER kann Ihnen diese Art von Informationen zur Verfügung stellen. Sie können einen Trigger für Ihre Tabelle erstellen, der den Befehl verwendet, um den genauen Befehl zu ermitteln, der den Auslöser ausgelöst hat.

Der folgende Triggercode funktioniert in SQL Server 2000 (In SQL Server 7.0 können Sie keine Tabellen innerhalb eines Triggers erstellen. Sie müssen also eine permanente Tabelle erstellen und diese innerhalb des Triggers verwenden). Dieser Code zeigt nur die SQL-Anweisung, den Anmeldenamen, den Benutzernamen und die aktuelle Uhrzeit an, Sie können jedoch den Code ändern, sodass diese Informationen in einer Tabelle für Überwachungs-/Überwachungszwecke protokolliert werden.

CREATE TRIGGER TriggerName 
ON TableName 
FOR INSERT, UPDATE, DELETE AS 
BEGIN 
SET NOCOUNT ON 

DECLARE @ExecStr varchar(50), @Qry nvarchar(255) 

CREATE TABLE #inputbuffer 
(
    EventType nvarchar(30), 
    Parameters int, 
    EventInfo nvarchar(255) 
) 

SET @ExecStr = 'DBCC INPUTBUFFER(' + STR(@@SPID) + ')' 

INSERT INTO #inputbuffer 
EXEC (@ExecStr) 

SET @Qry = (SELECT EventInfo FROM #inputbuffer) 

SELECT @Qry AS 'Query that fired the trigger', 
SYSTEM_USER as LoginName, 
USER AS UserName, 
CURRENT_TIMESTAMP AS CurrentTime 
END 

Aus dem obigen Code, die TableName und TriggerName mit Ihrem Tabellennamen und Triggernamen bzw. ersetzen und Sie können durch die Schaffung der Auslöser und dann durch Einfügen/Aktualisieren/Löschen von Daten des Trigger testen.

Entnommen here!

+1

Können Sie bitte die Lösung erklären, die Sie verknüpft haben. Die Ressource wird möglicherweise morgen offline geschaltet, wodurch der Link unterbrochen wird. Bitte geben Sie die wesentlichen Informationen der verlinkten Seite in Ihre Antwort ein. Wenn dies anstelle einer Antwort ein Kommentar sein soll, dann poste es als Kommentar. – Pred

+0

Der Link hat die Lösung, nach der das OP sucht. Es verwendet DBCC INPUTBUFFER, um den Befehl zu identifizieren. –

+0

Nicht der OP ist die einzige Person, die diesen Thread in der Zukunft lesen kann. Ihr Beitrag entspricht nicht den Mindestanforderungen einer Antwort auf SO. Bitte lies [Antwort] in [Hilfe] für weitere Informationen. – Pred