Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Este artículo le ayuda a resolver el problema en 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) podría 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 "<Nombre> del servidor vinculado" 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 "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".
Mensaje 65535, nivel 16, estado 1, línea 0
Interfaces de red DE SQL: error al localizar el servidor o la instancia especificados [xFFFFFFFF]. -
Mensaje 782, nivel 16, estado 1, línea 0
Proveedor SSL: no hay credenciales disponibles en el paquete de seguridad
El proveedor OLE DB "<nombre> del proveedor" para el servidor vinculado "<Nombre> del servidor vinculado" devolvió el mensaje "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 "<Nombre> del servidor vinculado" 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 "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".
Mensaje 65535, nivel 16, estado 1, línea 0
Interfaces de red DE SQL: error al localizar el servidor o la instancia especificados [xFFFFFFFF]. -
Mensaje 782, nivel 16, estado 1, línea 0
Proveedor SSL: no hay credenciales disponibles en el proveedor OLE DB del paquete de seguridad "SQLNCLI10" para el servidor vinculado "<Nombre> de servidor vinculado" mensaje devuelto "El cliente no puede establecer la conexión". -
Mensaje 7437, nivel 16, estado 1, línea 3
Los servidores vinculados no se pueden usar en 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 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 por diseño. Para obtener más información, vea los temas siguientes 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 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 de 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 debe cambiarse al modo mixto antes de usar la solución alternativa.
Si un paso de trabajo de T-SQL es propiedad de 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 las consultas no generan errores:
- 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.
- Asegúrese de que el inicio de sesión tiene privilegios suficientes para ejecutar varios módulos en el servidor remoto al que se tiene acceso en la consulta distribuida. Para obtener más información, vea Propiedades del 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 se pueden ejecutar 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 debería esperar que la consulta funcione todo el tiempo.
Pasos para reproducir el comportamiento
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
Ejecute la consulta siguiente 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
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
Este paso produce un error con el error mencionado en la sección Síntomas .
Nota:
OPENROWSET
Las funciones y OPENDATASOURCE
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 producir errores.