2010-04-15 18 views
11

Tengo un trigger que se ocupa de algunos datos para fines de registro, así:pasar una variable en un disparador

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 

¿Cómo puedo pasar en la variable @intUserID en el gatillo superior, como en el siguiente código:

DECLARE @intUserID int 
SET @intUserID = 10 

UPDATE tblData 
SET Value = @x 

PD: sé que no puedo pasar, literalmente, en @intUserID al disparador, se usa sólo para fines de ilustración.

Respuesta

10

Uso SET CONTEXT_INFO para este tipo de acción. Es un enlace 2008+, prior link ha sido retirado.

En SQL Server 2005+, tendría CONTEXT_INFO para leerlo pero, de lo contrario, debe obtener desde la columna context_info en dbo.sysprocesses.

+0

Estaba considerando esto, pero no parecía la solución más elegante. Si es la única manera, entonces seguro que lo haré, pero esperaba algo más :( – Codesleuth

+0

@Codesleuth: estás limitado aquí ... – gbn

+1

Estoy implementando esto ahora. Solo quería pegar este enlace para cualquier persona de lo contrario, querer hacer esto en el futuro: http://msdn.microsoft.com/en-us/library/aa214382%28SQL.80%29.aspx – Codesleuth

0

No pasa las variables a los desencadenadores porque no puede invocar activadores directamente. Se ejecutan como resultado de la inserción, modificación o eliminación de datos.

+1

yo no estaba buscando una respuesta sí/no aquí. ¿Seguramente hay una forma de almacenar información contra la transacción actual que el disparador puede recoger? – Codesleuth

3

no se puede pasar una variable a un disparador.

la única manera de obtener la información en el desencadenante es poder SELECCIONARla en función de las tablas INSERTADA o ELIMINADA o agregar una columna en la tabla afectada y poner el valor en esa columna.

EDITAR en el anterior OP pregunta publicada acerca de esto, ellos dijeron que no querían utilizar CONTEXT_INFO, pero aquí dicen que está bien usar, por lo que aquí es un ejemplo de uso CONTEXT_INFO:

en el procedimiento de hacer la actualización

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 

aquí está la parte del gatillo para recuperar el valor:

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

No puedes pasar variables a los disparadores. Según cómo se conecten los usuarios a la base de datos, puede usar SYSTEM_USER para conectar al usuario actual a la base de datos.

0

por qué no probar esto:

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