Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách khắc phục “Máy chủ không được định cấu hình cho TRUY CẬP DỮ LIỆU” trong SQL Server

Lỗi “Máy chủ không được định cấu hình cho TRUY CẬP DỮ LIỆU” trong SQL Server là một lỗi phổ biến khi cố gắng chạy truy vấn phân tán chống lại máy chủ đã tắt cài đặt truy cập dữ liệu.

Lỗi sẽ có tên của máy chủ mà bạn đang cố truy cập. Ví dụ:nếu tên máy chủ của bạn là SQL01, lỗi sẽ đọc như sau:

Msg 7411, Level 16, State 1, Line 1
Server 'SQL01' is not configured for DATA ACCESS.

“Quyền truy cập dữ liệu” là cài đặt cho phép và tắt máy chủ được liên kết để truy cập truy vấn phân tán.

Nguyên nhân phổ biến của lỗi này là khi bạn cố chạy OPENQUERY() chống lại máy chủ cục bộ. Nếu bạn thực sự muốn chạy OPENQUERY() chống lại máy chủ, bạn sẽ cần đảm bảo quyền truy cập dữ liệu được bật cho máy chủ đó - ngay cả khi đó là máy chủ cục bộ của bạn.

Bài viết này hướng dẫn một ví dụ về việc chạy một truy vấn tạo ra lỗi, kiểm tra xem máy chủ có bật quyền truy cập dữ liệu hay không, cho phép truy cập dữ liệu, kiểm tra lại và cuối cùng là chạy lại truy vấn. Nếu bạn không muốn xem qua toàn bộ tình huống, hãy cuộn xuống tiêu đề "Giải pháp" bên dưới. Ngoài ra, hãy xem Cách bật &tắt quyền truy cập dữ liệu trong SQL Server để biết ví dụ nhanh về cách bật và tắt quyền truy cập dữ liệu.

Ngoài ra, hãy xem 2 Cách Kiểm tra xem Truy cập Dữ liệu có được Bật hay không nếu bạn chỉ muốn kiểm tra cài đặt.

Nếu không, hãy đọc tiếp - tất cả được đề cập trong bài viết này.

Ví dụ 1 - Lỗi

Dưới đây là một ví dụ về tình huống gây ra lỗi.

SELECT 
  COLUMN_NAME,
  TYPE_NAME,
  PRECISION,
  LENGTH
FROM 
OPENQUERY (
  sqlserver007,
  'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;'
);

Kết quả:

Msg 7411, Level 16, State 1, Line 1
Server 'sqlserver007' is not configured for DATA ACCESS.

Trong trường hợp này, tôi đang cố chạy OPENQUERY() chống lại máy chủ cục bộ của riêng tôi có tên là sqlserver007 nhưng không thành công, vì máy chủ không bật quyền truy cập dữ liệu.

Bạn có thể thắc mắc tại sao tôi lại chạy OPENQUERY() chống lại máy chủ của riêng tôi khi tôi chỉ có thể gọi thủ tục được lưu trữ cục bộ? Điều đó đúng, nhưng trong trường hợp này, thủ tục được lưu trữ trả về nhiều cột hơn mức tôi cần, vì vậy tôi thấy rằng chỉ cần chạy nó qua OPENQUERY() là đủ dễ dàng để tôi có thể chọn các cột tôi cần. Doh! Không dễ dàng như tôi nghĩ!

Nhưng trục trặc nhỏ này cũng dễ giải quyết, vì vậy hãy tiếp tục.

Ví dụ 2 - Kiểm tra Cài đặt Truy cập Dữ liệu

Chúng tôi có thể xem liệu máy chủ có bật quyền truy cập dữ liệu hay không bằng cách kiểm tra sys.servers chế độ xem danh mục hệ thống.

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Kết quả:

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

Trong trường hợp này, quyền truy cập dữ liệu được bật cho máy chủ có tên Homer , nhưng không dành cho máy chủ có tên sqlserver007 .

Trong trường hợp bạn quan tâm, sp_helpserver hệ thống lưu trữ thủ tục cũng sẽ cung cấp cho chúng tôi thông tin này:

EXEC sp_helpserver;

Kết quả:

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

Nếu bạn nhìn vào status , bạn sẽ thấy rằng quyền truy cập dữ liệu được bao gồm trong hàng cho Homer , nhưng không dành cho sqlserver007 .

Ví dụ 3 - Giải pháp

Đây là cách cho phép truy cập dữ liệu.

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

Kết quả:

Commands completed successfully.

Ví dụ 4 - Kiểm tra lại Cài đặt

Bây giờ chúng tôi có thể kiểm tra lại cài đặt quyền truy cập dữ liệu.

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Kết quả:

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

Bây giờ máy chủ cục bộ của tôi đã bật quyền truy cập dữ liệu.

Và đây là giao diện với sp_helpserver :

EXEC sp_helpserver;

Kết quả:

+--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------+
| name         | network_name                   | status                                       | id   | collation_name   | connect_timeout   | query_timeout   |
|--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------|
| sqlserver007 | sqlserver007                   | rpc,rpc out,data access,use remote collation | 0    | NULL             | 0                 | 0               |
| Homer        | NULL                           | data access,use remote collation             | 1    | NULL             | 0                 | 0               |
+--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------+

Bây giờ chúng ta có thể thấy rằng quyền truy cập dữ liệu đã được thêm vào dưới trạng thái cột.

Ví dụ 5 - Chạy lại Truy vấn Ban đầu

Bây giờ chúng tôi đã bật quyền truy cập dữ liệu, hãy chạy lại truy vấn ban đầu.

SELECT 
  COLUMN_NAME,
  TYPE_NAME,
  PRECISION,
  LENGTH
FROM 
OPENQUERY (
  sqlserver007,
  'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;'
);

Kết quả:

+--------------------------+-------------+-------------+------------+
| COLUMN_NAME              | TYPE_NAME   | PRECISION   | LENGTH     |
|--------------------------+-------------+-------------+------------|
| CityID                   | int         | 10          | 4          |
| CityName                 | nvarchar    | 50          | 100        |
| StateProvinceID          | int         | 10          | 4          |
| Location                 | geography   | 2147483647  | 2147483647 |
| LatestRecordedPopulation | bigint      | 19          | 8          |
| LastEditedBy             | int         | 10          | 4          |
| ValidFrom                | datetime2   | 27          | 54         |
| ValidTo                  | datetime2   | 27          | 54         |
+--------------------------+-------------+-------------+------------+

Lần này nó chạy mà không bị lỗi.

Mặc dù ví dụ này sử dụng OPENQUERY() cho máy chủ cục bộ của tôi, bản sửa lỗi tương tự sẽ áp dụng nếu tôi đang cố gắng chạy một truy vấn phân tán chống lại một máy chủ được liên kết (từ xa). Bất kể, các bước trên vẫn được thực hiện trên máy chủ cục bộ của tôi (không cần chạm vào máy chủ từ xa).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bộ đệm ẩn đối tượng tạm thời của SQL Server

  2. Nhóm máy chủ SQL theo số ngày tháng mỗi giờ?

  3. Chuyển dữ liệu từ cơ sở dữ liệu này sang cơ sở dữ liệu khác

  4. Cách chọn một tập hợp con các cột từ một tập kết quả của thủ tục được lưu trữ (T-SQL)

  5. Các cách khôi phục dữ liệu từ tệp nhật ký giao dịch SQL Server