vincular vinculado sp_addlinkedserver servidores servidor otro equipo entre desde crear consulta conectarse conectar sql-server-2005 tsql transactions distributed-transactions

sql-server-2005 - vinculado - sp_addlinkedserver



¿Cómo configuro la autenticación entre servidores vinculados? (2)

Estoy intentando probar una prueba de concepto de que puedo ejecutar una transacción distribuida en dos servidores SQL vinculados, vinculados mediante sp_addlinkedserver; sus nombres son Servidor1 y Servidor2, ambos se ejecutan en instancias predeterminadas. Cada servidor tiene una sola base de datos, Origen y Destino, respectivamente, y la base de datos de destino contiene una sola tabla llamada Salida, es decir,

Server1.Source Server2.Destination.Output

La tabla OUTPUT tiene la siguiente estructura:

OUT_PKEY int identity(1,1) primary key, OUT_TEXT nvarchar(255)

Desde Server1 he llamado a sp_addlinkedserver ''Server2'' para vincular las dos bases de datos y he intentado ejecutar la siguiente consulta para probar que el enlace realmente funciona:

Select * From Server2.Destination.dbo.Output

Me devolvieron la siguiente excepción:

Se deniega el acceso al servidor remoto porque no existe mapeo de inicio de sesión.

Bastante justo, así que desde Server1, ejecuto sp_addlinkedsrvlogin ''Server2'' que según la documentación dice que debe tomar las credenciales de usuario de quien ejecuta la consulta de forma remota (es decir, desde el Servidor1) y aplicar esas credenciales al Servidor2. Esto implica que, dado que estoy conectado al Servidor1 usando la Autenticación de Windows, esto debería significar que mis Credenciales de Windows también se aplican al Servidor2.

Ahora el mensaje de excepción cambia a:

Error de inicio de sesión para el usuario ''NT AUTHORITY / ANONYMOUS LOGON''.

Habiendo buscado en Google esta excepción, no se me ocurrió nada útil que me indicara la dirección correcta. ¿Qué me estoy perdiendo? Esperaría [si el inicio de sesión fallase en absoluto] la excepción para hacer referencia a mis Credenciales de Windows, no a las credenciales de inicio de sesión anónimas.

Parece que una vez que obtenga el enlace en funcionamiento, las transacciones distribuidas mismas deberían ser un asunto bastante simple: la documentación implica que solo necesito asegurarme de que el Servicio DTC se esté ejecutando en el Servidor1 y de que las consultas se ejecuten en el Servidor1 que se tramitará. a través del enlace:

  • Incluir SET XACT_ABORT ON antes de inicializar mi transacción distribuida
  • Uso BEGIN TRANSACTION DISTRIBUTED en lugar de BEGIN TRANSACTION
  • Si deseo hacer referencia a una instancia no predeterminada de SQL Server en Server2, reemplazo cualquier instancia del nombre Server2 en mi consulta con [Server2 / InstanceName]

Mis preguntas son estas:

  • ¿Cómo supero este problema de inicio de sesión? El procedimiento almacenado sp_addlinkedsrvlogin solo no parece estar haciendo el truco.
  • ¿Es tan simple como eso ejecutar la transacción distribuida como lo implica la documentación?

TIA


Si está en un dominio, la configuración debe ser "Crear utilizando el contexto de seguridad actual del inicio de sesión", pero hay un paso más: debe otorgar un SPN a cada uno de los servidores involucrados en la transacción.

Suponiendo que está ejecutando los Servicios SQL en ambos servidores como usuario de dominio (que necesitará para hacer que esto funcione, LocalSystem no lo hará), estas son las instrucciones que necesitará:

http://technet.microsoft.com/en-us/library/bb735885.aspx

Recuerde que el usuario necesitará un SPN para ambos servidores, pero no para el cliente; por ejemplo, si va desde el cliente -> servidor1 -> servidor2, la cuenta del Servicio SQL necesitará un SPN para ambos servidores1 y servidor2.

Si está confundido (es un proceso confuso), publique un comentario y le aclararé las instrucciones.


Suponiendo que estos servidores están ambos en el mismo dominio, ¿ha habilitado la delegación de confianza para permitir que su servidor pase las credenciales al servidor de destino? Quitará el objeto de Active Directory para el servidor y irá a la pestaña Delegación y seleccionará "Confiar en esta computadora para delegar en servicios específicos solamente" y luego ingresará los detalles de SQL Server a los que el servidor puede transmitir credenciales:

Tipo de servicio = MSSQLSvc
Usuario / Computadora = YourTargetServer.Your.Domain
Puerto = 1433

Lamentablemente, muchos de estos tipos de problemas de autenticación con servidores vinculados requieren un reinicio para que tengan pleno efecto (por lo tanto, si se trata de servidores de producción, es difícil solucionarlos durante el día).

En lo que respecta a las transacciones distribuidas, si finalmente logras que la conexión del servidor vinculado funcione correctamente, las transacciones distribuidas funcionan muy bien. Aunque lo siguiente que probablemente encuentres una vez que lo tengas funcionando es encontrar la gran falla de que no puedes usar ninguna forma de SCOPE_IDENTITY (), @@ IDENTITY, etc. para recuperar claves primarias después de insertar algo en una base de datos vinculada . Pero ese es otro problema con sus propias soluciones divertidas ...