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

Kích hoạt đăng nhập trong SQL Server

Trình kích hoạt đăng nhập, như tên cho thấy, là trình kích hoạt kích hoạt để phản hồi sự kiện LOGON trong SQL Server.

Nói một cách dễ hiểu, một trình kích hoạt đăng nhập sẽ kích hoạt bất cứ khi nào ai đó cố gắng thiết lập một kết nối mới với một máy chủ cơ sở dữ liệu. Trình kích hoạt kích hoạt sau khi xác thực người dùng và giai đoạn đăng nhập hoàn tất nhưng trước khi phiên người dùng thực sự được bắt đầu.

Ưu điểm của Trình kích hoạt đăng nhập

Có một số ưu điểm của trình kích hoạt đăng nhập:

  • Theo dõi Hoạt động Đăng nhập Trình kích hoạt đăng nhập
    có thể được sử dụng để theo dõi hoạt động đăng nhập diễn ra trên máy chủ cơ sở dữ liệu. Ví dụ:nó có thể được sử dụng để duy trì danh sách tất cả những người dùng đã đăng nhập vào máy chủ cơ sở dữ liệu trong khoảng thời gian được chỉ định.
  • Hạn chế Tổng số Kết nối
    Quá nhiều lần đăng nhập cơ sở dữ liệu có thể ảnh hưởng đến hiệu suất của cơ sở dữ liệu, đặc biệt khi một số lượng lớn người dùng đang truy cập cơ sở dữ liệu. Trong những trường hợp như vậy, các trình kích hoạt đăng nhập này có thể được sử dụng để kiểm tra tổng số lần đăng nhập đã tồn tại trước khi cho phép nhiều lần đăng nhập hơn.
  • Hạn chế số lượng phiên trên mỗi kết nối
    Một trình kích hoạt đăng nhập có thể được sử dụng để giới hạn số phiên trên mỗi kết nối. Bất cứ khi nào người dùng cố gắng thiết lập một phiên mới, trình kích hoạt đăng nhập có thể kiểm tra số lượng phiên đã hoạt động cho thông tin đăng nhập đó và có thể hạn chế bất kỳ phiên mới nào nếu chúng đã vượt quá giới hạn.

Trước khi chúng tôi bắt đầu, hãy đảm bảo rằng bạn đã được sao lưu đầy đủ.

Truy cập kết nối người dùng đang hoạt động

Tập lệnh sau trả về tất cả các kết nối người dùng đang hoạt động vào cơ sở dữ liệu.

SELECT * FROM sys.dm_exec_sessions

sys.dm_exec_sessions là một dạng xem hệ thống trả về tất cả các kết nối người dùng đang hoạt động. Đầu ra của truy vấn trên trông giống như sau:

Đầu ra chứa thông tin chi tiết về tất cả các kết nối đang hoạt động. Chúng tôi quan tâm đến hai trong số các cột đó:is_user_process và original_login_name.
Cột thứ nhất cho chúng tôi biết liệu kết nối có được thực hiện bởi quy trình người dùng hay không và cột thứ nhất chứa thông tin về tên của kết nối đã thực hiện đăng nhập.

Thực hiện truy vấn sau:

SELECT is_user_process, original_login_name, *
FROM sys.dm_exec_sessions ORDER BY login_time DESC

Truy vấn trên trả về is_user_process và original_login_name dưới dạng cột đầu tiên và cột thứ hai cùng với phần còn lại của tất cả các cột từ chế độ xem sys.dm_exec_sessions. Nó sắp xếp kết quả theo thứ tự giảm dần của thời gian đăng nhập. Do đó, các kết nối gần đây nhất sẽ xuất hiện ở trên cùng.

Trong đầu ra, cuộn xuống các hàng trong đó cột is_user_process chứa 1.

Trong trường hợp của tôi, tôi có hai hàng như được hiển thị trong đầu ra bên dưới:

Trong cột original_login_name, bạn có thể thấy tên của kết nối đã thực hiện đăng nhập (Trong trường hợp này là tên PC của tôi). Trong cột tên_chương_trình, bạn có thể thấy kiểu kết nối. Trong trường hợp trên, kết nối với session_id 51 là kết nối với SQL Server Object Explorer. Kết nối với session_id 52 là kết nối cho cửa sổ truy vấn duy nhất mà tập lệnh đang được chạy. Nếu bạn mở hai cửa sổ truy vấn, bạn sẽ thấy tổng cộng ba kết nối người dùng tại đây, v.v.

Để đếm tổng số kết nối được thực hiện bởi các quy trình của người dùng, hãy thực hiện truy vấn sau:

SELECT COUNT(*) FROM sys.dm_exec_sessions 
WHERE is_user_process = 1

Truy vấn trên trả về hai vì tôi chỉ có hai kết nối user_process trên máy chủ của mình.

Kích hoạt đăng nhập để giới hạn số lần đăng nhập

