I SQL Server finns det en "dataåtkomst"-inställning som aktiverar och inaktiverar en länkad server för distribuerad frågeåtkomst. Om du någonsin får felet "Server är inte konfigurerad för DATAÅTKOMST" beror det förmodligen på att du försöker köra en distribuerad fråga mot en länkad server som inte är konfigurerad för dataåtkomst. Detta kan också hända när du försöker köra OPENQUERY()
mot din lokala server.
Du kan använda sp_serveroption
för att aktivera eller inaktivera dataåtkomst på en given server. Men du kanske vill kontrollera de befintliga inställningarna innan du börjar ändra dem. Följande exempel visar hur du gör det.
Exempel 1 – Fråga sys.servers
Systemvy
Förmodligen det bästa sättet att kontrollera om dataåtkomst är aktiverad är att fråga sys.servers
systemkatalogvy. Du kan antingen returnera alla kolumner, eller bara de du vill ha tillbaka. Här är ett exempel på att returnera två kolumner:
SELECT name, is_data_access_enabled FROM sys.servers;
Resultat:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 0 | | Homer | 1 | +--------------+--------------------------+
I det här fallet är dataåtkomst aktiverad för servern som heter Homer , men inte för servern som heter sqlserver007 .
Exempel 2 – Kör sp_helpserver
Systemlagrad procedur
sp_helpserver
Den systemlagrade proceduren kommer också att ge oss denna information, men i ett annat format:
EXEC sp_helpserver;
Resultat:
+--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+ | 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 | +--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+
Om du tittar i status kolumnen ser du att dataåtkomst ingår i raden för Homer , men inte för sqlserver007 .
Vilken server kör jag koden på?
Du måste köra koden mot den lokala servern, inte fjärrservern. Med detta menar jag, om du kontrollerar om du kan köra distribuerade frågor mot en länkad server, kör koden mot servern som du tänker köra distribuerade frågor från .
I mitt exempel, sqlserver007 är namnet på den lokala servern och Homer är en fjärransluten/länkad server. Om jag ville köra distribuerade frågor mot Homer , skulle jag köra koden mot sqlserver007 för att se om dataåtkomst är aktiverad för Homer länkad server.
Jag behöver inte hoppa över till Homer för att kontrollera dess inställning. Faktum är att om jag hoppar över kan det faktiskt ha en annan inställning.
För att demonstrera detta, det här är vad jag får om jag jämför de länkade serverresultaten med den faktiska inställningen på fjärrservern.
SELECT 'From local', is_data_access_enabled FROM sys.servers WHERE name = 'Homer' UNION ALL SELECT 'Remote setting', is_data_access_enabled FROM Homer.master.sys.servers WHERE server_id = 0;
Resultat:
+--------------------+--------------------------+ | (No column name) | is_data_access_enabled | |--------------------+--------------------------| | From local | 1 | | Remote setting | 0 | +--------------------+--------------------------+
I det här fallet har den lokala servern en annan inställning än sin länkade servermotsvarighet.
Det faktum att jag kunde hämta denna information via en distribuerad fråga stöder påståendet att det var min egen servers inställning som aktiverade den distribuerade frågan.