Cuando se trabaja con SQL Server, es importante comprender la relación entre los inicios de sesión y los grupos de disponibilidad. En un grupo de disponibilidad, se debe crear un inicio de sesión en todas las réplicas secundarias para garantizar un acceso sin problemas a la base de datos después de un fallo. Sin embargo, muchas veces nos encontramos con problemas donde faltan o están huérfanos los inicios de sesión después de un fallo, lo que resulta en problemas de acceso para los usuarios.
La causa principal de este problema es el Identificador de Seguridad (SID, por sus siglas en inglés) diferente asignado a los inicios de sesión en cada servidor. Cuando ocurre un fallo, el SID del usuario de la base de datos (que coincide con el SID del inicio de sesión en el antiguo primario) será diferente al del inicio de sesión en el nuevo primario. Esto lleva a usuarios huérfanos y fallos de inicio de sesión.
Para evitar este problema, es crucial asegurarse de que el inicio de sesión exista en todos los servidores y que el SID sea idéntico. Además, se recomienda asegurarse de que las contraseñas también coincidan. Una forma de lograr esto es utilizando el Catálogo Encubierto, una herramienta diseñada específicamente para ayudar a resolver este problema.
El Catálogo Encubierto almacena información sobre los inicios de sesión, incluyendo el SID y el hash de la contraseña. Al consultar el Catálogo, puedes identificar fácilmente cualquier inicio de sesión faltante o con SIDs no coincidentes. Aquí tienes un ejemplo de consulta:
SELECT ServerName, LoginName, SID, PasswordHash
FROM Catalogue.Logins
WHERE LoginName = 'David'
Esta consulta te mostrará si el inicio de sesión existe en todos los servidores y si los SIDs coinciden. Si hay algún problema, puedes utilizar los scripts proporcionados para detectar y resolverlos.
Por ejemplo, para encontrar nodos que tengan inicios de sesión faltantes, puedes ejecutar el siguiente script:
SELECT DISTINCT AGs.AGName, Logins.LoginName, AGs2.ServerName AS [Faltante en el Nodo]
FROM #AGs AGs
JOIN Catalogue.Logins Logins ON AGs.ServerName = Logins.ServerName
JOIN #AGs AGs2 ON AGs.AGName = AGs2.AGName
WHERE NOT EXISTS (
SELECT 1
FROM #AGs AGs3
JOIN Catalogue.Logins Logins3 ON AGs3.ServerName = Logins3.ServerName
WHERE AGs3.AGName = AGs.AGName
AND AGs3.ServerName = AGs2.ServerName
AND Logins3.LoginName = Logins.LoginName
)
De manera similar, puedes encontrar inicios de sesión con SIDs o contraseñas no coincidentes utilizando los scripts proporcionados. Estos scripts se pueden ejecutar como parte de una tarea programada para monitorear constantemente tus inicios de sesión y alertarte de cualquier problema.
Vale la pena mencionar que las futuras versiones del Catálogo Encubierto o del Inspector Encubierto pueden incluir estos scripts o proporcionar una forma más fácil de detectar y resolver problemas de inicio de sesión. Mantente atento a las actualizaciones.
Gracias por leer y esperamos que encuentres útiles estos scripts. Puedes encontrar los scripts mencionados en esta publicación de blog en nuestro repositorio de GitHub.