Hola, chicos,
¡Buenas noches!
En este post hablaré de un error que ocurre al intentar utilizar el comando OPENROWSET u OPENQUERY para acceder a datos de un servidor remoto donde el servidor vinculado utilizado no tiene un usuario fijo y el usuario de conexión no pertenece al rol sysadmin, lo que representa la mayoría de los casos. (otro error reportado por henry mauri.. jajaja)
Mensaje 7416, Nivel 16, Estado 2, Línea 22
Se deniega el acceso al servidor remoto porque no existe ninguna asignación de inicio de sesión.
Este error es muy similar al escenario de "doble salto" que ocurre en Kerberos, donde una aplicación cliente está en la computadora 1, BizTalk RFID está en la computadora 2 y el recurso que requiere las credenciales (como un servidor SQL Server RFIDsink) está en la computadora 3, pero en esta publicación mostraré una solución simplemente usando SQL Server. Si desea profundizar en la solución del problema utilizando Kerberos, lea en esta publicación.
Simulando el error en su entorno
Una forma práctica de simular este problema es crear un nuevo servidor vinculado con el parámetro @useself=N’True’, informando que se utilizará el mismo usuario en ambos extremos de la conexión, que será el usuario actualmente conectado, y luego intentar utilizar este servidor vinculado.
Como ya se mencionó anteriormente, este mensaje de error solo aparece cuando el usuario ejecuta la consulta NO es parte de la función de administrador de sistemas y el usuario de la conexión utiliza la autenticación de SQL Server (en lugar de la autenticación de Windows).
----------------------------------
-- CRIAÇÃO DO LINKED SERVER
----------------------------------
USE [master]
GO
DECLARE @instancia NVARCHAR(200) = N'127.0.0.1\SQL2014'
IF ((SELECT COUNT(*) FROM sys.servers WHERE name = @instancia) > 0)
EXEC master.dbo.sp_dropserver @server=@instancia, @droplogins='droplogins'
EXEC master.dbo.sp_addlinkedserver @server = @instancia, @srvproduct=N'SQL Server'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=@instancia,@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
----------------------------------
-- CRIAÇÃO DA TABELA DE TESTES
----------------------------------
SELECT *
FROM OPENROWSET('SQLNCLI', 'Server=127.0.0.1;Trusted_Connection=yes;', 'SELECT * FROM Testes.dbo.Teste') AS a

Cómo resolver el problema
Por lo que mencioné anteriormente, está claro que si el usuario que realiza la conexión se agrega al rol de administrador de sistemas, este problema dejará de ocurrir, pero ni siquiera lo considero una solución. Otorgar privilegios (incluso más que los de administrador de sistemas) solo para detener mensajes de error nunca es una solución.
Tampoco estoy muy a favor de arreglar el nombre de usuario y la contraseña en el servidor vinculado, de modo que todos los usuarios con acceso al servidor puedan utilizar este servidor vinculado de forma imposible de rastrear. Marque siempre la opción "Realizarse utilizando el contexto de seguridad actual del inicio de sesión" en LinkedServer.

Una buena solución sería utilizar la Autenticación de Windows, pero como el equipo de desarrollo de la empresa donde ocurrió este problema ni siquiera consideró cambiar la autenticación de todas las aplicaciones a la Autenticación de Windows, la mejor solución que encontré para este problema fue crear un nuevo usuario solo para usos de OPENROWSET y OPENQUERY, con acceso restringido solo a consultas realizadas con estos dos comandos (que son muy pocos) y establecer este nombre de usuario y contraseña en OPENROWSET, quedando así:
SELECT *
FROM OPENROWSET('SQLNCLI', 'server=127.0.0.1\SQL2014;Uid=Usuario_Teste;Pwd=aaa', 'SELECT * FROM Testes.dbo.Teste') AS a

¡Y eso es todo, amigos!
Si conoces una solución diferente a este problema, deja tu sugerencia en los comentarios.
Un abrazo y ¡hasta luego!
Comentários (0)
Carregando comentários…