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).