Bejelentkezési eseményindítók

A következőkre vonatkozik:SQL ServerAzure SQL Managed Instance

A bejelentkezési triggerek tárolt eljárásokat aktiválnak egy LOGON eseményre válaszul. Ez az esemény akkor jön létre, ha az SQL Server egy példányával létrejön egy felhasználói munkamenet. A bejelentkezés a naplózás hitelesítési fázisának befejeződése után, de a felhasználói munkamenet létrehozása előtt aktiválódik. Ezért az eseményindítón belülről érkező összes olyan üzenet, amely általában eléri a felhasználót, például a hibaüzenetek és az PRINT utasításból érkező üzenetek, az SQL Server hibanaplójába kerül. A bejelentkezési eseményindítók nem indulnak el, ha a hitelesítés sikertelen.

A bejelentkezési eseményindítók segítségével naplózhatja és szabályozhatja a kiszolgálói munkameneteket, például nyomon követheti a bejelentkezési tevékenységeket, korlátozhatja a bejelentkezéseket az SQL Serverre, vagy korlátozhatja egy adott bejelentkezés munkameneteinek számát. A következő kódban például a bejelentkezési eseményindító letiltja a bejelentkezéssel login_test indított SQL Server-bejelentkezési kísérleteket, ha a bejelentkezés már három felhasználói munkamenetet hozott létre.

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;

Az LOGON esemény az SQL Trace-eseménynek felel meg AUDIT_LOGIN , amely az eseményértesítésekben használható. Az eseményindítók és az eseményértesítések közötti elsődleges különbség az, hogy az eseményindítók szinkron módon jelennek meg az eseményekkel, míg az eseményértesítések aszinkronok. Ez azt jelenti például, hogy ha meg szeretné akadályozni egy munkamenet létrehozását, akkor bejelentkezési eseményindítót kell használnia. Az eseményről szóló eseményértesítések AUDIT_LOGIN erre a célra nem használhatók.

Az első és az utolsó eseményindító megadása

Az eseményen LOGON több eseményindító is definiálható. Ezen eseményindítók bármelyike kijelölhető az első vagy utolsó eseményindítóként, amelyet a rendszer által tárolt sp_settriggerorder eljárással aktiválhat. Az SQL Server nem garantálja a többi eseményindító végrehajtási sorrendjét.

Tranzakciók kezelése

Mielőtt az SQL Server elindít egy bejelentkezési eseményindítót, az SQL Server létrehoz egy implicit tranzakciót, amely független minden felhasználói tranzakciótól. Ezért amikor az első bejelentkezési eseményindító elindul, a tranzakciószám 1. Miután az összes bejelentkezési trigger lefut, a tranzakció elköteleződik. Más típusú eseményindítókhoz hasonlóan az SQL Server hibát ad vissza, ha egy bejelentkezési eseményindító 0 tranzakciószámmal fejezi be a végrehajtást. Az ROLLBACK TRANSACTION utasítás visszaállítja a tranzakciószámot 0-ra, még akkor is, ha az utasítás beágyazott tranzakcióban van kiadva. COMMIT TRANSACTION a tranzakciószámot 0-ra csökkentheti. Ezért javasoljuk, hogy ne adjon ki COMMIT TRANSACTION utasításokat a bejelentkezési eseményindítókon belül.

Vegye figyelembe a következőket, ha bejelentkezési eseményindítókon belüli utasítást ROLLBACK TRANSACTION használ:

  • A pontig ROLLBACK TRANSACTION végrehajtott adatmódosítások vissza lesznek állítva. Ezek a módosítások magukban foglalják az aktuális eseményindító és az ugyanazon eseményen végrehajtott korábbi eseményindítók módosításait. Az adott esemény többi eseményindítója nem lesz végrehajtva.

  • Az aktuális eseményindító továbbra is végrehajtja az ROLLBACK utasítást követően megjelenő hátralévő utasításokat. Ha ezen utasítások bármelyike módosítja az adatokat, a módosítások nem lesznek visszaállítva.

A rendszer nem hoz létre felhasználói munkamenetet, ha az eseményindító LOGON végrehajtása során az alábbi feltételek bármelyike bekövetkezik:

  • Az eredeti implicit tranzakció visszagördült vagy meghiúsul.
  • A 20-nál nagyobb súlyosságú hiba a trigger törzsében keletkezik.

Bejelentkezési eseményindító letiltása

A bejelentkezési eseményindítók hatékonyan megakadályozhatják az adatbázismotorral való sikeres kapcsolatokat minden felhasználó számára, beleértve a sysadmin rögzített kiszolgálói szerepkör tagjait is. Ha egy bejelentkezési eseményindító megakadályozza a kapcsolatokat, a sysadmin rögzített kiszolgálói szerepkör tagjai a dedikált rendszergazdai kapcsolat használatával vagy az adatbázismotor minimális konfigurációs módban (-f) való elindításával csatlakozhatnak. További információ: Database Engine Service indítási beállításai.