SQL Server heeft een configuratieoptie voor "gegevenstoegang" die een gekoppelde server voor gedistribueerde querytoegang in- en uitschakelt.
Als u ooit de foutmelding "Server is niet geconfigureerd voor DATATOEGANG" krijgt, moet u waarschijnlijk gegevenstoegang inschakelen voor de gekoppelde server waarop u de gedistribueerde query probeert uit te voeren. Omgekeerd kunnen er ook momenten zijn waarop u gegevenstoegang moet uitschakelen.
Gebruik de sp_serveroption
. om gegevenstoegang in of uit te schakelen systeem opgeslagen procedure. Voer het uit op de server waarvan u gedistribueerde query's wilt uitvoeren. Het volgende voorbeeld laat zien hoe u dit doet.
Voorbeeld 1 – Gegevenstoegang inschakelen
Ga als volgt te werk om gegevenstoegang in te schakelen.
EXEC sp_serveroption @server = 'sqlserver007', @optname = 'DATA ACCESS', @optvalue = 'TRUE';
In dit geval heet de server sqlserver007
, en ik stel de DATA ACCESS
optie om TRUE
.
Hier is een beknoptere manier om hetzelfde te doen:
sp_serveroption 'sqlserver007', 'DATA ACCESS', 'TRUE';
Als u een van beide uitvoert, wordt toegang tot gegevens op de opgegeven gekoppelde server mogelijk.
Overigens kan de opgegeven gekoppelde server indien nodig de lokale server zijn. Het hoeft geen externe server te zijn.
Om de instelling voor gegevenstoegang te controleren, voert u een query uit op de sys.servers
systeemcatalogusweergave.
SELECT name, is_data_access_enabled FROM sys.servers;
Resultaat:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 1 | | Homer | 1 | +--------------+--------------------------+
Nogmaals, je voert dit uit tegen de lokale server - niet de externe server.
Voorbeeld 2 – Gegevenstoegang uitschakelen
Om gegevenstoegang uit te schakelen, stelt u eenvoudig @optvalue
in naar FALSE
.
EXEC sp_serveroption @server = 'sqlserver007', @optname = 'DATA ACCESS', @optvalue = 'FALSE';
Controleer nu de instelling opnieuw.
SELECT name, is_data_access_enabled FROM sys.servers;
Resultaat:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 0 | | Homer | 1 | +--------------+--------------------------+
Op welke server moet ik de code uitvoeren?
Voer de code uit op de server waarvan u gedistribueerde zoekopdrachten wilt uitvoeren.
In mijn voorbeeld, sqlserver007 is de naam van de lokale server en Homer is een externe/gekoppelde server. Als ik gedistribueerde zoekopdrachten wilde uitvoeren tegen Homer , zou ik de code uitvoeren tegen sqlserver007 .
Ik hoef niet naar Homer te springen om de instelling ervan te wijzigen. Het zou zelfs een andere instelling kunnen hebben dan die ik toepas op sqlserver007 .
Om dit punt te demonstreren, krijg ik het volgende als ik de resultaten van de gekoppelde server vergelijk met de daadwerkelijke instelling op de externe server.
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;
Resultaat:
+--------------------+--------------------------+ | (No column name) | is_data_access_enabled | |--------------------+--------------------------| | From local | 1 | | Remote setting | 0 | +--------------------+--------------------------+
In dit geval heeft de lokale server een andere instelling dan de tegenhanger van de gekoppelde server.
En het feit dat ik deze informatie via een gedistribueerde query kon ophalen, toont aan dat het de instelling van mijn eigen server was die de gedistribueerde query mogelijk maakte, niet die van de externe server.