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

Jak povolit/zakázat přístup k datům na serveru SQL (příklad T-SQL)

SQL Server má možnost konfigurace „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“, pravděpodobně budete muset povolit přístup k datům pro propojený server, na kterém se pokoušíte spustit distribuovaný dotaz. Naopak mohou nastat situace, kdy budete muset přístup k datům zakázat.

Chcete-li povolit nebo zakázat přístup k datům, použijte sp_serveroption uložená procedura systému. Spusťte jej na serveru, ze kterého chcete spouštět distribuované dotazy. Následující příklad ukazuje, jak to provést.

Příklad 1 – Povolení přístupu k datům

Zde je návod, jak povolit přístup k datům.

EXEC sp_serveroption
  @server = 'sqlserver007',
  @optname = 'DATA ACCESS',
  @optvalue = 'TRUE';

V tomto případě se server nazývá sqlserver007 a nastavil jsem DATA ACCESS možnost TRUE .

Zde je stručnější způsob, jak udělat totéž:

sp_serveroption 'sqlserver007', 'DATA ACCESS', 'TRUE';

Spuštění některé z těchto možností umožní přístup k datům na určeném propojeném serveru.

Mimochodem, zadaný propojený server může být v případě potřeby místním serverem. Nemusí to být vzdálený server.

Chcete-li zkontrolovat nastavení přístupu k datům, spusťte dotaz proti sys.servers zobrazení systémového katalogu.

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Výsledek:

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

Opět to spustíte proti místnímu serveru – nikoli vzdálenému serveru.

Příklad 2 – Zakázání přístupu k datům

Chcete-li zakázat přístup k datům, jednoduše nastavte @optvalue na FALSE .

EXEC sp_serveroption
  @server = 'sqlserver007',
  @optname = 'DATA ACCESS',
  @optvalue = 'FALSE';

Nyní znovu zkontrolujte nastavení.

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Výsledek:

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

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

Spusťte kód na serveru, ze kterého chcete spouštět distribuované dotazy.

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 .

Nepotřebuji přeskakovat na Homer pro změnu jeho nastavení. Ve skutečnosti by mohl mít jiné nastavení než to, které aplikuji na sqlserver007 .

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.

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;

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.

A skutečnost, že se mi podařilo získat tyto informace prostřednictvím distribuovaného dotazu, ukazuje, že distribuovaný dotaz umožnilo nastavení mého vlastního serveru, nikoli vzdáleného serveru.


  1. Funkce JSON jsou nyní v SQLite ve výchozím nastavení povoleny

  2. Změna portu serveru postgres kontejnerů v Docker Compose

  3. Vytvořte entitu místnosti pro tabulku, která má pole s datovým typem LONG ve Sqlite

  4. Jaký je nejlepší postup pro vložení záznamu, pokud ještě neexistuje?