SQL Server har en "dataadgang"-konfigurationsmulighed, der aktiverer og deaktiverer en forbundet server for distribueret forespørgselsadgang.
Hvis du nogensinde får fejlen "Serveren er ikke konfigureret til DATAADGANG", skal du sandsynligvis aktivere dataadgang for den sammenkædede server, du forsøger at køre den distribuerede forespørgsel imod. Omvendt kan der også være tidspunkter, hvor du skal deaktivere dataadgang.
For at aktivere eller deaktivere dataadgang skal du bruge sp_serveroption
system lagret procedure. Udfør det mod den server, du har til hensigt at køre distribuerede forespørgsler fra. Følgende eksempel viser, hvordan du gør dette.
Eksempel 1 – Aktiver dataadgang
Sådan aktiverer du dataadgang.
EXEC sp_serveroption @server = 'sqlserver007', @optname = 'DATA ACCESS', @optvalue = 'TRUE';
I dette tilfælde hedder serveren sqlserver007
, og jeg indstillede DATA ACCESS
mulighed for at TRUE
.
Her er en mere kortfattet måde at gøre det samme på:
sp_serveroption 'sqlserver007', 'DATA ACCESS', 'TRUE';
Hvis du kører en af disse, aktiveres dataadgang på den angivne tilknyttede server.
I øvrigt kan den angivne tilknyttede server være den lokale server, hvis det kræves. Det behøver ikke at være en fjernserver.
For at kontrollere dataadgangsindstillingen skal du køre en forespørgsel mod sys.servers
systemkatalogvisning.
SELECT name, is_data_access_enabled FROM sys.servers;
Resultat:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 1 | | Homer | 1 | +--------------+--------------------------+
Igen kører du dette mod den lokale server – ikke fjernserveren.
Eksempel 2 – Deaktiver dataadgang
For at deaktivere dataadgang skal du blot indstille @optvalue
til FALSE
.
EXEC sp_serveroption @server = 'sqlserver007', @optname = 'DATA ACCESS', @optvalue = 'FALSE';
Tjek nu indstillingen igen.
SELECT name, is_data_access_enabled FROM sys.servers;
Resultat:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 0 | | Homer | 1 | +--------------+--------------------------+
Hvilken server skal jeg køre koden på?
Kør koden mod den server, som du har til hensigt at køre distribuerede forespørgsler fra.
I mit eksempel sqlserver007 er navnet på den lokale server og Homer er en ekstern/forbundet server. Hvis jeg ville køre distribuerede forespørgsler mod Homer , ville jeg køre koden mod sqlserver007 .
Jeg behøver ikke at hoppe over til Homer for at ændre dens indstilling. Faktisk kan den have en anden indstilling end den, jeg anvender på sqlserver007 .
For at demonstrere dette punkt, her er, hvad jeg får, hvis jeg sammenligner de linkede serverresultater med den faktiske indstilling på fjernserveren.
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 dette tilfælde har den lokale server en anden indstilling end dens tilknyttede servermodstykke.
Og det faktum, at jeg var i stand til at hente disse oplysninger via en distribueret forespørgsel, viser, at det var min egen servers indstilling, der aktiverede den distribuerede forespørgsel, ikke fjernserverens.