Pemicu masuk

Berlaku untuk:SQL ServerAzure SQL Managed Instance

Masuk memicu prosedur tersimpan kebakaran sebagai respons terhadap suatu LOGON peristiwa. Kejadian ini dimunculkan ketika sesi pengguna dibuat dengan instans SQL Server. Pemicu masuk diaktifkan setelah fase autentikasi pengelogan selesai, tetapi sebelum sesi pengguna dibuat. Oleh karena itu, semua pesan yang berasal dari dalam pemicu yang biasanya akan menjangkau pengguna, seperti pesan kesalahan dan pesan dari PRINT pernyataan, dialihkan ke log kesalahan SQL Server. Pemicu masuk tidak diaktifkan jika autentikasi gagal.

Anda dapat menggunakan pemicu masuk untuk mengaudit dan mengontrol sesi server, seperti dengan melacak aktivitas masuk, membatasi login ke SQL Server, atau membatasi jumlah sesi untuk login tertentu. Misalnya, dalam kode berikut, pemicu masuk menolak upaya masuk ke SQL Server yang dimulai dengan masuk login_test jika sudah ada tiga sesi pengguna yang dibuat oleh login tersebut.

USE master;
GO

CREATE LOGIN login_test
WITH PASSWORD = N'3KHJ6dhx(0xVYsdf' MUST_CHANGE,
CHECK_EXPIRATION = ON;
GO

GRANT VIEW SERVER STATE TO login_test;
GO

CREATE TRIGGER connection_limit_trigger ON ALL SERVER
WITH EXECUTE AS N'login_test'
FOR LOGON AS BEGIN
    IF ORIGINAL_LOGIN() = N'login_test'
    AND (
        SELECT COUNT(*)
        FROM sys.dm_exec_sessions
        WHERE is_user_process = 1
            AND original_login_name = N'login_test') > 3
    ROLLBACK;
END;

Peristiwa LOGON ini sesuai dengan AUDIT_LOGIN peristiwa SQL Trace, yang dapat digunakan dalam Pemberitahuan Peristiwa. Perbedaan utama antara pemicu dan pemberitahuan peristiwa adalah bahwa pemicu dinaikkan secara sinkron dengan peristiwa, sedangkan pemberitahuan peristiwa tidak sinkron. Ini berarti, misalnya, bahwa jika Anda ingin menghentikan sesi dibuat, Anda harus menggunakan pemicu masuk. Pemberitahuan peristiwa pada AUDIT_LOGIN peristiwa tidak dapat digunakan untuk tujuan ini.

Tentukan pemicu pertama dan terakhir

Beberapa pemicu dapat ditentukan pada peristiwa.LOGON Salah satu pemicu ini dapat ditunjuk sebagai pemicu pertama atau terakhir yang akan diaktifkan pada suatu peristiwa dengan menggunakan prosedur tersimpan sistem sp_settriggerorder . SQL Server tidak menjamin urutan eksekusi pemicu yang tersisa.

Kelola transaksi

Sebelum SQL Server mengaktifkan pemicu masuk, SQL Server membuat transaksi implisit yang independen dari transaksi pengguna apa pun. Oleh karena itu, ketika pemicu masuk pertama mulai diaktifkan, jumlah transaksi adalah 1. Setelah semua pemicu masuk selesai dieksekusi, transaksi akan diterapkan. Seperti halnya jenis pemicu lainnya, SQL Server mengembalikan kesalahan jika pemicu masuk menyelesaikan eksekusi dengan jumlah transaksi 0. Pernyataan mereset ROLLBACK TRANSACTION jumlah transaksi menjadi 0, bahkan jika pernyataan dikeluarkan di dalam transaksi berlapis. COMMIT TRANSACTION mungkin mengurangi jumlah transaksi menjadi 0. Oleh karena itu, kami menyarankan untuk tidak mengeluarkan COMMIT TRANSACTION pernyataan di dalam pemicu masuk.

Pertimbangkan hal berikut saat Anda menggunakan ROLLBACK TRANSACTION pernyataan di dalam pemicu masuk:

  • Setiap modifikasi data yang dibuat hingga titik ROLLBACK TRANSACTION digulung balik. Modifikasi ini mencakup perubahan yang dilakukan oleh pemicu saat ini, dan oleh pemicu sebelumnya yang dijalankan pada peristiwa yang sama. Pemicu yang tersisa untuk peristiwa tertentu tidak dijalankan.

  • Pemicu saat ini terus menjalankan pernyataan yang tersisa yang muncul setelah ROLLBACK pernyataan. Jika salah satu pernyataan ini memodifikasi data, modifikasi tidak digulung balik.

Sesi pengguna tidak dibuat jika salah satu kondisi berikut terjadi selama eksekusi pemicu pada LOGON peristiwa:

  • Transaksi implisit asli digulung balik atau gagal.
  • Kesalahan yang memiliki tingkat keparahan lebih besar dari 20 dimunculkan di dalam isi pemicu.

Menonaktifkan pemicu masuk

Pemicu masuk dapat secara efektif mencegah keberhasilan koneksi ke Mesin Database untuk semua pengguna, termasuk anggota peran server tetap sysadmin . Ketika pemicu masuk mencegah koneksi, anggota peran server tetap sysadmin dapat terhubung dengan menggunakan koneksi administrator khusus, atau dengan memulai Mesin Database dalam mode konfigurasi minimal (-f). Untuk informasi selengkapnya, lihat Opsi startup Database Engine Service.