sql >> Databasteknik >  >> RDS >> Sqlserver

Inloggningsutlösare i SQL Server

En inloggningsutlösare, som namnet antyder, är en utlösare som utlöses som svar på en LOGON-händelse i SQL Server.

Enkelt uttryckt utlöses en inloggningstrigger när någon försöker upprätta en ny anslutning till en databasserver. Utlösaren aktiveras efter användarautentiseringen och inloggningsfasen är klar men innan användarsessionen faktiskt initieras.

Fördelar med inloggningsutlösare

Det finns flera fördelar med inloggningsutlösare:

  • Spåra inloggningsaktivitet
    Inloggningsutlösare kan användas för att hålla reda på inloggningsaktiviteten som sker på databasservern. Den kan till exempel användas för att upprätthålla en lista över alla användare som loggat in på databasservern inom den angivna tidsperioden.
  • Begränsa antalet totala anslutningar
    För många databasinloggningar kan påverka prestandan för en databas, särskilt när ett stort antal användare använder en databas. I fall som dessa kan inloggningsutlösare användas för att kontrollera antalet totala inloggningar som redan finns innan fler tillåts.
  • Begränsning av antalet sessioner per anslutning
    En inloggningsutlösare kan användas för att begränsa antalet sessioner per anslutning. Närhelst en användare försöker upprätta en ny session kan en inloggningsutlösare kontrollera antalet sessioner som redan är aktiva för den inloggningen och kan begränsa eventuella nya sessioner om de har överskridit en gräns.

Innan vi sätter igång, se till att du är helt säkerhetskopierad.

Åtkomst till aktiva användaranslutningar

Följande skript returnerar alla aktiva användaranslutningar till en databas.

SELECT * FROM sys.dm_exec_sessions

sys.dm_exec_sessions är en systemvy som returnerar alla aktiva användaranslutningar. Utdata från ovanstående fråga ser ut så här:

Utgången innehåller detaljerad information om alla aktiva anslutningar. Vi är intresserade av två av dessa kolumner:is_user_process och original_login_name.
Den förra talar om för oss om anslutningen har gjorts av en användarprocess eller inte, och den förra innehåller information om namnet på den anslutning som gjorde inloggningen.

Kör följande fråga:

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

Ovanstående fråga returnerar is_user_process och original_login_name som första och andra kolumn tillsammans med resten av alla kolumner från vyn sys.dm_exec_sessions. Den sorterar resultaten efter fallande ordning på inloggningstiden. Därför visas de senaste anslutningarna överst.

Bläddra ned till raderna där kolumnen is_user_process innehåller en 1 i utdata.

I mitt fall har jag två sådana rader som visas i utgången nedan:

I kolumnen original_login_name kan du se namnet på anslutningen som gjorde inloggningen (I det här fallet namnet på min PC). I kolumnen programnamn kan du se typen av anslutning. I ovanstående fall är anslutningen med session_id 51 anslutningen till SQL Server Object Explorer. Anslutningen till session_id 52 är anslutningen för det enda frågefönster där skriptet körs. Om du har två frågefönster öppna kommer du att se totalt tre användaranslutningar här, och så vidare.

För att räkna det totala antalet anslutningar som gjorts av användarprocesser, kör följande fråga:

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

Ovanstående fråga returnerar två eftersom jag bara har två user_process-anslutningar på min server.

Inloggningsutlösare för att begränsa antalet inloggningar

Låt oss skapa en enkel inloggningsutlösare som begränsar det totala antalet inloggningar som kan göras av en anslutning, till 3. Om anslutningen försöker logga in på databasservern för fjärde gången, rullar inloggningsutlösaren tillbaka inloggningsprocessen.

Skriptet för denna utlösare är som följer:

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

I skriptet ovan skapar vi en trigger som heter tr_CheckLogin. Utlösningsomfånget är inställt på server.

Du kan se utlösardetaljerna genom att gå till Objektutforskaren -> Serverobjekt -> Utlösare, som visas i bilden nedan:

Utlösaren aktiveras när LOGON-händelsen äger rum, dvs en anslutning försöker logga in på servern. Ta en noggrann titt på avtryckarens kropp.

Funktionen ORIGINAL_LOGIN returnerar namnet på användarprocessen eller anslutningen som försöker logga in på servern. Därefter räknas det totala antalet anslutningar med samma namn med hjälp av vyn sys.dm_exec_session. Om antalet anslutningar är fler än 3 rullas inloggningen tillbaka och ett uttalande skrivs ut till användaren som lyder:"Fler än tre anslutningar är inte tillåtna – Anslutning med 'anslutningsnamn' misslyckades".

För att verifiera detta, öppna ett nytt frågefönster i SQL Server Management Studio

Obs! Tidigare har två anslutningar varit öppna, en för SQL Server Management Studio och en för frågefönstret.

När du försöker öppna ett nytt frågefönster kommer tr_CheckLogin-utlösaren att aktiveras, men eftersom det totala antalet inloggningar kommer att vara tre vid denna tidpunkt kommer utlösaren inte att rulla tillbaka inloggningen.

För att verifiera att det totala antalet anslutningar av user_process, kör följande fråga:

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

Nu finns det totalt 3 användaranslutningar som visas i utgången:

Försök nu igen att skapa en ny anslutning genom att öppna ett nytt frågefönster i SQL Server Management Studio.

Du kommer att se följande fel:

Felet säger att inloggningen misslyckades för "DESKTOP-GLQ5VRA\Mani" (namnet på min PC) på grund av triggerexekvering. I grund och botten tillät utlösaren vi skapade inte anslutningen. Vänta! Men var är felmeddelandet som vi skrev ut? Vi kan inte se det här i meddelanderutan ovan. Det anpassade felmeddelandet som vi skrev i triggern kan ses i felloggen.

För att se felloggen, kör följande skript:

EXECUTE sp_readerrorlog

Rulla ner i felloggen tills du hittar det anpassade meddelandet som du skrev för inloggningsutlösaren. Följande skärmdump visar felloggen för min databasserver. Det anpassade meddelandet kan ses i felloggen:

Ytterligare läsning:

  • YouTube:SQL Server-inloggningsutlösare
  • Microsoft.com:Inloggningsutlösare
  • SQL-studier:att fly från en runaway inloggningsutlösare

  1. Ansluter till Lotus Notes från Java

  2. Tips för att migrera från proprietära till öppen källkodsdatabaser

  3. Stöder Oracle fulltextsökning?

  4. postgresql installationer för enstaka tillfällen