Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Cara Kerja Login di Server Tertaut (Contoh T-SQL)

Saat mengonfigurasi server tertaut di SQL Server, mengatur login terkadang bisa membingungkan. Dalam artikel ini, saya bertujuan untuk memberikan gambaran tingkat tinggi tentang bagaimana SQL Server memetakan login lokal ke login jarak jauh di server yang ditautkan.

Saat Anda menggunakan sp_addlinkedserver untuk membuat server tertaut di SQL Server, pemetaan default antara semua login di server lokal dan login jarak jauh di server tertaut dibuat secara otomatis. SQL Server menggunakan kredensial login lokal saat menyambung ke server tertaut atas nama login.

Jadi, jika login lokal Anda memiliki login yang sesuai di server tertaut, dengan kredensial yang sama, dan memiliki izin yang sesuai, Anda akan dapat terhubung menggunakan login lokal Anda. Tidak perlu menambahkan login untuk server tertaut (dengan asumsi Anda senang terhubung menggunakan login lokal Anda sendiri).

Tetapi jika login lokal Anda tidak memiliki login yang sesuai di server tertaut (dan dengan kredensial yang sama), koneksi akan gagal.

Dalam kasus seperti itu, Anda dapat menggunakan sp_addlinkedsrvlogin untuk membuat login untuk server tertaut sehingga login lokal dapat terhubung ke server tertaut meskipun mereka tidak memiliki login yang sesuai di server tertaut.

Melakukan hal ini dapat mengakibatkan pengguna yang berbeda digunakan di server tertaut, tergantung pada apakah mereka memiliki login yang sesuai di server tertaut atau tidak.

Untuk pengguna yang terhubung ke SQL Server menggunakan Mode Otentikasi Windows, SQL Server dapat secara otomatis menggunakan kredensial keamanan Windows selama delegasi akun keamanan tersedia di klien dan server pengirim, dan penyedia mendukung Mode Otentikasi Windows.

Contoh di halaman ini menggunakan login SQL Server (mereka tidak menggunakan Mode Otentikasi Windows). Contoh-contoh ini menunjukkan hasil yang saya dapatkan saat masuk ke server tertaut di bawah skenario yang berbeda menggunakan login SQL Server lokal.

Contoh 1 – Server Tertaut Tanpa Login Eksplisit

Pertama saya akan membuat server tertaut bernama Homer, tetapi saya tidak akan membuat login terkait.

EXEC sp_addlinkedserver @server=N'Homer', @srvproduct=N'', @provider=N'MSOLEDBSQL', @datasrc=N'172.17.0.2', @catalog='Music';

Ini secara otomatis membuat pemetaan default antara semua login di server lokal dan login jarak jauh di server tertaut.

Sekarang saya akan mencoba menjalankan kueri pass-through berikut terhadap server tertaut menggunakan berbagai login lokal:

SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');

Hasil kueri adalah sebagai berikut.

sa

Login gagal untuk pengguna 'sa'.

Detail Masuk :Ada login yang disebut 'sa' di kedua server, tetapi mereka memiliki kata sandi yang berbeda. Keduanya adalah anggota sysadmin peran server.

Lisa

+----------------+------------------+| CURRENT_USER | LOGIN_ORIGINAL ||----------------+------------------|| dbo | Lisa |+----------------+------------------+

Detail Masuk :Ada login bernama 'Lisa' di kedua server, dan mereka memiliki kata sandi yang sama. Keduanya adalah anggota sysadmin peran server.

Milhouse

Login gagal untuk pengguna 'Milhouse'.

Detail Masuk :Login ini hanya di server lokal. Tidak ada login yang sesuai di server tertaut.

Apu

Login gagal untuk pengguna 'Apu'.

Detail Masuk :Login ini hanya di server lokal. Tidak ada login yang sesuai di server tertaut.

Contoh 2 – Tambahkan Login untuk Server Tertaut

Selanjutnya, saya akan membuat login untuk server tertaut.

EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin=NULL, @rmtuser=N'Maggie', @rmtpassword=N'BigStrong#Passw0rd';

Login ini sesuai dengan login di server jauh, sehingga pemetaan dibuat di antara mereka.

