sql >> Databasteknik >  >> RDS >> Sqlserver

2 sätt att kontrollera om dataåtkomst är aktiverad i SQL Server (T-SQL-exempel)

I SQL Server finns det en "dataåtkomst"-inställning 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" beror det förmodligen på att du försöker köra en distribuerad fråga mot en länkad server som inte är konfigurerad för dataåtkomst. Detta kan också hända när du försöker köra OPENQUERY() mot din lokala server.

Du kan använda sp_serveroption för att aktivera eller inaktivera dataåtkomst på en given server. Men du kanske vill kontrollera de befintliga inställningarna innan du börjar ändra dem. Följande exempel visar hur du gör det.

Exempel 1 – Fråga sys.servers Systemvy

Förmodligen det bästa sättet att kontrollera om dataåtkomst är aktiverad är att fråga sys.servers systemkatalogvy. Du kan antingen returnera alla kolumner, eller bara de du vill ha tillbaka. Här är ett exempel på att returnera två kolumner:

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Resultat:

+--------------+--------------------------+
| name         | is_data_access_enabled   |
|--------------+--------------------------|
| sqlserver007 | 0                        |
| Homer        | 1                        |
+--------------+--------------------------+

I det här fallet är dataåtkomst aktiverad för servern som heter Homer , men inte för servern som heter sqlserver007 .

Exempel 2 – Kör sp_helpserver Systemlagrad procedur

sp_helpserver Den systemlagrade proceduren kommer också att ge oss denna information, men i ett annat 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               |
+--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+

Om du tittar i status kolumnen ser du att dataåtkomst ingår i raden för Homer , men inte för sqlserver007 .

Vilken server kör jag koden på?

Du måste köra koden mot den lokala servern, inte fjärrservern. Med detta menar jag, om du kontrollerar om du kan köra distribuerade frågor mot en länkad server, 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 för att se om dataåtkomst är aktiverad för Homer länkad server.

Jag behöver inte hoppa över till Homer för att kontrollera dess inställning. Faktum är att om jag hoppar över kan det faktiskt ha en annan inställning.

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.

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.

Det faktum att jag kunde hämta denna information via en distribuerad fråga stöder påståendet att det var min egen servers inställning som aktiverade den distribuerade frågan.


  1. Se upp för en tabell nya poster i SQL-databasen

  2. Ansluta en Bastion Server till en PostgreSQL Server via SSH Tunnel

  3. Hur man modellerar för enkelt databasunderhåll

  4. Hur man installerar MySQL på Debian 7