sql >> Database teknologi >  >> RDS >> Sqlserver

Logon-triggere i SQL Server

En logon-trigger, som navnet antyder, er en trigger, der udløses som reaktion på en LOGON-hændelse i SQL Server.

Enkelt sagt udløses en logon-trigger, når nogen forsøger at etablere en ny forbindelse til en databaseserver. Udløseren udløses efter brugergodkendelsen og loginfasen er afsluttet, men før brugersessionen rent faktisk påbegyndes.

Fordele ved logon-triggere

Der er flere fordele ved logon-triggere:

  • Sporing af loginaktivitet
    Logon-triggere kan bruges til at holde styr på login-aktiviteten, der finder sted på databaseserveren. For eksempel kan den bruges til at vedligeholde en liste over alle de brugere, der loggede på databaseserveren inden for det angivne tidsrum.
  • Begrænsning af antallet af samlede forbindelser
    For mange databaselogins kan påvirke ydeevnen af ​​en database, især når et stort antal brugere får adgang til en database. I tilfælde som disse kan logon-triggere bruges til at kontrollere antallet af samlede logins, der allerede eksisterer, før flere er tilladt.
  • Begrænsning af antallet af sessioner pr. forbindelse
    En logon-trigger kan bruges til at begrænse antallet af sessioner pr. forbindelse. Hver gang en bruger forsøger at etablere en ny session, kan en logontrigger kontrollere antallet af sessioner, der allerede er aktive for det pågældende login, og kan begrænse eventuelle nye sessioner, hvis de har overskredet en grænse.

Før vi går i gang, skal du være sikker på, at du er fuldt sikkerhedskopieret.

Adgang til aktive brugerforbindelser

Følgende script returnerer alle aktive brugerforbindelser til en database.

SELECT * FROM sys.dm_exec_sessions

sys.dm_exec_sessions er en systemvisning, der returnerer alle de aktive brugerforbindelser. Outputtet af ovenstående forespørgsel ser sådan ud:

Udgangen indeholder detaljerede oplysninger om alle de aktive forbindelser. Vi er interesserede i to af disse kolonner:is_user_process og original_login_name.
Den førstnævnte fortæller os, om forbindelsen er foretaget af en brugerproces eller ej, og den førstnævnte indeholder oplysninger om navnet på den forbindelse, der foretog login.

Udfør følgende forespørgsel:

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

Ovenstående forespørgsel returnerer is_user_process og original_login_name som den første og anden kolonne sammen med resten af ​​alle kolonnerne fra sys.dm_exec_sessions-visningen. Den sorterer resultaterne efter faldende rækkefølge af login-tidspunktet. Derfor vises de seneste mest forbindelser øverst.

Rul ned til rækkerne i outputtet, hvor kolonnen is_user_process indeholder en 1.

I mit tilfælde har jeg to sådanne rækker som vist i outputtet nedenfor:

I kolonnen original_login_name kan du se navnet på den forbindelse, der lavede login (I dette tilfælde navnet på min pc). I kolonnen programnavn kan du se typen af ​​forbindelse. I ovenstående tilfælde er forbindelsen med session_id 51 forbindelsen til SQL Server Object Explorer. Forbindelsen med session_id 52 er forbindelsen til det eneste forespørgselsvindue, hvor scriptet køres. Hvis du har to forespørgselsvinduer åbne, vil du se i alt tre brugerforbindelser her, og så videre.

For at tælle det samlede antal forbindelser lavet af brugerprocesser skal du udføre følgende forespørgsel:

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

Ovenstående forespørgsel returnerer to, da jeg kun har to user_process-forbindelser på min server.

Logon-trigger for at begrænse antallet af logins

Lad os oprette en simpel logon-trigger, der begrænser det samlede antal logins, der kan foretages af én forbindelse, til 3. Hvis forbindelsen forsøger at logge ind på databaseserveren for fjerde gang, ruller logon-triggeren login-processen tilbage.

Scriptet til denne trigger er som følger:

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 scriptet ovenfor opretter vi en trigger ved navn tr_CheckLogin. Trigger-omfanget er indstillet til server.

Du kan se triggerdetaljerne ved at gå til Objekt Explorer -> Serverobjekter -> Triggere, som vist i figuren nedenfor:

Triggeren udløses, når LOGON-hændelsen finder sted, dvs. en forbindelse forsøger at logge ind på serveren. Tag et omhyggeligt kig på aftrækkerens krop.

Funktionen ORIGINAL_LOGIN returnerer navnet på brugerprocessen eller forbindelsen, der forsøger at logge på serveren. Derefter tælles det samlede antal forbindelser med samme navn ved hjælp af sys.dm_exec_session-visningen. Hvis antallet af forbindelser er større end 3, rulles login tilbage, og en erklæring udskrives til brugeren, som lyder:"Mere end tre forbindelser er ikke tilladt - Forbindelse med 'forbindelsesnavn' mislykkedes".

For at bekræfte dette skal du åbne et nyt forespørgselsvindue i SQL Server-administrationsstudiet

Bemærk:Tidligere var der to forbindelser åbne, en til SQL Server Management Studio og en til vinduet Query.

Når du prøver at åbne et nyt forespørgselsvindue, udløses tr_CheckLogin-udløseren, men da det samlede antal logins vil være tre på dette tidspunkt, vil triggeren ikke rulle login tilbage.

For at bekræfte, at det samlede antal forbindelser af bruger_proces, skal du udføre følgende forespørgsel:

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

Nu er der i alt 3 brugerforbindelser som vist i outputtet:

Prøv nu igen at oprette en ny forbindelse ved at åbne et nyt forespørgselsvindue i SQL Server Management Studio.

Du vil se følgende fejl:

Fejlen siger, at login mislykkedes for "DESKTOP-GLQ5VRA\Mani" (navnet på min pc) på grund af triggerudførelse. Dybest set tillod den udløser, vi oprettede, ikke forbindelsen. Vente! Men hvor er fejlmeddelelsen, som vi udskrev? Vi kan ikke se det her i ovenstående beskedboks. Den brugerdefinerede fejlmeddelelse, som vi skrev i triggeren, kan ses i fejlloggen.

For at se fejlloggen skal du udføre følgende script:

EXECUTE sp_readerrorlog

Rul ned i fejlloggen, indtil du finder den brugerdefinerede meddelelse, som du skrev til logon-udløseren. Følgende skærmbillede viser fejlloggen for min databaseserver. Den tilpassede meddelelse kan ses i fejlloggen:

Yderligere læsning:

  • YouTube:SQL Server Logon Triggers
  • Microsoft.com:Logon-udløsere
  • SQL Studies:Escape From A Runaway Logon Trigger

  1. Hvordan gemmer man unicode i MySQL?

  2. Hvordan erstatter man et regulært udtryk i MySQL?

  3. Postgres tid med tidszone lighed

  4. Kan jeg kommaafgrænse flere rækker i én kolonne?