sql >> Database >  >> RDS >> Sqlserver

2 manieren om te controleren of gegevenstoegang is ingeschakeld in SQL Server (T-SQL-voorbeelden)

In SQL Server is er een instelling voor "gegevenstoegang" die een gekoppelde server in- en uitschakelt voor gedistribueerde querytoegang. Als u ooit de foutmelding "Server is niet geconfigureerd voor DATATOEGANG" krijgt, komt dit waarschijnlijk omdat u een gedistribueerde query probeert uit te voeren op een gekoppelde server die niet is geconfigureerd voor gegevenstoegang. Dit kan ook gebeuren wanneer u OPENQUERY() . probeert uit te voeren tegen uw lokale server.

U kunt sp_serveroption . gebruiken om gegevenstoegang op een bepaalde server in of uit te schakelen. Het is echter mogelijk dat u de bestaande instellingen wilt controleren voordat u ze gaat wijzigen. De volgende voorbeelden laten zien hoe u dat kunt doen.

Voorbeeld 1 – Query de sys.servers Systeemweergave

Waarschijnlijk de beste manier om te controleren of gegevenstoegang is ingeschakeld, is door de sys.servers . op te vragen systeemcatalogus bekijken. U kunt alle kolommen retourneren of alleen de kolommen die u wilt retourneren. Hier is een voorbeeld van het retourneren van twee kolommen:

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Resultaat:

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

In dit geval is gegevenstoegang ingeschakeld voor de server genaamd Homer , maar niet voor de server genaamd sqlserver007 .

Voorbeeld 2 – Voer de sp_helpserver uit Door het systeem opgeslagen procedure

De sp_helpserver systeem opgeslagen procedure geeft ons ook deze informatie, zij het in een ander formaat:

EXEC sp_helpserver;

Resultaat:

+--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+
| 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               |
+--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+

Als je kijkt in de status kolom, ziet u dat gegevenstoegang is opgenomen in de rij voor Homer , maar niet voor sqlserver007 .

Op welke server moet ik de code uitvoeren?

U moet de code uitvoeren tegen de lokale server, niet de externe server. Hiermee bedoel ik, als je controleert of je gedistribueerde query's kunt uitvoeren op een gekoppelde server, voer dan de code uit op de server waarvan je van plan bent gedistribueerde query's uit te voeren vanaf .

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 om te zien of gegevenstoegang is ingeschakeld voor de Homer gekoppelde server.

Ik hoef niet naar Homer te springen om de instelling ervan te controleren. Als ik er wel overheen spring, kan het zelfs een andere instelling hebben.

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.

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 zijn gekoppelde server-tegenhanger.

Het feit dat ik deze informatie via een gedistribueerde query kon ophalen, ondersteunt de bewering dat het de instelling van mijn eigen server was die de gedistribueerde query mogelijk maakte.


  1. Hoe te updaten met inner join in Oracle

  2. DROP-FUNCTIE zonder het aantal/type parameters te kennen?

  3. Standaardwaarden van parameters parseren met PowerShell - Deel 2

  4. SQL - Vraag om het IP-adres van de server