Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

2 начина да проверите дали достъпът до данни е разрешен в SQL Server (примери за T-SQL)

В SQL Server има настройка „достъп до данни“, която активира и деактивира свързан сървър за достъп до разпределена заявка. Ако някога получите грешката „Сървърът не е конфигуриран за ДОСТЪП ДО ДАННИ“, това вероятно е, защото се опитвате да изпълните разпределена заявка срещу свързан сървър, който не е конфигуриран за достъп до данни. Това може да се случи и когато се опитате да изпълните OPENQUERY() срещу вашия локален сървър.

Можете да използвате sp_serveroption за да активирате или деактивирате достъпа до данни на даден сървър. Въпреки това, може да искате да проверите съществуващите настройки, преди да започнете да ги променяте. Следните примери показват как да направите това.

Пример 1 – Запитване на sys.servers Системен изглед

Вероятно най-добрият начин да проверите дали достъпът до данни е активиран е да потърсите sys.servers изглед на системния каталог. Можете да върнете всички колони или само тези, които искате да бъдат върнати. Ето пример за връщане на две колони:

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Резултат:

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

В този случай достъпът до данни е разрешен за сървъра, наречен Homer , но не и за сървъра, наречен sqlserver007 .

Пример 2 – Изпълнете sp_helpserver Системна съхранена процедура

sp_helpserver системната съхранена процедура също ще ни даде тази информация, макар и в различен формат:

EXEC sp_helpserver;

Резултат:

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

Ако погледнете в статус колона, ще видите, че достъп до данни е включен в реда за Homer , но не и за sqlserver007 .

На кой сървър да стартирам кода?

Трябва да изпълните кода срещу локалния сървър, а не отдалечения сървър. Под това имам предвид, ако проверявате дали можете да изпълнявате разпределени заявки срещу свързан сървър, изпълнете кода срещу сървъра, от който възнамерявате да изпълнявате разпределени заявки от .

В моя пример sqlserver007 е името на локалния сървър и Homer е отдалечен/свързан сървър. Ако исках да изпълнявам разпределени заявки срещу Homer , бих стартирал кода срещу sqlserver007 за да видите дали достъпът до данни е разрешен за Homer свързан сървър.

Няма нужда да прескачам към Homer за да проверите настройката му. Всъщност, ако прескоча, може всъщност да има различна настройка.

За да демонстрирам тази точка, ето какво получавам, ако сравня резултатите от свързания сървър с действителната настройка на отдалечения сървър.

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;

Резултат:

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

В този случай локалният сървър има различна настройка от неговия аналог на свързания сървър.

Фактът, че успях да извлека тази информация чрез разпределена заявка, подкрепя твърдението, че настройката на моя собствен сървър е активирала разпределената заявка.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво е значението на SELECT ... FOR XML PATH(' ),1,1)?

  2. Как да коригирате грешката „функцията datediff доведе до преливане“ в SQL Server

  3. Какъв е максималният брой знаци, които nvarchar(MAX) ще съдържа?

  4. Как мога да премина от режим на SQL Server на Windows към смесен режим (SQL Server 2008)?

  5. Редът на редовете по подразбиране в заявка SELECT - SQL Server 2008 срещу SQL 2012