sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan aktiveres/deaktiveres dataadgang i SQL Server (T-SQL-eksempel)

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.


  1. Oracle eksterne tabeller

  2. Sådan omdøbes en kolonne i SQL

  3. PL/SQL ORA-01422:nøjagtig hentning returnerer mere end det anmodede antal rækker

  4. Hvordan giver man position nul for spinner en promptværdi?