sql >> Databáze >  >> RDS >> Sqlserver

2 způsoby, jak zkontrolovat, zda je na serveru SQL povolen přístup k datům (příklady T-SQL)

V SQL Server je nastavení „přístup k datům“, které povoluje a zakazuje propojený server pro distribuovaný přístup k dotazům. Pokud se někdy zobrazí chyba „Server není nakonfigurován pro přístup k datům“, je to pravděpodobně proto, že se pokoušíte spustit distribuovaný dotaz na propojeném serveru, který není nakonfigurován pro přístup k datům. To se také může stát, když se pokusíte spustit OPENQUERY() proti vašemu místnímu serveru.

Můžete použít sp_serveroption povolit nebo zakázat přístup k datům na daném serveru. Možná však budete chtít zkontrolovat stávající nastavení, než je začnete měnit. Následující příklady ukazují, jak to udělat.

Příklad 1 – Dotaz na sys.servers Systémové zobrazení

Pravděpodobně nejlepší způsob, jak zkontrolovat, zda je povolen přístup k datům, je dotaz na sys.servers zobrazení katalogu systému. Můžete buď vrátit všechny sloupce, nebo jen ty, které chcete vrátit. Zde je příklad vrácení dvou sloupců:

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Výsledek:

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

V tomto případě je povolen přístup k datům pro server s názvem Homer , ale ne pro server s názvem sqlserver007 .

Příklad 2 – Spusťte sp_helpserver Uložená procedura systému

sp_helpserver systémová uložená procedura nám také poskytne tyto informace, i když v jiném formátu:

EXEC sp_helpserver;

Výsledek:

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

Pokud se podíváte do stavu ve sloupci přístup k datům je zahrnuta v řádku pro Homer , ale ne pro sqlserver007 .

Na kterém serveru spustím kód?

Musíte spustit kód proti místnímu server, nikoli vzdálený server. Tím mám na mysli, že pokud kontrolujete, zda můžete spouštět distribuované dotazy na propojeném serveru, spusťte kód na serveru, ze kterého chcete distribuované dotazy spouštět ze .

V mém příkladu sqlserver007 je název místního serveru a Homer je vzdálený/propojený server. Pokud bych chtěl spouštět distribuované dotazy proti Homer , spustil bych kód proti sqlserver007 a zjistěte, zda je pro Homer povolen přístup k datům propojený server.

Nepotřebuji přeskakovat na Homer pro kontrolu jeho nastavení. Ve skutečnosti, když přeskočím, může to mít ve skutečnosti jiné nastavení.

Abych tento bod demonstroval, zde je to, co dostanu, když porovnám výsledky propojeného serveru se skutečným nastavením na vzdáleném serveru.

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;

Výsledek:

+--------------------+--------------------------+
| (No column name)   | is_data_access_enabled   |
|--------------------+--------------------------|
| From local         | 1                        |
| Remote setting     | 0                        |
+--------------------+--------------------------+

V tomto případě má místní server jiné nastavení než jeho protějšek propojeného serveru.

Skutečnost, že se mi podařilo získat tyto informace prostřednictvím distribuovaného dotazu, podporuje tvrzení, že distribuovaný dotaz umožnilo nastavení mého vlastního serveru.


  1. Dotaz na prvek pole ve sloupci JSON

  2. Co jsou krycí indexy a kryté dotazy v SQL Server?

  3. Jak najdu datový adresář pro instanci SQL Server?

  4. Nástroj pro skriptování dat tabulky