Información de contexto:
- Estoy creando una colección de tablas de auditoría para realizar un seguimiento de las actualizaciones y eliminaciones en un conjunto de tablas de datos para mi aplicación.
- Los registros de auditoría se crean a través de disparadores.
- El DML en la base de datos de mi aplicación generalmente vendrá de un inicio de sesión que un servicio utiliza para ingresar a la base de datos. Debido a esto, creo que el resultado
SYSTEM_USER
siempre será el mismo cuando se llama en un disparador. - Mi aplicación no almacena datos de usuario actualmente, aunque
UserId
se le asigna una cadena cada vez que se realiza DML (se realiza exclusivamente en procedimientos almacenados).
El problema con el que me encontré es que cuando un usuario elimina un registro, quiero saber quién lo hizo. Debido a que se realizará mediante el mismo inicio de sesión, no quiero ver que todas las acciones se realizaron por servicio, quiero ver qué usuario lo hizo. Esto no es un problema en una actualización, porque tenemos ModifiedBy
columnas que se actualizarán a través de actualizaciones enviadas UserId
.
La pregunta es: ¿hay alguna manera de configurar SYSTEM_USER
u obtener la información del usuario en el activador cuando se ejecuta una eliminación?
La "mejor" idea que tengo en este momento, aunque no estoy seguro de si es una buena idea todavía, es que en el servicio verifico si el UserId
usuario actual está en la base de datos, y si no es así, creo un usuario objeto para ellos. Luego ejecute procedimientos almacenados con EXECUTE AS User = @UserId
. Luego, cuando DML se realiza en el procedimiento almacenado y se dispara el disparador, SYSTEM_USER
debe devolver al usuario de EXECUTE AS
.