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

Este artículo le ayudará a resolver el problema en el que se puede producir un error en el trabajo del Agente SQL que ejecuta una consulta distribuida 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 generar 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 " <provider name> " para el servidor vinculado " <Linkedserver Name> " devolvió el mensaje de inicio de sesión agotado ".
    El proveedor OLE DB " <provider name> " para el servidor vinculado "" <Linkedserver Name> "devolvió un error al establecer una conexión con el servidor. Cuando se conecta a SQL Server 2005, este error puede deberse a que, en la configuración predeterminada, SQL Server no permite conexiones remotas. ".
    Msj 65535, nivel 16, estado 1, línea 0
    Interfaces de red de SQL: error al localizar el servidor o la instancia especificada [xFFFFFFFF].

  • Msj 782, nivel 16, estado 1, línea 0
    Proveedor de SSL: no hay credenciales disponibles en el paquete de seguridad
    Proveedor OLE DB " <provider name> "mensaje devuelto por el servidor vinculado" "el <Linkedserver Name> cliente no puede establecer conexión".

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

  • Proveedor OLE DB "SQLNCLI" para el servidor vinculado " <Linkedserver Name> " devuelto mensaje "tiempo de espera agotado de inicio de sesión".
    El proveedor OLE DB "SQLNCLI" para el servidor vinculado "" <Linkedserver Name> "devolvió un mensaje" se ha producido un error al establecer una conexión con el servidor. Cuando se conecta a SQL Server 2005, este error puede deberse a que, en la configuración predeterminada, SQL Server no permite conexiones remotas. ".
    Msj 65535, nivel 16, estado 1, línea 0
    Interfaces de red de SQL: error al localizar el servidor o la instancia especificada [xFFFFFFFF].

  • Msj 782, nivel 16, estado 1, línea 0
    Proveedor SSL: no hay credenciales disponibles en el paquete de seguridad proveedor OLE DB "SQLNCLI10" para el servidor vinculado " <Linkedserver Name> " mensaje devuelto "el cliente no puede establecer conexión".

  • Msj 7437, nivel 16, estado 1, línea 3
    Los servidores vinculados no se pueden usar en la 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 con suplantación mediante la Execute as Login instrucción T-SQL.

Causa

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

Nota

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

Solución alternativa

Importante

La siguiente solución temporal requiere que defina un inicio de sesión de servidor local explícito para las asignaciones de inicio de sesión del servidor remoto mediante la página seguridad de 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 debe estar ya establecido en modo mixto o debe cambiarse a modo mixto antes de usar la solución que se describe a continuación.

Si un paso del trabajo T-SQL es propiedad de un usuario que no forma parte del rol del servidor sysadmin y si el paso contiene una consulta distribuida, siga estos pasos para asegurarse de que no se produzcan errores en los trabajos o las consultas:

  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 nuevo o existente 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 tiene acceso en la consulta distribuida. Para obtener más información, consulte propiedades de servidor vinculado (página seguridad).

Más información

A veces, 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 ha iniciado sesión previamente en el sistema remoto y el sistema sigue conservando abierta una conexión establecida por el uso remoto. No se debe esperar que la consulta funcione siempre.

Pasos para reproducir el 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 usando un inicio de sesión que es 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 sea 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 el error mencionado en la sección síntomas del artículo.

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 se trata de 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 producir un error.