I SQL Server er der en "dataadgang"-indstilling, der aktiverer og deaktiverer en forbundet server for distribueret forespørgselsadgang. Hvis du nogensinde får fejlen "Serveren er ikke konfigureret til DATAADGANG", er det sandsynligvis fordi du forsøger at køre en distribueret forespørgsel mod en forbundet server, der ikke er konfigureret til dataadgang. Dette kan også ske, når du prøver at køre OPENQUERY()
mod din lokale server.
Du kan bruge sp_serveroption
for at aktivere eller deaktivere dataadgang på en given server. Det kan dog være en god idé at tjekke de eksisterende indstillinger, før du begynder at ændre dem. De følgende eksempler viser, hvordan man gør det.
Eksempel 1 – Forespørg på sys.servers
Systemvisning
Sandsynligvis den bedste måde at kontrollere, om dataadgang er aktiveret, er at forespørge sys.servers
systemkatalogvisning. Du kan enten returnere alle kolonner, eller kun dem du vil have returneret. Her er et eksempel på returnering af to kolonner:
SELECT name, is_data_access_enabled FROM sys.servers;
Resultat:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 0 | | Homer | 1 | +--------------+--------------------------+
I dette tilfælde er dataadgang aktiveret for serveren kaldet Homer , men ikke for serveren kaldet sqlserver007 .
Eksempel 2 – Udfør sp_helpserver
Systemlagret procedure
sp_helpserver
den systemlagrede procedure vil også give os disse oplysninger, dog i et andet 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 | +--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+
Hvis du ser i status kolonne, vil du se den dataadgang er inkluderet i rækken for Homer , men ikke for sqlserver007 .
Hvilken server skal jeg køre koden på?
Du skal køre koden mod den lokale server, ikke fjernserveren. Med dette mener jeg, hvis du tjekker for at se, om du kan køre distribuerede forespørgsler mod en forbundet server, skal du køre 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 for at se, om dataadgang er aktiveret for Homer linket server.
Jeg behøver ikke at hoppe over til Homer for at kontrollere dens indstilling. Faktisk, hvis jeg hopper over, kan det faktisk have en anden indstilling.
For at demonstrere dette punkt, her er, hvad jeg får, hvis jeg sammenligner de linkede serverresultater med den faktiske indstilling på fjernserveren.
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.
Det faktum, at jeg var i stand til at hente disse oplysninger via en distribueret forespørgsel, understøtter påstanden om, at det var min egen servers indstilling, der aktiverede den distribuerede forespørgsel.