Khi định cấu hình một máy chủ được liên kết trong SQL Server, việc thiết lập thông tin đăng nhập đôi khi có thể gây nhầm lẫn. Trong bài viết này, tôi nhằm mục đích cung cấp tổng quan cấp cao về cách SQL Server ánh xạ thông tin đăng nhập cục bộ với thông tin đăng nhập từ xa trên máy chủ được liên kết.
Khi bạn sử dụng sp_addlinkedserver
để tạo máy chủ được liên kết trong SQL Server, ánh xạ mặc định giữa tất cả thông tin đăng nhập trên máy chủ cục bộ và thông tin đăng nhập từ xa trên máy chủ được liên kết sẽ tự động được tạo. SQL Server sử dụng thông tin đăng nhập cục bộ khi kết nối với máy chủ được liên kết thay mặt cho đăng nhập.
Vì vậy, nếu thông tin đăng nhập cục bộ của bạn có thông tin đăng nhập tương ứng trên máy chủ được liên kết, có cùng thông tin xác thực và có các quyền thích hợp, bạn sẽ có thể kết nối bằng thông tin đăng nhập cục bộ của mình. Không cần thêm thông tin đăng nhập cho máy chủ được liên kết (giả sử bạn hài lòng khi kết nối bằng thông tin đăng nhập cục bộ của riêng mình).
Nhưng nếu thông tin đăng nhập địa phương của bạn thì không có thông tin đăng nhập tương ứng trên máy chủ được liên kết (và có cùng thông tin đăng nhập), kết nối sẽ không thành công.
Trong những trường hợp như vậy, bạn có thể sử dụng sp_addlinkedsrvlogin
để tạo thông tin đăng nhập cho máy chủ được liên kết để thông tin đăng nhập cục bộ có thể kết nối với máy chủ được liên kết ngay cả khi họ không có thông tin đăng nhập tương ứng trên máy chủ được liên kết.
Việc này có thể dẫn đến việc những người dùng khác nhau được sử dụng trên máy chủ được liên kết, tùy thuộc vào việc họ có đăng nhập tương ứng trên máy chủ được liên kết hay không.
Đối với người dùng được kết nối với SQL Server bằng Chế độ xác thực Windows, SQL Server có thể tự động sử dụng thông tin xác thực bảo mật của Windows miễn là ủy quyền tài khoản bảo mật có sẵn trên máy khách và máy chủ gửi, đồng thời nhà cung cấp hỗ trợ Chế độ xác thực Windows.
Các ví dụ trên trang này sử dụng thông tin đăng nhập SQL Server (chúng không sử dụng Chế độ xác thực Windows). Các ví dụ này cho thấy kết quả tôi nhận được khi đăng nhập vào máy chủ được liên kết trong các tình huống khác nhau bằng thông tin đăng nhập SQL Server cục bộ.
Ví dụ 1 - Máy chủ được liên kết không có thông tin đăng nhập rõ ràng
Đầu tiên, tôi sẽ tạo một máy chủ được liên kết có tên là Homer, nhưng tôi sẽ không tạo bất kỳ thông tin đăng nhập nào được liên kết.
EXEC sp_addlinkedserver @ server =N'Homer ', @ srvproduct =N' ', @ provider =N'MSOLEDBSQL', @ datasrc =N'172.17.0.2 ', @ catalog =' Music ';
Điều này tự động tạo ánh xạ mặc định giữa tất cả thông tin đăng nhập trên máy chủ cục bộ và thông tin đăng nhập từ xa trên máy chủ được liên kết.
Bây giờ tôi sẽ cố gắng chạy truy vấn chuyển qua sau đối với máy chủ được liên kết bằng cách sử dụng các thông tin đăng nhập cục bộ khác nhau:
SELECT * FROM OPENQUERY (Homer, 'SELECT CURRENT_USER AS' 'CURRENT_USER' ', ORIGINAL_LOGIN () AS' 'ORIGINAL_LOGIN' '');
Kết quả truy vấn như sau.
sa
Đăng nhập không thành công cho người dùng 'sa'.
Chi tiết đăng nhập :Có một thông tin đăng nhập có tên là ‘sa’ trên cả hai máy chủ nhưng chúng có mật khẩu khác nhau. Cả hai đều là thành viên của sysadmin vai trò máy chủ.
Lisa
+ ---------------- + ------------------ + | CURRENT_USER | ORIGINAL_LOGIN || ---------------- + ------------------ || dbo | Lisa | + ---------------- + ------------------ +
Chi tiết đăng nhập :Có một thông tin đăng nhập có tên là 'Lisa' trên cả hai máy chủ và chúng có cùng một mật khẩu. Cả hai đều là thành viên của sysadmin vai trò máy chủ.
Milhouse
Đăng nhập không thành công cho người dùng 'Milhouse'.
Chi tiết đăng nhập :Đăng nhập này chỉ trên máy chủ cục bộ. Không có thông tin đăng nhập tương ứng trên máy chủ được liên kết.
Apu
Đăng nhập không thành công cho người dùng 'Apu'.
Chi tiết đăng nhập :Đăng nhập này chỉ trên máy chủ cục bộ. Không có thông tin đăng nhập tương ứng trên máy chủ được liên kết.
Ví dụ 2 - Thêm thông tin đăng nhập cho máy chủ được liên kết
Tiếp theo, tôi sẽ tạo thông tin đăng nhập cho máy chủ được liên kết.
EXEC sp_addlinkedsrvlogin @ rmtsrvname =N'Homer ', @ useelf =N'FALSE', @ locallogin =NULL, @ rmtuser =N'Maggie ', @ rmtpassword =N'BigStrong # Passw0rd';
Thông tin đăng nhập này tương ứng với thông tin đăng nhập trên máy chủ từ xa, do đó, một ánh xạ được tạo giữa chúng.
Bây giờ mỗi người dùng sẽ chạy lại truy vấn sau:
SELECT * FROM OPENQUERY (Homer, 'SELECT CURRENT_USER AS' 'CURRENT_USER' ', ORIGINAL_LOGIN () AS' 'ORIGINAL_LOGIN' '');
Kết quả truy vấn như sau.
sa
+ ---------------- + ------------------ + | CURRENT_USER | ORIGINAL_LOGIN || ---------------- + ------------------ || Maggie | Maggie | + ---------------- + ------------------ +
Chi tiết đăng nhập :Có một thông tin đăng nhập có tên là ‘sa’ trên cả hai máy chủ nhưng chúng có mật khẩu khác nhau. Cả hai đều là thành viên của sysadmin vai trò máy chủ.
Lisa
+ ---------------- + ------------------ + | CURRENT_USER | ORIGINAL_LOGIN || ---------------- + ------------------ || Maggie | Maggie | + ---------------- + ------------------ +
Chi tiết đăng nhập :Có một thông tin đăng nhập có tên là 'Lisa' trên cả hai máy chủ và chúng có cùng một mật khẩu. Cả hai đều là thành viên của sysadmin vai trò máy chủ.
Milhouse
+ ---------------- + ------------------ + | CURRENT_USER | ORIGINAL_LOGIN || ---------------- + ------------------ || Maggie | Maggie | + ---------------- + ------------------ +
Chi tiết đăng nhập :Đăng nhập này chỉ trên máy chủ cục bộ. Không có thông tin đăng nhập tương ứng trên máy chủ được liên kết.
Apu
+ ---------------- + ------------------ + | CURRENT_USER | ORIGINAL_LOGIN || ---------------- + ------------------ || Maggie | Maggie | + ---------------- + ------------------ +
Chi tiết đăng nhập :Đăng nhập này chỉ trên máy chủ cục bộ. Không có thông tin đăng nhập tương ứng trên máy chủ được liên kết.
Vì vậy, tất cả thông tin đăng nhập cục bộ đã có thể kết nối với máy chủ được liên kết. Ngay cả những thông tin đăng nhập không có thông tin đăng nhập từ xa tương ứng trên máy chủ được liên kết cũng có thể kết nối. Điều này là do tất cả họ đều sử dụng thông tin đăng nhập Maggie. Cảm ơn Maggie!
Ví dụ 3 - Hạn chế đăng nhập
Bây giờ tôi sẽ cập nhật thông tin đăng nhập cho máy chủ được liên kết để nó được giới hạn ở Milhouse.
Nhưng để thực hiện việc này, tôi cần xóa máy chủ được liên kết và tạo lại. Nếu tôi không làm điều này, SQL Server sẽ sử dụng các ánh xạ hiện có và tôi sẽ nhận được kết quả tương tự như trên.
EXEC sp_dropserver 'Homer', 'droplogins'; EXEC sp_addlinkedserver @ server =N'Homer ', @ srvproduct =N' ', @ provider =N'MSOLEDBSQL', @ datasrc =N'172.17.0.2 ', @catalog ='Âm nhạc'; EXEC sp_addlinkedsrvlogin @ rmtsrvname =N'Homer ', @ useelf =N'FALSE', @ locallogin ='Milhouse', @ rmtuser =N'Maggie ', @ rmtpassword =N'BigStrong # Passw0rd';Vì vậy, trong trường hợp này, tôi sử dụng
@locallogin='Milhouse'
(thay vì@locallogin=NULL
như trong ví dụ trước). Thao tác này sẽ thêm ánh xạ đăng nhập chỉ cho một lần đăng nhập cục bộ (Milhouse).Mỗi người dùng chạy lại truy vấn sau:
SELECT * FROM OPENQUERY (Homer, 'SELECT CURRENT_USER AS' 'CURRENT_USER' ', ORIGINAL_LOGIN () AS' 'ORIGINAL_LOGIN' '');Kết quả truy vấn như sau.
sa
Msg 18456, Mức 14, Trạng thái 1, Dòng 1 Đăng nhập không thành công cho người dùng 'sa'.Chi tiết đăng nhập :Có một thông tin đăng nhập có tên là ‘sa’ trên cả hai máy chủ nhưng chúng có mật khẩu khác nhau. Cả hai đều là thành viên của sysadmin vai trò máy chủ.
Lisa
+ ---------------- + ------------------ + | CURRENT_USER | ORIGINAL_LOGIN || ---------------- + ------------------ || dbo | Lisa | + ---------------- + ------------------ +Chi tiết đăng nhập :Có một thông tin đăng nhập có tên là 'Lisa' trên cả hai máy chủ và chúng có cùng một mật khẩu. Cả hai đều là thành viên của sysadmin vai trò máy chủ.
Milhouse
+ ---------------- + ------------------ + | CURRENT_USER | ORIGINAL_LOGIN || ---------------- + ------------------ || Maggie | Maggie | + ---------------- + ------------------ +Chi tiết đăng nhập :Đăng nhập này chỉ trên máy chủ cục bộ. Không có thông tin đăng nhập tương ứng trên máy chủ được liên kết.
Apu
Msg 18456, Mức 14, Trạng thái 1, Dòng 1 Đăng nhập không thành công cho người dùng 'Apu'.Chi tiết đăng nhập :Đăng nhập này chỉ trên máy chủ cục bộ. Không có thông tin đăng nhập tương ứng trên máy chủ được liên kết.
Vì vậy, điểm mấu chốt ở đây là, ngay cả khi bạn hạn chế đăng nhập chỉ với một thông tin đăng nhập cục bộ, điều đó không ngăn cản các đăng nhập cục bộ khác kết nối với máy chủ được liên kết. Nếu họ có thông tin đăng nhập tương ứng trên máy chủ được liên kết, thì họ sẽ có thể truy cập nó bằng cách sử dụng ánh xạ đăng nhập của riêng họ được tạo khi
sp_addlinkedserver
đã được chạy.Ví dụ 4 - Trên thực tế, chỉ giới hạn ở một lần đăng nhập
Nếu bạn thực sự chỉ muốn giới hạn chỉ một lần đăng nhập và không cần đăng nhập nữa, bạn có thể sử dụng
sp_droplinkedsrvlogin
để bỏ tất cả ánh xạ đăng nhậpsp_addlinkedserver
tạo trước khi bạn thực thisp_addlinkedsrvlogin
.EXEC sp_dropserver 'Homer', 'droplogins'; EXEC sp_addlinkedserver @ server =N'Homer ', @ srvproduct =N' ', @ provider =N'MSOLEDBSQL', @ datasrc =N'172.17.0.2 ', @catalog ='Âm nhạc'; EXEC sp_droplinkedsrvlogin 'Homer', NULL; EXEC sp_addlinkedsrvlogin @ rmtsrvname =N'Homer ', @ useelf =N'FALSE', @ locallogin ='Milhouse', @ rmtuser =N'Maggie ', @ rmtpassword =N 'BigStrong # Passw0rd';Bây giờ, hãy chạy lại truy vấn với mỗi lần đăng nhập:
SELECT * FROM OPENQUERY (Homer, 'SELECT CURRENT_USER AS' 'CURRENT_USER' ', ORIGINAL_LOGIN () AS' 'ORIGINAL_LOGIN' '');Kết quả truy vấn như sau.
sa
Msg 7416, Mức 16, Trạng thái 1, Dòng 1A, truy cập vào máy chủ từ xa bị từ chối vì không tồn tại ánh xạ đăng nhập.Chi tiết đăng nhập :Có một thông tin đăng nhập có tên là ‘sa’ trên cả hai máy chủ nhưng chúng có mật khẩu khác nhau. Cả hai đều là thành viên của sysadmin vai trò máy chủ.
Lisa
Msg 7416, Mức 16, Trạng thái 1, Dòng 1A, truy cập vào máy chủ từ xa bị từ chối vì không tồn tại ánh xạ đăng nhập.Chi tiết đăng nhập :Có một thông tin đăng nhập có tên là 'Lisa' trên cả hai máy chủ và chúng có cùng một mật khẩu. Cả hai đều là thành viên của sysadmin vai trò máy chủ.
Milhouse
+ ---------------- + ------------------ + | CURRENT_USER | ORIGINAL_LOGIN || ---------------- + ------------------ || Maggie | Maggie | + ---------------- + ------------------ +Chi tiết đăng nhập :Đăng nhập này chỉ trên máy chủ cục bộ. Không có thông tin đăng nhập tương ứng trên máy chủ được liên kết.
Apu
Msg 7416, Mức 16, Trạng thái 1, Dòng 1A, truy cập vào máy chủ từ xa bị từ chối vì không tồn tại ánh xạ đăng nhập.Chi tiết đăng nhập :Đăng nhập này chỉ trên máy chủ cục bộ. Không có thông tin đăng nhập tương ứng trên máy chủ được liên kết.
Cấu hình đăng nhập từ xa
Kết nối thành công với máy chủ được liên kết chỉ là bước đầu tiên trong quá trình này. Sau khi được kết nối, khả năng thực hiện công việc của bạn sẽ bị ảnh hưởng bởi quyền của người dùng từ xa mà thông tin đăng nhập của bạn được ánh xạ tới.
Ví dụ:nếu Maggie được tạo trên máy chủ từ xa như thế này:
TẠO Maggie ĐĂNG NHẬP BẰNG PASSWORD ='BigStrong # Passw0rd'; SỬ DỤNG Nhạc; TẠO NGƯỜI DÙNG Maggie ĐỂ ĐĂNG NHẬP Maggie; CẤP CHỌN TRÊN CƠ SỞ DỮ LIỆU ::Nhạc CHO Maggie;Tất cả những gì cô ấy có thể làm là chạy
SELECT
câu lệnh chống lại cơ sở dữ liệu "Music". Do đó, bất kỳ ai kết nối với máy chủ được liên kết bằng thông tin đăng nhập của Maggie sẽ bị giới hạn trong phạm vi đó.Một phương pháp hay là chỉ cấp các quyền được yêu cầu, nhưng không cấp thêm.
Tài liệu chính thức
Bài viết này nhằm cung cấp tổng quan cấp cao về cách đăng nhập hoạt động với các máy chủ được liên kết. Có rất nhiều tình huống khác mà tôi không trình bày ở đây.
Nếu bạn muốn tìm hiểu thêm, hãy xem các liên kết sau đến tài liệu của Microsoft:
-
sp_addlinkedserver
-
sp_addlinkedsrvlogin
-
sp_testlinkedserver
-
sp_droplinkedsrvlogin
-
sp_dropserver
-
OPENQUERY()