Sekarang setiap pengguna akan menjalankan kueri berikut lagi:

SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');

Hasil kueri adalah sebagai berikut.

sa

+----------------+------------------+| CURRENT_USER | LOGIN_ORIGINAL ||----------------+------------------|| Maggie | Maggie |+----------------+------------------+

Detail Masuk :Ada login yang disebut 'sa' di kedua server, tetapi mereka memiliki kata sandi yang berbeda. Keduanya adalah anggota sysadmin peran server.

Lisa

+----------------+------------------+| CURRENT_USER | LOGIN_ORIGINAL ||----------------+------------------|| Maggie | Maggie |+----------------+------------------+

Detail Masuk :Ada login bernama 'Lisa' di kedua server, dan mereka memiliki kata sandi yang sama. Keduanya adalah anggota sysadmin peran server.

Milhouse

+----------------+------------------+| CURRENT_USER | LOGIN_ORIGINAL ||----------------+------------------|| Maggie | Maggie |+----------------+------------------+

Detail Masuk :Login ini hanya di server lokal. Tidak ada login yang sesuai di server tertaut.

Apu

+----------------+------------------+| CURRENT_USER | LOGIN_ORIGINAL ||----------------+------------------|| Maggie | Maggie |+----------------+------------------+

Detail Masuk :Login ini hanya di server lokal. Tidak ada login yang sesuai di server tertaut.

Jadi semua login lokal dapat terhubung ke server yang ditautkan. Bahkan login yang tidak memiliki login jarak jauh yang sesuai di server tertaut dapat terhubung. Ini karena mereka semua menggunakan login Maggie. Terima kasih Maggie!

Contoh 3 – Batasi Login

Sekarang saya akan memperbarui login untuk server tertaut sehingga dibatasi untuk Milhouse.

Tetapi untuk melakukan ini, saya harus menghapus server yang ditautkan dan membuatnya lagi. Jika saya tidak melakukan ini, SQL Server akan menggunakan pemetaan yang ada, dan saya akan mendapatkan hasil yang sama seperti di atas.

EXEC sp_dropserver 'Homer', 'droplogins';EXEC sp_addlinkedserver @server=N'Homer', @srvproduct=N'', @provider=N'MSOLEDBSQL', @datasrc=N'172.17.0.2', @catalog ='Music';EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin='Milhouse', @rmtuser=N'Maggie', @rmtpassword=N'BigStrong#Passw0rd'; 

Jadi dalam hal ini saya menggunakan @locallogin='Milhouse' (bukan @locallogin=NULL seperti pada contoh sebelumnya). Ini akan menambahkan pemetaan login hanya untuk satu login lokal (Milhouse).

Setiap pengguna menjalankan kueri berikut lagi:

SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');

Hasil kueri adalah sebagai berikut.

sa

Msg 18456, Level 14, State 1, Line 1Login gagal untuk pengguna 'sa'.

Detail Masuk :Ada login yang disebut 'sa' di kedua server, tetapi mereka memiliki kata sandi yang berbeda. Keduanya adalah anggota sysadmin peran server.

Lisa

+----------------+------------------+| CURRENT_USER | LOGIN_ORIGINAL ||----------------+------------------|| dbo | Lisa |+----------------+------------------+

Detail Masuk :Ada login bernama 'Lisa' di kedua server, dan mereka memiliki kata sandi yang sama. Keduanya adalah anggota sysadmin peran server.

Milhouse

+----------------+------------------+| CURRENT_USER | LOGIN_ORIGINAL ||----------------+------------------|| Maggie | Maggie |+----------------+------------------+

Detail Masuk :Login ini hanya di server lokal. Tidak ada login yang sesuai di server tertaut.

Apu

Msg 18456, Level 14, State 1, Line 1Login gagal untuk pengguna 'Apu'.

Detail Masuk :Login ini hanya di server lokal. Tidak ada login yang sesuai di server tertaut.

Jadi kuncinya di sini adalah, bahkan ketika Anda membatasi login hanya untuk satu login lokal, itu tidak mencegah login lokal lain untuk terhubung ke server yang ditautkan. Jika mereka memiliki login yang sesuai di server tertaut, maka mereka akan dapat mengaksesnya menggunakan pemetaan login mereka sendiri yang dibuat saat sp_addlinkedserver dijalankan.

