sql >> Base de Datos >  >> RDS >> Sqlserver

Desencadenadores de inicio de sesión en SQL Server

Un activador de inicio de sesión, como sugiere el nombre, es un activador que se activa en respuesta a un evento LOGON en SQL Server.

En términos simples, un activador de inicio de sesión se activa cada vez que alguien intenta establecer una nueva conexión con un servidor de base de datos. El activador se activa después de que se completa la autenticación del usuario y la fase de inicio de sesión, pero antes de que se inicie realmente la sesión del usuario.

Ventajas de los activadores de inicio de sesión

Existen varias ventajas de los activadores de inicio de sesión:

  • Seguimiento de la actividad de inicio de sesión
    Los activadores de inicio de sesión se pueden utilizar para realizar un seguimiento de la actividad de inicio de sesión que tiene lugar en el servidor de la base de datos. Por ejemplo, se puede usar para mantener una lista de todos los usuarios que iniciaron sesión en el servidor de la base de datos dentro del período de tiempo especificado.
  • Restricción del número de conexiones totales
    Demasiados inicios de sesión en la base de datos pueden afectar el rendimiento de una base de datos, especialmente cuando una gran cantidad de usuarios acceden a una base de datos. En casos como estos, se pueden usar disparadores de inicio de sesión para verificar el número total de inicios de sesión que ya existen antes de que se permitan más.
  • Restricción del número de sesiones por conexión
    Se puede usar un activador de inicio de sesión para limitar el número de sesiones por conexión. Cada vez que un usuario intenta establecer una nueva sesión, un disparador de inicio de sesión puede verificar la cantidad de sesiones que ya están activas para ese inicio de sesión y puede restringir cualquier sesión nueva si ha excedido un límite.

Antes de comenzar, asegúrese de tener una copia de seguridad completa.

Acceso a conexiones de usuarios activos

El siguiente script devuelve todas las conexiones de usuario activas a una base de datos.

SELECT * FROM sys.dm_exec_sessions

sys.dm_exec_sessions es una vista del sistema que devuelve todas las conexiones de usuario activas. El resultado de la consulta anterior se ve así:

La salida contiene información detallada sobre todas las conexiones activas. Estamos interesados ​​en dos de esas columnas:is_user_process y original_login_name.
La primera nos dice si la conexión ha sido realizada por un proceso de usuario o no, y la primera contiene información sobre el nombre de la conexión que realizó el inicio de sesión.

Ejecute la siguiente consulta:

SELECT is_user_process, original_login_name, *
FROM sys.dm_exec_sessions ORDER BY login_time DESC

La consulta anterior devuelve is_user_process y original_login_name como la primera y la segunda columna junto con el resto de todas las columnas de la vista sys.dm_exec_sessions. Ordena los resultados por orden descendente del tiempo de inicio de sesión. Por lo tanto, las conexiones más recientes aparecen en la parte superior.

En el resultado, desplácese hacia abajo hasta las filas donde la columna is_user_process contiene un 1.

En mi caso, tengo dos filas como las que se muestran en el siguiente resultado:

En la columna original_login_name, puede ver el nombre de la conexión que realizó el inicio de sesión (En este caso, el nombre de mi PC). En la columna program_name, puede ver el tipo de conexión. En el caso anterior, la conexión con session_id 51 es la conexión con SQL Server Object Explorer. La conexión con session_id 52 es la conexión para la única ventana de consulta en la que se ejecuta el script. Si tiene dos ventanas de consulta abiertas, verá un total de tres conexiones de usuario aquí, y así sucesivamente.

Para contar el número total de conexiones realizadas por los procesos de usuario, ejecute la siguiente consulta:

SELECT COUNT(*) FROM sys.dm_exec_sessions 
WHERE is_user_process = 1

La consulta anterior devuelve dos ya que solo tengo dos conexiones user_process en mi servidor.

Activador de inicio de sesión para limitar el número de inicios de sesión

Vamos a crear un activador de inicio de sesión simple que limite el número total de inicios de sesión que puede realizar una conexión a 3. Si la conexión intenta iniciar sesión en el servidor de la base de datos por cuarta vez, el activador de inicio de sesión revierte el proceso de inicio de sesión.

El script para este activador es el siguiente:

CREATE TRIGGER tr_CheckLogin
ON ALL SERVER
FOR LOGON
AS
BEGIN
	DECLARE @login NVARCHAR(100)
	SET @login = ORIGINAL_LOGIN()

	IF
	(SELECT COUNT(*) FROM sys.dm_exec_sessions 
	WHERE is_user_process = 1
	AND original_login_name = @login) > 3
	BEGIN
	Print 'More than three connections not allowed - Connection by ' + @login + ' Failed'
	ROLLBACK
	END

END

En el script anterior, creamos un disparador llamado tr_CheckLogin. El alcance del activador se establece en el servidor.

Puede ver los detalles del activador yendo a Explorador de objetos -> Objetos del servidor -> Activadores, como se muestra en la siguiente figura:

El activador se activa cada vez que se produce el evento LOGON, es decir, una conexión intenta iniciar sesión en el servidor. Fíjate bien en el cuerpo del gatillo.

La función ORIGINAL_LOGIN devuelve el nombre del proceso de usuario o la conexión que intenta iniciar sesión en el servidor. A continuación, se cuenta el número total de conexiones con el mismo nombre utilizando la vista sys.dm_exec_session. Si el número de conexiones es superior a 3, el inicio de sesión se revierte y se imprime una declaración para el usuario que dice:"No se permiten más de tres conexiones:la conexión por 'nombre_conexión' falló".

Para verificar esto, abra una nueva ventana de consulta en el estudio de administración de SQL Server

Nota:Anteriormente, había dos conexiones abiertas, una para SQL Server Management Studio y otra para la ventana Consulta.

Cuando intente abrir una nueva ventana de consulta, el activador tr_CheckLogin se activará, pero dado que el número total de inicios de sesión será tres en este momento, el activador no revertirá el inicio de sesión.

Para verificar que el número total de conexiones por user_process, ejecute la siguiente consulta:

SELECT COUNT(*) FROM sys.dm_exec_sessions 
WHERE is_user_process = 1

Ahora, hay un total de 3 conexiones de usuario como se muestra en el resultado:

Ahora intente nuevamente crear una nueva conexión abriendo una nueva ventana de consulta en el estudio de administración de SQL Server.

Verá el siguiente error:

El error dice que el inicio de sesión falló para "DESKTOP-GLQ5VRA\Mani" (el nombre de mi PC) debido a la ejecución del disparador. Básicamente, el disparador que creamos no permitía la conexión. ¡Esperar! Pero, ¿dónde está el mensaje de error que imprimimos? No podemos verlo aquí en el cuadro de mensaje anterior. El mensaje de error personalizado que escribimos en el disparador se puede ver en el registro de errores.

Para ver el registro de errores, ejecute el siguiente script:

EXECUTE sp_readerrorlog

Desplácese hacia abajo en el registro de errores hasta que encuentre el mensaje personalizado que escribió para el activador de inicio de sesión. La siguiente captura de pantalla muestra el registro de errores de mi servidor de base de datos. El mensaje personalizado se puede ver en el registro de errores:

Lecturas adicionales:

  • YouTube:activadores de inicio de sesión de SQL Server
  • Microsoft.com:activadores de inicio de sesión
  • Estudios de SQL:escapar de un disparador de inicio de sesión fuera de control