2010-04-15 7 views
11

Ho un trigger che si occupa di alcuni dati a fini di registrazione in questo modo:Passare una variabile in un 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 

Come posso passare nella variabile @intUserID nel grilletto sopra, come nel codice seguente:

DECLARE @intUserID int 
SET @intUserID = 10 

UPDATE tblData 
SET Value = @x 

PS: so che non posso passare letteralmente @intUserID al grilletto, è stato usato solo a scopo illustrativo.

risposta

10

Io uso SET CONTEXT_INFO per questo tipo di azione. Questo è un collegamento 2008+, prior link è stato ritirato.

Su SQL Server 2005+, avresti CONTEXT_INFO per leggerlo ma altrimenti devi ottenere dalla colonna context_info in dbo.sysprocesses.

+0

Stavo considerando questo, ma non sembrava la soluzione più elegante. Se è l'unico modo, allora sicuramente lo farò, ma speravo in qualcos'altro :( – Codesleuth

+0

@Codesleuth: sei limitato qui ... – gbn

+1

Sto implementando questo ora. Volevo solo incollare questo link per chiunque altrimenti volendo fare questo in futuro: http://msdn.microsoft.com/en-us/library/aa214382%28SQL.80%29.aspx – Codesleuth

0

Non si passano le variabili ai trigger perché non si è in grado di chiamare i trigger direttamente. Vengono eseguiti a seguito dell'inserimento, della modifica o dell'eliminazione dei dati.

+1

io non cercavo un sì/no risposta qui. Sicuramente c'è un modo per memorizzare informazioni sulla transazione corrente che il trigger può raccogliere? – Codesleuth

3

non è possibile passare una variabile in un trigger.

l'unico modo per ottenere le informazioni nel trigger è essere in grado di selezionarlo in base alle tabelle INSERTED o DELETED o aggiungere una colonna sulla tabella interessata e inserire il valore in quella colonna.

EDIT nel precedente OP domanda postato su questo, hanno detto che non volevano usare CONTEXT_INFO, ma qui si dice che è bene usare, ecco un esempio di utilizzo CONTEXT_INFO:

nella procedura di fare l'aggiornamento

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 

qui è la porzione del grilletto per recuperare il valore:

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

Non puoi passare le variabili ai trigger. A seconda di come gli utenti si connettono al database, è possibile utilizzare SYSTEM_USER per ottenere l'utente corrente connesso al database.

0

perché non provare questo:

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