Contoh 4 – Sebenarnya Batasi hanya untuk Satu Login

Jika Anda benar-benar hanya ingin membatasi hanya satu login dan tidak lebih, Anda dapat menggunakan sp_droplinkedsrvlogin untuk menghapus semua pemetaan login yang sp_addlinkedserver buat sebelum Anda menjalankan sp_addlinkedsrvlogin .

EXEC sp_dropserver 'Homer', 'droplogins';EXEC sp_addlinkedserver @server=N'Homer', @srvproduct=N'', @provider=N'MSOLEDBSQL', @datasrc=N'172.17.0.2', @catalog ='Musik';EXEC sp_droplinkedsrvlogin 'Homer', NULL;EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin='Milhouse', @rmtuser=N'Maggie', @rmtpassword=N 'BigStrong#Passw0rd';

Sekarang mari kita jalankan kueri sekali lagi dengan setiap login:

SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');

Hasil kueri adalah sebagai berikut.

sa

Msg 7416, Level 16, State 1, Line 1Akses ke server jauh ditolak karena tidak ada pemetaan login.

Detail Masuk :Ada login yang disebut 'sa' di kedua server, tetapi mereka memiliki kata sandi yang berbeda. Keduanya adalah anggota sysadmin peran server.

Lisa

Msg 7416, Level 16, State 1, Line 1Akses ke server jauh ditolak karena tidak ada pemetaan login.

Detail Masuk :Ada login bernama 'Lisa' di kedua server, dan mereka memiliki kata sandi yang sama. Keduanya adalah anggota sysadmin peran server.

Milhouse

+----------------+------------------+| CURRENT_USER | LOGIN_ORIGINAL ||----------------+------------------|| Maggie | Maggie |+----------------+------------------+

Detail Masuk :Login ini hanya di server lokal. Tidak ada login yang sesuai di server tertaut.

Apu

Msg 7416, Level 16, State 1, Line 1Akses ke server jauh ditolak karena tidak ada pemetaan login.

Detail Masuk :Login ini hanya di server lokal. Tidak ada login yang sesuai di server tertaut.

Konfigurasi Login Jarak Jauh

Berhasil menghubungkan ke server tertaut hanyalah langkah pertama dalam proses. Setelah terhubung, kemampuan Anda untuk melakukan sesuatu akan dipengaruhi oleh izin pengguna jarak jauh tempat login Anda dipetakan.

Misalnya, jika Maggie dibuat di server jauh seperti ini:

CREATE LOGIN Maggie WITH PASSWORD ='BigStrong#Passw0rd';GUNAKAN Musik;BUAT USER Maggie UNTUK LOGIN Maggie;GRANT SELECT PADA DATABASE::Music TO Maggie;

Yang bisa dia lakukan hanyalah menjalankan SELECT pernyataan terhadap database 'Musik'. Oleh karena itu, siapa pun yang terhubung ke server tertaut menggunakan login Maggie akan dibatasi hanya itu.

Ini adalah praktik yang baik untuk hanya memberikan izin yang diperlukan, tetapi tidak lebih.

Dokumentasi Resmi

Artikel ini dimaksudkan untuk memberikan gambaran umum tingkat tinggi tentang cara kerja login dengan server tertaut. Ada banyak skenario lain yang tidak saya bahas di sini.

Jika Anda tertarik untuk mempelajari lebih lanjut, lihat tautan berikut ke dokumentasi Microsoft:

  • sp_addlinkedserver
  • sp_addlinkedsrvlogin
  • sp_testlinkedserver
  • sp_droplinkedsrvlogin
  • sp_dropserver
  • OPENQUERY()

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CREATE TABLE in SQL – Semua yang Perlu Anda Ketahui Tentang Membuat Tabel di SQL

  2. SQL SUM() untuk Pemula

  3. Menghubungkan SAS JMP ke Salesforce.com

  4. Pemantauan &Manajemen Database Tingkat Lanjut untuk TimescaleDB

  5. Memangkas Lemak Log Transaksi