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

2 måder at kontrollere, om dataadgang er aktiveret i SQL Server (T-SQL-eksempler)

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.


  1. 12c Automatisk udfyldning af kolonne med sekvensværdi

  2. Hvordan forespørger jeg ved hjælp af felter i den nye PostgreSQL JSON-datatype?

  3. Tilpassede triggerbaserede opgraderinger til PostgreSQL

  4. Oracle cursor til tildeling