sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo arreglar "El servidor no está configurado para ACCESO A DATOS" en SQL Server

El error "El servidor no está configurado para ACCESO A DATOS" en SQL Server es un error común cuando se intenta ejecutar una consulta distribuida en un servidor que tiene su configuración de acceso a datos deshabilitada.

El error tendrá el nombre del servidor al que intenta acceder. Por ejemplo, si el nombre de su servidor es SQL01, el error será algo como esto:

Msg 7411, Level 16, State 1, Line 1
Server 'SQL01' is not configured for DATA ACCESS.

El "acceso a datos" es una configuración que habilita y deshabilita un servidor vinculado para el acceso a consultas distribuidas.

Una causa común de este error es cuando intenta ejecutar OPENQUERY() contra el servidor local. Si realmente desea ejecutar OPENQUERY() contra el servidor, deberá asegurarse de que el acceso a los datos esté habilitado para ese servidor, incluso si es su servidor local.

Este artículo explica un ejemplo de cómo ejecutar una consulta que genera el error, verificar si un servidor tiene habilitado el acceso a datos, habilitar el acceso a datos, volver a verificar y finalmente ejecutar la consulta nuevamente. Si no desea recorrer todo el escenario, desplácese hacia abajo hasta el encabezado "La solución" a continuación. Como alternativa, consulte Cómo habilitar y deshabilitar el acceso a datos en SQL Server para ver un ejemplo rápido de cómo habilitar y deshabilitar el acceso a datos.

Consulte también 2 formas de verificar si el acceso a datos está habilitado si solo desea verificar la configuración.

De lo contrario, sigue leyendo:todo está cubierto en este artículo.

Ejemplo 1:el error

Aquí hay un ejemplo de un escenario que causa el error.

SELECT 
  COLUMN_NAME,
  TYPE_NAME,
  PRECISION,
  LENGTH
FROM 
OPENQUERY (
  sqlserver007,
  'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;'
);

Resultado:

Msg 7411, Level 16, State 1, Line 1
Server 'sqlserver007' is not configured for DATA ACCESS.

En este caso, intento ejecutar OPENQUERY() contra mi propio servidor local llamado sqlserver007 , pero falla, porque el servidor no tiene habilitado el acceso a datos.

Quizás se pregunte por qué estoy ejecutando OPENQUERY() contra mi propio servidor cuando podría simplemente llamar al procedimiento almacenado localmente? Eso es cierto, pero en este caso el procedimiento almacenado devuelve más columnas de las que necesito, así que pensé que era bastante fácil ejecutarlo a través de OPENQUERY() para poder elegir las columnas que necesito. ¡Do! ¡No es tan fácil como pensaba!

Pero este contratiempo menor es bastante fácil de resolver, así que continuemos.

Ejemplo 2:comprobar la configuración de acceso a datos

Podemos ver si un servidor tiene habilitado el acceso a datos revisando sys.servers vista del catálogo del sistema.

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Resultado:

+--------------+--------------------------+
| name         | is_data_access_enabled   |
|--------------+--------------------------|
| sqlserver007 | 0                        |
| Homer        | 1                        |
+--------------+--------------------------+

En este caso, el acceso a los datos está habilitado para el servidor llamado Homer , pero no para el servidor llamado sqlserver007 .

En caso de que esté interesado, el sp_helpserver El procedimiento almacenado del sistema también nos dará esta información:

EXEC sp_helpserver;

Resultado:

+--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+
| name         | network_name                   | status                           | id   | collation_name   | connect_timeout   | query_timeout   |
|--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------|
| sqlserver007 | sqlserver007                   | rpc,rpc out,use remote collation | 0    | NULL             | 0                 | 0               |
| Homer        | NULL                           | data access,use remote collation | 1    | NULL             | 0                 | 0               |
+--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+

Si miras en el estado columna, verá que acceso a datos se incluye en la fila de Homer , pero no para sqlserver007 .

Ejemplo 3:la solución

Aquí se explica cómo permitir el acceso a los datos.

EXEC sp_serveroption
  @server = 'sqlserver007',
  @optname = 'DATA ACCESS',
  @optvalue = 'TRUE';

Resultado:

Commands completed successfully.

Ejemplo 4:vuelva a comprobar la configuración

Ahora podemos volver a comprobar la configuración de acceso a datos.

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Resultado:

+--------------+--------------------------+
| name         | is_data_access_enabled   |
|--------------+--------------------------|
| sqlserver007 | 1                        |
| Homer        | 1                        |
+--------------+--------------------------+

Ahora mi servidor local tiene habilitado el acceso a datos.

Y así es como se ve con sp_helpserver :

EXEC sp_helpserver;

Resultado:

+--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------+
| name         | network_name                   | status                                       | id   | collation_name   | connect_timeout   | query_timeout   |
|--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------|
| sqlserver007 | sqlserver007                   | rpc,rpc out,data access,use remote collation | 0    | NULL             | 0                 | 0               |
| Homer        | NULL                           | data access,use remote collation             | 1    | NULL             | 0                 | 0               |
+--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------+

Ahora podemos ver que acceso a datos se ha agregado bajo el estado columna.

Ejemplo 5:volver a ejecutar la consulta original

Ahora que hemos habilitado el acceso a datos, volvamos a ejecutar la consulta original.

SELECT 
  COLUMN_NAME,
  TYPE_NAME,
  PRECISION,
  LENGTH
FROM 
OPENQUERY (
  sqlserver007,
  'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;'
);

Resultado:

+--------------------------+-------------+-------------+------------+
| COLUMN_NAME              | TYPE_NAME   | PRECISION   | LENGTH     |
|--------------------------+-------------+-------------+------------|
| CityID                   | int         | 10          | 4          |
| CityName                 | nvarchar    | 50          | 100        |
| StateProvinceID          | int         | 10          | 4          |
| Location                 | geography   | 2147483647  | 2147483647 |
| LatestRecordedPopulation | bigint      | 19          | 8          |
| LastEditedBy             | int         | 10          | 4          |
| ValidFrom                | datetime2   | 27          | 54         |
| ValidTo                  | datetime2   | 27          | 54         |
+--------------------------+-------------+-------------+------------+

Esta vez se ejecuta sin errores.

Aunque este ejemplo usó un OPENQUERY() a mi servidor local, se aplicaría la misma solución si intentara ejecutar una consulta distribuida en un servidor vinculado (remoto). Independientemente, los pasos anteriores todavía se realizan en mi servidor local (no es necesario tocar el servidor remoto).