Como enviar un valor hacia un trigger

Al ingresar al sistema si el usuario tiene los permisos necesarios puede crear, modificar o eliminar los registros por lo cual en ciertas tablas e creado un trigger que me guarda en una tabla especial todos los cambios que se realizaron(ya sean UPDATE o DELETE) y todo me corre perfectamente pero lo que no se exactamente como hacer es guardar el nombre del usuario que realizo dicho cambio.

Al principio pensé en tener una tabla con el nombre del usuario activo y de esa manera puedo acceder desde el trigger pero tengo el problema que es un sistema multiusuario por lo cual tendría varios usuarios conectados al mismo tiempo y al no tener un usuario único en ese campo no sabría como valorar quien realizo los cambios(hay alguna forma de almacenar en una tabla temporal todos los usuarios activos y dentro del trigger verificar de alguna manera quien de todos realizo dicho cambio?).

El usuario lo tengo almacenado en una clase al momento en que ingresa al sistema Así que mi pregunta en concreto es como podría tomar ese nombre y hacerlo parte del insert que esta dentro del trigger ya que no se les pueden mandar parámetros como tal.

De igual manera si la solución no esta ni cercana a lo que tengo me gustaría leerlas de igual manera y tratar de hacer los cambios necesarios con tal que funcione

1 respuesta

Respuesta
2

Una pregunta muy interesante ya que nunca me había planteado nada así y me ha costado encontrar una solución, je je.

Veamos, el problema es que a los triggers no podemos pasarles parámetros extras por lo que, para conseguir lo que te propones es necesario dos cosas:

1) Tener una tabla extra para guardar los parámetros que necesitemos

2) Usar el CONTEXT_INFO de TSQL para almacenar el puntero a la fila de nuestra tabla de parámetros y usarlo dentro del trigger.

CONTEXT_INFO permite almacenar hasta 128 bytes de datos binarios a usar en la sesión actual de SQL por lo que es útil para almacenar datos concretos para esta consulta.

Como tiene una limitación de tamaño no podemos arriesgarnos a guardar el nombre de usuario en él por lo que la solución es guardarnos el id de una tabla de parámetros y, en dicha tabla, tener el resto de información necesario

¡Vamos a por el código!

Para empezar creamos una tabla con los datos que necesitemos usar dentro del trigger, por lo que veo solo necesitas el nombre de usuario por lo que te valdría algo así:

CREATE TABLE [dbo].[DatosTrigger](
     [Id] [uniqueidentifier] NOT NULL,
     [NombreUsuario] [nvarchar](max) NULL
) ON [PRIMARY]

En esta tabla guardaremos los usuarios activos por lo que, cuando un usuario inicie la sesión en tu aplicación deberás insertar una nueva fila:

DECLARE @id uniqueidentifier;
SET @id = NEWID();
INSERT INTO DatosTrigger VALUES (@id, 'Nombre del usuario que ha hecho login');

Lo últimos que nos faltaría es que, antes de lanzar la petición del trigger, asignemos al CONTEXT_INFO el id de la tabla "DatosTrigger" relativo al usuario actual.

DECLARE @context_info varbinary(100);
SET @context_info = cast(@id as varbinary(100));
SET CONTEXT_INFO @context_info;

Si ahora hiciéramos un SELECT CONTEXT_INFO() veríamos el binario del GUID que hemos creado para el usuario.

Con esto ya podemos consultar los datos de la tabla "DatosTrigger" desde nuestro trigger de este modo:

CREATE TRIGGER [dbo].[MiTrigger]
 ON [dbo].[MiDB]
 AFTER INSERT, UPDATE
AS 
BEGIN
 DECLARE @id uniqueidentifier;
 SELECT @id = CAST(CONTEXT_INFO() as uniqueidentifier);
 DECLARE @nombreUsuarioActual nvarchar(MAX);
 SELECT @nombreUsuarioActual = NombreUsuario
 FROM DatosTrigger
 WHERE [id] = @id;
-- Y ahora tu código del trigger. En la variable @nombreUsuarioActual tienes el nombre de usuario
END

Con esto más o menos tendrías lo que necesitas (habría que mejorar el código haciendo una comprobación de que CONTEXT_INFO() devuelve valor o que en la tabla "DatosTrigger" existen realmente datos) pero eso ya lo dejo en tus manos.

Espero que te sirva. Y recuerda puntuar y cerrar la pregunta :)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas