Kesalahan "Server tidak dikonfigurasi untuk AKSES DATA" di SQL Server adalah kesalahan umum saat mencoba menjalankan kueri terdistribusi terhadap server yang pengaturan akses datanya dinonaktifkan.
Kesalahan akan memiliki nama server yang Anda coba akses. Misalnya, jika nama server Anda adalah SQL01, kesalahannya akan berbunyi seperti ini:
Msg 7411, Level 16, State 1, Line 1 Server 'SQL01' is not configured for DATA ACCESS.
“Akses data” adalah setelan yang mengaktifkan dan menonaktifkan server tertaut untuk akses kueri terdistribusi.
Penyebab umum kesalahan ini adalah saat Anda mencoba menjalankan OPENQUERY()
terhadap server lokal. Jika Anda benar-benar ingin menjalankan OPENQUERY()
terhadap server, Anda harus memastikan akses data diaktifkan untuk server tersebut – meskipun itu adalah server lokal Anda.
Artikel ini membahas contoh menjalankan kueri yang menghasilkan kesalahan, memeriksa apakah server memiliki akses data yang diaktifkan, mengaktifkan akses data, memeriksa ulang, dan akhirnya menjalankan kueri lagi. Jika Anda tidak ingin menjalani seluruh skenario, gulir ke bawah ke judul "Solusi" di bawah ini. Atau, lihat Cara Mengaktifkan &Menonaktifkan Akses Data di SQL Server untuk contoh cepat mengaktifkan dan menonaktifkan akses data.
Lihat juga 2 Cara untuk Memeriksa apakah Akses Data Diaktifkan jika Anda hanya ingin memeriksa pengaturannya.
Jika tidak, baca terus – semuanya dibahas dalam artikel ini.
Contoh 1 – Kesalahan
Berikut adalah contoh skenario yang menyebabkan kesalahan.
SELECT COLUMN_NAME, TYPE_NAME, PRECISION, LENGTH FROM OPENQUERY ( sqlserver007, 'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;' );
Hasil:
Msg 7411, Level 16, State 1, Line 1 Server 'sqlserver007' is not configured for DATA ACCESS.
Dalam hal ini, saya mencoba menjalankan OPENQUERY()
terhadap server lokal saya sendiri yang disebut
sqlserver007
, tetapi gagal, karena server tidak mengaktifkan akses data.
Anda mungkin bertanya-tanya mengapa saya menjalankan OPENQUERY()
terhadap server saya sendiri ketika saya bisa memanggil prosedur tersimpan secara lokal? Itu benar, tetapi dalam kasus ini prosedur tersimpan mengembalikan lebih banyak kolom daripada yang saya butuhkan, jadi saya pikir cukup mudah untuk menjalankannya melalui OPENQUERY()
sehingga saya bisa memilih kolom yang saya butuhkan. Doh! Tidak semudah yang saya kira!
Tapi cegukan kecil ini cukup mudah untuk diselesaikan, jadi mari kita lanjutkan.
Contoh 2 – Periksa Setelan Akses Data
Kita dapat melihat apakah server memiliki akses data yang diaktifkan dengan memeriksa sys.servers
tampilan katalog sistem.
SELECT name, is_data_access_enabled FROM sys.servers;
Hasil:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 0 | | Homer | 1 | +--------------+--------------------------+
Dalam hal ini, akses data diaktifkan untuk server yang disebut Homer , tetapi tidak untuk server bernama sqlserver007 .
Jika Anda tertarik, sp_helpserver
prosedur tersimpan sistem juga akan memberi kita informasi ini:
EXEC sp_helpserver;
Hasil:
+--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+ | 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 | +--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+
Jika Anda melihat status kolom, Anda akan melihat akses data disertakan dalam baris untuk Homer , tetapi tidak untuk sqlserver007 .
Contoh 3 – Solusinya
Berikut cara mengizinkan akses data.
EXEC sp_serveroption @server = 'sqlserver007', @optname = 'DATA ACCESS', @optvalue = 'TRUE';
Hasil:
Commands completed successfully.
Contoh 4 – Periksa Ulang Pengaturan
Sekarang kita dapat memeriksa kembali pengaturan akses data.
SELECT name, is_data_access_enabled FROM sys.servers;
Hasil:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 1 | | Homer | 1 | +--------------+--------------------------+
Sekarang server lokal saya mengaktifkan akses data.
Dan inilah tampilannya dengan sp_helpserver
:
EXEC sp_helpserver;
Hasil:
+--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------+ | 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 | +--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------+
Sekarang kita dapat melihat akses data telah ditambahkan di bawah status kolom.
Contoh 5 – Jalankan Ulang Query Asli
Sekarang kami telah mengaktifkan akses data, mari jalankan kembali kueri asli.
SELECT COLUMN_NAME, TYPE_NAME, PRECISION, LENGTH FROM OPENQUERY ( sqlserver007, 'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;' );
Hasil:
+--------------------------+-------------+-------------+------------+ | 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 | +--------------------------+-------------+-------------+------------+
Kali ini berjalan tanpa kesalahan.
Meskipun contoh ini menggunakan OPENQUERY()
ke server lokal saya, perbaikan yang sama akan berlaku jika saya mencoba menjalankan kueri terdistribusi terhadap server tertaut (jarak jauh). Terlepas dari itu, langkah-langkah di atas masih dilakukan di server lokal saya (tidak perlu menyentuh server jauh).