Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Pemicu Masuk di SQL Server

Pemicu logon, seperti namanya, adalah pemicu yang dipicu sebagai respons terhadap peristiwa LOGON di SQL Server.

Dalam istilah sederhana, pemicu masuk menyala setiap kali seseorang mencoba membuat koneksi baru ke server database. Pemicu diaktifkan setelah otentikasi pengguna dan fase login selesai tetapi sebelum sesi pengguna benar-benar dimulai.

Keuntungan Pemicu Masuk

Ada beberapa keuntungan dari pemicu masuk:

  • Melacak Aktivitas Masuk
    Pemicu logon dapat digunakan untuk melacak aktivitas login yang terjadi di server database. Misalnya, dapat digunakan untuk menyimpan daftar semua pengguna yang masuk ke server database dalam jangka waktu yang ditentukan.
  • Membatasi Jumlah Koneksi Total
    Terlalu banyak login database dapat mempengaruhi kinerja database, terutama ketika sejumlah besar pengguna mengakses database. Dalam kasus seperti ini, pemicu login dapat digunakan untuk memeriksa jumlah total login yang sudah ada sebelum lebih banyak yang diizinkan.
  • Membatasi Jumlah Sesi per Koneksi
    Pemicu logon dapat digunakan untuk membatasi jumlah sesi per koneksi. Setiap kali pengguna mencoba membuat sesi baru, pemicu login dapat memeriksa jumlah sesi yang sudah aktif untuk login tersebut dan dapat membatasi sesi baru jika telah melebihi batas.

Sebelum kita mulai, pastikan Anda telah mencadangkan sepenuhnya.

Mengakses Koneksi Pengguna Aktif

Skrip berikut mengembalikan semua koneksi pengguna aktif ke database.

SELECT * FROM sys.dm_exec_sessions

sys.dm_exec_sessions adalah tampilan sistem yang mengembalikan semua koneksi pengguna aktif. Output dari query di atas terlihat seperti ini:

Output berisi informasi rinci tentang semua koneksi aktif. Kami tertarik pada dua kolom tersebut:is_user_process dan original_login_name.
Yang pertama memberitahu kita apakah koneksi telah dibuat oleh proses pengguna atau tidak, dan yang pertama berisi informasi tentang nama koneksi yang membuat login.

Jalankan kueri berikut:

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

Kueri di atas mengembalikan is_user_process dan original_login_name sebagai kolom pertama dan kedua bersama dengan semua kolom lainnya dari tampilan sys.dm_exec_sessions. Ini mengurutkan hasil berdasarkan urutan waktu login. Oleh karena itu, koneksi terbaru terbaru muncul di bagian atas.

Pada output, gulir ke bawah ke baris di mana kolom is_user_process berisi 1.

Dalam kasus saya, saya memiliki dua baris seperti yang ditunjukkan pada output di bawah ini:

Pada kolom original_login_name, Anda dapat melihat nama koneksi yang melakukan login (Dalam hal ini nama PC saya). Di kolom program_name, Anda dapat melihat jenis koneksi. Dalam kasus di atas, koneksi dengan session_id 51 adalah koneksi dengan SQL Server Object Explorer. Koneksi dengan session_id 52 adalah koneksi untuk satu-satunya jendela kueri tempat skrip dijalankan. Jika Anda membuka dua jendela kueri, Anda akan melihat total tiga koneksi pengguna di sini, dan seterusnya.

Untuk menghitung jumlah total koneksi yang dibuat oleh proses pengguna, jalankan kueri berikut:

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

Kueri di atas mengembalikan dua karena saya hanya memiliki dua koneksi user_process di server saya.

Pemicu Masuk untuk Membatasi Jumlah Masuk

Mari kita buat pemicu logon sederhana yang membatasi jumlah total login yang dapat dilakukan oleh satu koneksi, menjadi 3. Jika koneksi mencoba login ke server database untuk keempat kalinya, pemicu logon mengembalikan proses login.

Skrip untuk pemicu ini adalah sebagai berikut:

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

Pada script di atas kita membuat trigger bernama tr_CheckLogin. Cakupan pemicu disetel ke server.

Anda dapat melihat detail pemicu dengan membuka Object Explorer -> Server Objects -> Triggers, seperti yang ditunjukkan pada gambar di bawah ini:

Pemicu menyala setiap kali peristiwa LOGON terjadi, yaitu koneksi mencoba masuk ke server. Perhatikan tubuh pelatuk dengan cermat.

Fungsi ORIGINAL_LOGIN mengembalikan nama proses pengguna, atau koneksi yang mencoba masuk ke server. Selanjutnya, jumlah total koneksi dengan nama yang sama dihitung menggunakan tampilan sys.dm_exec_session. Jika jumlah koneksi lebih besar dari 3, login dibatalkan dan pernyataan dicetak kepada pengguna yang berbunyi:“Lebih dari tiga koneksi tidak diizinkan – Koneksi dengan ‘nama_koneksi’ Gagal”.

Untuk memverifikasi ini, buka jendela kueri baru di studio manajemen SQL Server

Catatan:Sebelumnya, ada dua koneksi yang terbuka, satu untuk SQL Server Management Studio dan satu lagi untuk jendela Query.

Saat Anda mencoba membuka jendela kueri baru, pemicu tr_CheckLogin akan diaktifkan tetapi karena jumlah total login akan menjadi tiga saat ini, pemicu tidak akan mengembalikan login.

Untuk memverifikasi bahwa jumlah total koneksi oleh user_process, jalankan kueri berikut:

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

Sekarang, ada total 3 koneksi pengguna seperti yang ditunjukkan pada output:

Sekarang coba lagi untuk membuat koneksi baru dengan membuka jendela kueri baru di studio manajemen SQL Server.

Anda akan melihat kesalahan berikut:

Kesalahan mengatakan bahwa login gagal untuk "DESKTOP-GLQ5VRA\Mani" (nama PC saya) karena memicu eksekusi. Pada dasarnya, pemicu yang kami buat tidak mengizinkan koneksi. Tunggu! Tapi di mana pesan kesalahan yang kami cetak? Kami tidak dapat melihatnya di sini di kotak pesan di atas. Pesan kesalahan khusus yang kami tulis di pemicu dapat dilihat di log kesalahan.

Untuk melihat log kesalahan, jalankan skrip berikut:

EXECUTE sp_readerrorlog

Gulir ke bawah log kesalahan hingga Anda menemukan pesan khusus yang Anda tulis untuk pemicu masuk. Tangkapan layar berikut menunjukkan log kesalahan server database saya. Pesan khusus dapat dilihat di log kesalahan:

Bacaan Lebih Lanjut:

  • YouTube:Pemicu Masuk SQL Server
  • Microsoft.com:Pemicu Masuk
  • Studi SQL:Melarikan Diri Dari Pemicu Masuk yang Melarikan Diri

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa memotong datetime di SQL Server?

  2. Mengapa dianggap praktik buruk menggunakan kursor di SQL Server?

  3. Menyertakan Tabel &Skema saat Mendaftar Kolom Identitas di Database SQL Server

  4. Perbaiki SQL Database Recovery Pending Access Masalah Ditolak

  5. Skalar UDF Inlining di SQL Server 2019