SQL Server har ett "dataåtkomst"-konfigurationsalternativ 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" måste du förmodligen aktivera dataåtkomst för den länkade servern du försöker köra den distribuerade frågan mot. Omvänt kan det också finnas tillfällen då du behöver inaktivera dataåtkomst.
För att aktivera eller inaktivera dataåtkomst, använd sp_serveroption
systemlagrad procedur. Kör den mot servern som du tänker köra distribuerade frågor från. Följande exempel visar hur du gör detta.
Exempel 1 – Aktivera dataåtkomst
Så här aktiverar du dataåtkomst.
EXEC sp_serveroption @server = 'sqlserver007', @optname = 'DATA ACCESS', @optvalue = 'TRUE';
I det här fallet heter servern sqlserver007
, och jag ställer in DATA ACCESS
alternativet till TRUE
.
Här är ett mer kortfattat sätt att göra samma sak:
sp_serveroption 'sqlserver007', 'DATA ACCESS', 'TRUE';
Att köra någon av dessa kommer att möjliggöra dataåtkomst på den angivna länkade servern.
Förresten, den angivna länkade servern kan vara den lokala servern om det behövs. Det behöver inte vara en fjärrserver.
För att kontrollera dataåtkomstinställningen, kör en fråga mot sys.servers
systemkatalogvy.
SELECT name, is_data_access_enabled FROM sys.servers;
Resultat:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 1 | | Homer | 1 | +--------------+--------------------------+
Återigen kör du detta mot den lokala servern – inte fjärrservern.
Exempel 2 – Inaktivera dataåtkomst
För att inaktivera dataåtkomst, ställ bara in @optvalue
till FALSE
.
EXEC sp_serveroption @server = 'sqlserver007', @optname = 'DATA ACCESS', @optvalue = 'FALSE';
Kontrollera nu inställningen igen.
SELECT name, is_data_access_enabled FROM sys.servers;
Resultat:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 0 | | Homer | 1 | +--------------+--------------------------+
Vilken server kör jag koden på?
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 .
Jag behöver inte hoppa över till Homer för att ändra dess inställning. Faktum är att den kan ha en annan inställning än den som jag tillämpar på sqlserver007 .
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.
EXEC sp_serveroption @server = 'Homer', @optname = 'DATA ACCESS', @optvalue = 'TRUE'; 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.
Och det faktum att jag kunde hämta denna information via en distribuerad fråga visar att det var min egen servers inställning som aktiverade den distribuerade frågan, inte fjärrserverns.