2010-04-15 3 views
11

ich ein trigger habe, die wie so mit einigen Daten zur Protokollierung Angebote:übergeben Sie eine Variable in einen Trigger

CREATE TRIGGER trgDataUpdated 
    ON tblData FOR UPDATE 
AS 
BEGIN 
    INSERT INTO tblLog (ParentID, OldValue, NewValue, UserID) 
    SELECT deleted.ParentID, deleted.Value, inserted.Value, 
      @intUserID -- how can I pass this in? 
    FROM inserted INNER JOIN deleted ON inserted.ID = deleted.ID 
END 

Wie kann ich in den Variablen @intUserID in die obigen Trigger passieren, wie in dem folgenden Code:

DECLARE @intUserID int 
SET @intUserID = 10 

UPDATE tblData 
SET Value = @x 

PS: ich weiß, dass ich nicht buchstäblich in @intUserID auf den Trigger passieren kann, wurde es nur zu Veranschaulichungszwecken verwendet.

Antwort

10

Ich verwende SET CONTEXT_INFO für diese Art von Aktion. Das ist ein 2008+ Link, prior link wurde zurückgezogen.

Auf SQL Server 2005+, haben Sie CONTEXT_INFO, um es zu lesen, aber sonst müssen Sie von context_info Spalte in dbo.sysprocesses.

+0

Ich dachte darüber nach, aber es sah nicht wie die eleganteste Lösung aus. Wenn es der einzige Weg ist, dann werde ich es tun, aber ich habe auf etwas anderes gehofft :( – Codesleuth

+0

@Codesleuth: Sie sind hier begrenzt ... – gbn

+1

Ich implementiere das jetzt. Ich wollte nur diesen Link für jedermann einfügen Möchten Sie dies in Zukunft tun: http://msdn.microsoft.com/en-us/library/aa214382%28SQL.80%29.aspx – Codesleuth

0

Sie übergeben keine Variablen an Trigger, da Sie Trigger nicht direkt aufrufen können. Sie werden ausgeführt, wenn Daten eingefügt, geändert oder gelöscht werden.

+1

ich nicht für ein Ja suchen/hier keine Antwort. Sicherlich gibt es eine Möglichkeit, Informationen gegen die aktuelle Transaktion zu speichern, die der Auslöser aufnehmen kann. – Codesleuth

3

Sie können eine Variable nicht in einen Trigger übergeben.

Die einzige Möglichkeit, die Informationen im Trigger abzurufen, besteht darin, sie basierend auf den Tabellen INSERTED oder DELETED AUSWÄHLEN zu können oder eine Spalte in die betroffene Tabelle einzufügen und den Wert in diese Spalte zu setzen.

EDIT im vorherigen OP Frage dazu geschrieben, sie sagten, dass sie nicht CONTEXT_INFO benutzen wollte, aber hier sagen, dass sie es Ok zu bedienen ist, ist so hier ein CONTEXT_INFO Verwendungsbeispiel:

in dem Verfahren zu tun das Update

DECLARE @intUserID  int 
     ,@CONTEXT_INFO varbinary(128) 
SET @intUserID = 10 
SET @CONTEXT_INFO =cast('intUserID='+CONVERT(varchar(10),@intUserID)+REPLICATE(' ',128) as varbinary(128)) 
SET CONTEXT_INFO @CONTEXT_INFO 

--do update that will fire the trigger 

SET CONTEXT_INFO 0x0 

hier ist der Teil des Abzugs den Wert abzurufen:

DECLARE @intUserID  int 
     ,@sCONTEXT_INFO varchar(128) 
SELECT @sCONTEXT_INFO=CAST(CONTEXT_INFO() AS VARCHAR) FROM master.dbo.SYSPROCESSES WHERE [email protected]@SPID 

IF LEFT(@sCONTEXT_INFO,9)='intUserID' 
BEGIN 
    SET @intUserID=RIGHT(RTRIM(@sCONTEXT_INFO),LEN(RTRIM(@sCONTEXT_INFO))-10) 
END 
ELSE 
BEGIN 
    RAISERROR('intUserID was not specified',16,1) 
    ROLLBACK TRAN 
    RETURN 
END 

..use the @intUserID 
1

Sie können Variablen nicht an Trigger übergeben. Abhängig davon, wie Benutzer sich mit der Datenbank verbinden, können Sie SYSTEM_USER verwenden, um den aktuellen Benutzer mit der Datenbank verbunden zu bekommen.

0

Warum nicht versuchen:

CREATE TRIGGER trgDataUpdated 
    ON tblData FOR UPDATE 
AS 
BEGIN 
    EXECUTE tbLogUpdate intUserId 
END