Hãy tạo trình kích hoạt đăng nhập đơn giản giới hạn tổng số lần đăng nhập có thể được thực hiện bởi một kết nối, là 3. Nếu kết nối cố gắng đăng nhập vào máy chủ cơ sở dữ liệu lần thứ tư, trình kích hoạt đăng nhập sẽ quay trở lại quá trình đăng nhập.

Tập lệnh cho trình kích hoạt này như sau:

CREATE TRIGGER tr_CheckLogin
ON ALL SERVER
FOR LOGON
AS
BEGIN
	DECLARE @login NVARCHAR(100)
	SET @login = ORIGINAL_LOGIN()

	IF
	(SELECT COUNT(*) FROM sys.dm_exec_sessions 
	WHERE is_user_process = 1
	AND original_login_name = @login) > 3
	BEGIN
	Print 'More than three connections not allowed - Connection by ' + @login + ' Failed'
	ROLLBACK
	END

END

Trong tập lệnh trên, chúng tôi tạo một trình kích hoạt có tên tr_CheckLogin. Phạm vi trình kích hoạt được đặt thành máy chủ.

Bạn có thể xem chi tiết kích hoạt bằng cách đi tới Object Explorer -> Server Objects -> Trigger, như thể hiện trong hình bên dưới:

Trình kích hoạt kích hoạt bất cứ khi nào sự kiện LOGON diễn ra, tức là một kết nối cố gắng đăng nhập vào máy chủ. Hãy xem kỹ phần thân của trình kích hoạt.

Hàm ORIGINAL_LOGIN trả về tên của quá trình người dùng hoặc kết nối đang cố gắng đăng nhập vào máy chủ. Tiếp theo, tổng số kết nối có cùng tên được đếm bằng cách sử dụng dạng xem sys.dm_exec_session. Nếu số lượng kết nối lớn hơn 3, thông tin đăng nhập sẽ được khôi phục và một câu lệnh được in cho người dùng có nội dung:“Không cho phép nhiều hơn ba kết nối - Kết nối bởi‘ connection_name ’không thành công”.

Để xác minh điều này, hãy mở một cửa sổ truy vấn mới trong studio quản lý SQL Server

Lưu ý:Trước đây, có hai kết nối đang mở, một cho SQL Server Management Studio và một cho cửa sổ Truy vấn.

Khi bạn cố gắng mở một cửa sổ truy vấn mới, trình kích hoạt tr_CheckLogin sẽ kích hoạt nhưng vì tổng số lần đăng nhập sẽ là ba tại thời điểm này, trình kích hoạt sẽ không khôi phục thông tin đăng nhập.

Để xác minh rằng tổng số kết nối theo user_process, hãy thực hiện truy vấn sau:

SELECT COUNT(*) FROM sys.dm_exec_sessions 
WHERE is_user_process = 1

Bây giờ, có tổng cộng 3 kết nối người dùng như được hiển thị trong đầu ra:

Bây giờ, hãy thử tạo một kết nối mới bằng cách mở một cửa sổ truy vấn mới trong studio quản lý SQL Server.

Bạn sẽ thấy lỗi sau:

Lỗi cho biết đăng nhập không thành công cho “DESKTOP-GLQ5VRA \ Mani” (tên PC của tôi) do thực thi trình kích hoạt. Về cơ bản, trình kích hoạt chúng tôi đã tạo không cho phép kết nối. Đợi đã! Nhưng thông báo lỗi mà chúng tôi đã in ở đâu? Chúng tôi không thể nhìn thấy nó ở đây trong hộp thông báo trên. Bạn có thể xem thông báo lỗi tùy chỉnh mà chúng tôi đã viết trong trình kích hoạt trong nhật ký lỗi.

Để xem nhật ký lỗi, hãy thực thi đoạn mã sau:

EXECUTE sp_readerrorlog

Cuộn xuống nhật ký lỗi cho đến khi bạn tìm thấy thông báo tùy chỉnh mà bạn đã viết cho trình kích hoạt đăng nhập. Ảnh chụp màn hình sau đây hiển thị nhật ký lỗi của máy chủ cơ sở dữ liệu của tôi. Thông báo tùy chỉnh có thể được nhìn thấy trong nhật ký lỗi:

Đọc thêm:

  • YouTube:Kích hoạt Đăng nhập Máy chủ SQL
  • Microsoft.com:Kích hoạt Đăng nhập
  • Nghiên cứu SQL:Thoát khỏi trình kích hoạt đăng nhập bỏ chạy

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chặn, Chặn, Chặn trên cửa DBA với Chặn máy chủ SQL

  2. Làm thế nào để sửa lỗi Microsoft SQL Server Error 926? - Đã giải quyết

  3. Khôi phục cơ sở dữ liệu máy chủ SQL (T-SQL)

  4. Batch Mode Bitmaps trong SQL Server

  5. Tập lệnh khoảng không quảng cáo thu thập SQL Server -1