El trabajo del Agente SQL que ejecuta una consulta distribuida puede producir un error con mensajes de error 65535, 782 o 7437

Este artículo le ayuda a resolver el problema por el que el trabajo del Agente SQL que ejecuta una consulta distribuida podría producir un error con mensajes de error 65535, 782 o 7437.

Versión del producto original: SQL Server
Número de KB original: 2492477

Síntomas

Un trabajo del Agente SQL que ejecuta una consulta distribuida (servidor vinculado) puede producir un error con uno de los mensajes de error similares a los siguientes, cuando el propietario del trabajo no es miembro del rol de servidor sysadmin :

  • El proveedor OLE DB "<nombre> del proveedor" para el servidor vinculado "<Linkedserver Name>" devolvió el mensaje "Tiempo de espera de inicio de sesión expirado".
    El proveedor OLE DB "<nombre> del proveedor" para el servidor vinculado ""<Nombre> del servidor vinculado" devolvió el mensaje "Se ha producido un error al establecer una conexión con el servidor. Al conectarse a SQL Server 2005, este error puede deberse al hecho de que en la configuración predeterminada SQL Server no permite conexiones remotas".
    Msg 65535, Level 16, State 1, Line 0
    Interfaces de red de SQL: error al localizar el servidor o la instancia especificados [xFFFFFFFF].

  • Msg 782, Level 16, State 1, Line 0
    Proveedor SSL: no hay credenciales disponibles en el paquete de seguridad
    Proveedor OLE DB "<provider name>" para el servidor vinculado "<Linkedserver Name>" devolvió el mensaje "Client unable to establish connection" (El cliente no puede establecer la conexión).

Por ejemplo, en un entorno de SQL Server 2008, los mensajes de error pueden ser similares a los siguientes:

  • El proveedor OLE DB "SQLNCLI" para el servidor vinculado "<Linkedserver Name>" devolvió el mensaje "Tiempo de espera de inicio de sesión expirado".
    El proveedor OLE DB "SQLNCLI" para el servidor vinculado ""<Nombre> del servidor vinculado" devolvió el mensaje "Se ha producido un error al establecer una conexión con el servidor. Al conectarse a SQL Server 2005, este error puede deberse al hecho de que en la configuración predeterminada SQL Server no permite conexiones remotas".
    Msg 65535, Level 16, State 1, Line 0
    Interfaces de red de SQL: error al localizar el servidor o la instancia especificados [xFFFFFFFF].

  • Msg 782, Level 16, State 1, Line 0
    Proveedor SSL: no hay credenciales disponibles en el proveedor OLE DB del paquete de seguridad "SQLNCLI10" para el servidor vinculado "<Nombre> del servidor vinculado" que devuelve el mensaje "El cliente no puede establecer la conexión".

  • Msg 7437, Level 16, State 1, Line 3
    Los servidores vinculados no se pueden usar bajo suplantación sin una asignación para el inicio de sesión suplantado.

También puede ver el mismo comportamiento al usar Openquery o al ejecutar una consulta distribuida mediante la suplantación a través de la Execute as Login instrucción T-SQL.

Causa

El paso de trabajo de Transact-SQL se ejecuta como propietario del paso de trabajo si el propietario del paso de trabajo no es miembro del rol fijo de servidor sysadmin . El Agente SQL usa Execute as Login para ejecutar el paso de trabajo en el contexto del propietario del paso de trabajo. No se puede usar la EXECUTE AS instrucción a través de los límites del servidor. Este comportamiento es una característica del diseño de la aplicación. Para obtener más información, consulte los temas siguientes en SQL Server Libros en pantalla:

Nota:

La misma causa se aplica al escenario en el que intenta cambiar manualmente el contexto de ejecución de una consulta distribuida en Management Studio mediante la EXECUTE AS instrucción .

Solución alternativa

Importante

La siguiente solución alternativa requiere que defina un inicio de sesión de servidor local explícito en asignaciones de inicio de sesión del servidor remoto mediante la página Seguridad en Propiedades del objeto de servidor vinculado. Dado que la columna Usuario remoto debe ser un inicio de sesión de autenticación de SQL Server en el servidor remoto, el modo de autenticación del servidor remoto ya debe establecerse en modo mixto o cambiarse al modo mixto antes de usar la solución alternativa.

Si un paso de trabajo de T-SQL pertenece a un usuario que no forma parte del rol de servidor sysadmin y si el paso contiene una consulta distribuida, realice los pasos siguientes para asegurarse de que los trabajos o consultas no producen errores:

  1. Cree una asignación para cada uno de los propietarios del paso de trabajo en el servidor local a un inicio de sesión existente o nuevo en el servidor remoto.
  2. Asegúrese de que el inicio de sesión tiene privilegios suficientes para ejecutar varios módulos en el servidor remoto a los que se accede en la consulta distribuida. Para obtener más información, vea Propiedades del servidor vinculado (página Seguridad).

Más información

En ocasiones, es posible que observe que las consultas descritas en cualquiera de los escenarios de la sección Síntomas pueden ejecutarse correctamente. Esto suele ocurrir cuando el usuario suplantado había iniciado sesión anteriormente en el sistema remoto y el sistema todavía ha mantenido abierta una conexión establecida por el usuario remoto. No debe esperar que la consulta funcione todo el tiempo.

Pasos para reproducir este comportamiento

  1. En la instancia de SQL, cree un servidor vinculado a otra instancia de SQL mediante SQL Server Management Studio (SSMS) o el siguiente script.

    EXEC master.dbo.sp_addlinkedserver @server = <server name>, @srvproduct=N'SQL Server'
    /* For security reasons the linked server remote logins password is changed with ######## */
    EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=<servername> ,
    @useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
    
  2. Ejecute la siguiente consulta en SSMS mediante un inicio de sesión que sea miembro del rol de servidor sysadmin y asegúrese de que funciona correctamente.

    SELECT * FROM <servername>.master.sys.sysobjects
    
  3. Ahora cambie el contexto de la consulta a una cuenta que no es sysadmin y ejecute la misma consulta.

    EXECUTE AS login='Domain\Login1'
    GO
    SELECT suser_sname()
    GO
    SELECT * FROM <servername>.master.sys.sysobjects
    GO
    

En este paso se produce un error mencionado en la sección Síntomas .

Nota:

OPENROWSET y OPENDATASOURCE las funciones no se ven afectadas por este problema, ya que estas funciones incluyen las credenciales como parámetros.
BEGIN DISTRIBUTED TRANSACTION es una instrucción independiente que no obtiene sus propias credenciales y no se ve afectada por este problema. Sin embargo, si la seguridad del servidor vinculado no está configurada correctamente, estas instrucciones pueden seguir generando errores.