L'errore "Il server non è configurato per l'ACCESSO AI DATI" in SQL Server è un errore comune quando si tenta di eseguire una query distribuita su un server con l'impostazione di accesso ai dati disabilitata.
L'errore avrà il nome del server a cui stai tentando di accedere. Ad esempio, se il nome del tuo server è SQL01, l'errore leggerà qualcosa del genere:
Msg 7411, Level 16, State 1, Line 1 Server 'SQL01' is not configured for DATA ACCESS.
"Accesso ai dati" è un'impostazione che abilita e disabilita un server collegato per l'accesso a query distribuite.
Una causa comune di questo errore è quando tenti di eseguire OPENQUERY()
contro il server locale. Se vuoi davvero eseguire OPENQUERY()
rispetto al server, dovrai assicurarti che l'accesso ai dati sia abilitato per quel server, anche se è il tuo server locale.
Questo articolo illustra un esempio di esecuzione di una query che genera l'errore, verifica se un server ha l'accesso ai dati abilitato, abilita l'accesso ai dati, ricontrolla e infine esegue di nuovo la query. Se non vuoi percorrere l'intero scenario, scorri verso il basso fino all'intestazione "La soluzione" di seguito. In alternativa, consulta Come abilitare e disabilitare l'accesso ai dati in SQL Server per un rapido esempio di abilitazione e disabilitazione dell'accesso ai dati.
Dai un'occhiata anche a 2 modi per verificare se l'accesso ai dati è abilitato se vuoi solo controllare l'impostazione.
Altrimenti, continua a leggere:è tutto trattato in questo articolo.
Esempio 1 – L'errore
Ecco un esempio di uno scenario che causa l'errore.
SELECT COLUMN_NAME, TYPE_NAME, PRECISION, LENGTH FROM OPENQUERY ( sqlserver007, 'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;' );
Risultato:
Msg 7411, Level 16, State 1, Line 1 Server 'sqlserver007' is not configured for DATA ACCESS.
In questo caso, sto cercando di eseguire OPENQUERY()
contro il mio server locale chiamato
sqlserver007
, ma non riesce, perché il server non ha l'accesso ai dati abilitato.
Ti starai chiedendo perché sto eseguendo OPENQUERY()
contro il mio server quando potrei semplicemente chiamare la procedura memorizzata localmente? È vero, ma in questo caso la procedura memorizzata restituisce più colonne di quelle di cui ho bisogno, quindi ho pensato che fosse abbastanza facile eseguirlo semplicemente tramite OPENQUERY()
in modo da poter scegliere le colonne di cui ho bisogno. Ah! Non così facile come pensavo!
Ma questo piccolo inconveniente è abbastanza facile da risolvere, quindi continuiamo.
Esempio 2:verifica delle impostazioni di accesso ai dati
Possiamo vedere se un server ha l'accesso ai dati abilitato controllando il sys.servers
vista catalogo di sistema.
SELECT name, is_data_access_enabled FROM sys.servers;
Risultato:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 0 | | Homer | 1 | +--------------+--------------------------+
In questo caso, l'accesso ai dati è abilitato per il server chiamato Homer , ma non per il server denominato sqlserver007 .
Se sei interessato, il sp_helpserver
la procedura memorizzata di sistema ci fornirà anche queste informazioni:
EXEC sp_helpserver;
Risultato:
+--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+ | 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 | +--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+
Se guardi nello stato colonna, vedrai che accesso ai dati è incluso nella riga per Homer , ma non per sqlserver007 .
Esempio 3:la soluzione
Ecco come consentire l'accesso ai dati.
EXEC sp_serveroption @server = 'sqlserver007', @optname = 'DATA ACCESS', @optvalue = 'TRUE';
Risultato:
Commands completed successfully.
Esempio 4 – Ricontrolla l'impostazione
Ora possiamo ricontrollare l'impostazione di accesso ai dati.
SELECT name, is_data_access_enabled FROM sys.servers;
Risultato:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 1 | | Homer | 1 | +--------------+--------------------------+
Ora il mio server locale ha l'accesso ai dati abilitato.
Ed ecco come appare con sp_helpserver
:
EXEC sp_helpserver;
Risultato:
+--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------+ | 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 | +--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------+
Ora possiamo vedere che accesso ai dati è stato aggiunto sotto lo stato colonna.
Esempio 5:rieseguire la query originale
Ora che abbiamo abilitato l'accesso ai dati, eseguiamo nuovamente la query originale.
SELECT COLUMN_NAME, TYPE_NAME, PRECISION, LENGTH FROM OPENQUERY ( sqlserver007, 'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;' );
Risultato:
+--------------------------+-------------+-------------+------------+ | 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 | +--------------------------+-------------+-------------+------------+
Questa volta funziona senza errori.
Anche se questo esempio utilizzava un OPENQUERY()
al mio server locale, la stessa correzione si applicherebbe se stessi tentando di eseguire una query distribuita su un server collegato (remoto). Indipendentemente da ciò, i passaggi precedenti vengono ancora eseguiti sul mio server locale (non è necessario toccare il server remoto).