sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man aktiverar/inaktiverar dataåtkomst i SQL Server (T-SQL-exempel)

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.


  1. Oracle Database Security – Kryptering och dekryptering

  2. Olika planer för identiska servrar

  3. SQL-fråga dynamiskt tabellnamn i FOR

  4. Kontrollera Oracle RAC Network och IP-information