sql >> Database >  >> RDS >> Sqlserver

Aanmeldingstriggers in SQL Server

Een aanmeldingstrigger, zoals de naam al doet vermoeden, is een trigger die wordt geactiveerd als reactie op een LOGON-gebeurtenis in SQL Server.

In eenvoudige bewoordingen wordt een aanmeldingstrigger geactiveerd wanneer iemand probeert een nieuwe verbinding met een databaseserver tot stand te brengen. De trigger wordt geactiveerd nadat de gebruikersauthenticatie en de inlogfase zijn voltooid, maar voordat de gebruikerssessie daadwerkelijk wordt gestart.

Voordelen van aanmeldingstriggers

Er zijn verschillende voordelen van aanmeldingstriggers:

  • Aanmeldingsactiviteit bijhouden
    Aanmeldingstriggers kunnen worden gebruikt om de aanmeldingsactiviteit op de databaseserver bij te houden. Het kan bijvoorbeeld worden gebruikt om een ​​lijst bij te houden van alle gebruikers die zich binnen de opgegeven tijdsperiode hebben aangemeld bij de databaseserver.
  • Het aantal totale verbindingen beperken
    Te veel databaselogins kunnen de prestaties van een database beïnvloeden, vooral wanneer grote aantallen gebruikers toegang hebben tot een database. In gevallen als deze kunnen aanmeldingstriggers worden gebruikt om het totale aantal aanmeldingen dat al bestaat te controleren voordat er meer worden toegestaan.
  • Het aantal sessies per verbinding beperken
    Een aanmeldingstrigger kan worden gebruikt om het aantal sessies per verbinding te beperken. Telkens wanneer een gebruiker een nieuwe sessie probeert op te zetten, kan een aanmeldingstrigger het aantal sessies controleren dat al actief is voor die login en kan hij nieuwe sessies beperken als deze een limiet hebben overschreden.

Voordat we beginnen, moet u ervoor zorgen dat u een volledige back-up hebt gemaakt.

Toegang tot actieve gebruikersverbindingen

Het volgende script retourneert alle actieve gebruikersverbindingen naar een database.

SELECT * FROM sys.dm_exec_sessions

sys.dm_exec_sessions is een systeemweergave die alle actieve gebruikersverbindingen retourneert. De uitvoer van de bovenstaande query ziet er als volgt uit:

De uitvoer bevat gedetailleerde informatie over alle actieve verbindingen. We zijn geïnteresseerd in twee van die kolommen:is_user_process en original_login_name.
De eerste vertelt ons of de verbinding tot stand is gebracht door een gebruikersproces of niet, en de eerste bevat informatie over de naam van de verbinding die de login heeft gemaakt.

Voer de volgende vraag uit:

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

De bovenstaande query retourneert is_user_process en original_login_name als de eerste en tweede kolommen, samen met de rest van alle kolommen uit de weergave sys.dm_exec_sessions. Het sorteert de resultaten in aflopende volgorde van de inlogtijd. Daarom verschijnen de meest recente verbindingen bovenaan.

Scrol in de uitvoer omlaag naar de rijen waar de kolom is_user_process een 1 bevat.

In mijn geval heb ik twee van dergelijke rijen zoals weergegeven in de onderstaande uitvoer:

In de kolom original_login_name ziet u de naam van de verbinding die de login heeft gemaakt (in dit geval de naam van mijn pc). In de kolom programmanaam kunt u het type verbinding zien. In het bovenstaande geval is de verbinding met de session_id 51 de verbinding met de SQL Server Object Explorer. De verbinding met de session_id 52 is de verbinding voor het enige queryvenster waarin het script wordt uitgevoerd. Als je twee zoekvensters hebt geopend, zie je hier in totaal drie gebruikersverbindingen, enzovoort.

Voer de volgende query uit om het totale aantal verbindingen te tellen dat door gebruikersprocessen is gemaakt:

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

De bovenstaande query retourneert twee omdat ik slechts twee user_process-verbindingen op mijn server heb.

Aanmeldingstrigger voor het beperken van het aantal aanmeldingen

Laten we een eenvoudige aanmeldingstrigger maken die het totale aantal aanmeldingen dat door één verbinding kan worden gedaan, beperkt tot 3. Als de verbinding voor de vierde keer probeert in te loggen op de databaseserver, draait de aanmeldingstrigger het aanmeldingsproces terug.

Het script voor deze trigger is als volgt:

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

In het bovenstaande script maken we een trigger met de naam tr_CheckLogin. Het triggerbereik is ingesteld op server.

U kunt de triggerdetails bekijken door naar Object Explorer -> Server Objects -> Triggers te gaan, zoals weergegeven in de onderstaande afbeelding:

De trigger wordt geactiveerd wanneer de LOGON-gebeurtenis plaatsvindt, d.w.z. een verbinding probeert in te loggen op de server. Kijk goed naar de body van de trekker.

De functie ORIGINAL_LOGIN retourneert de naam van het gebruikersproces of de verbinding die probeert in te loggen op de server. Vervolgens wordt het totale aantal verbindingen met dezelfde naam geteld met behulp van de weergave sys.dm_exec_session. Als het aantal verbindingen groter is dan 3, wordt de login teruggedraaid en wordt een verklaring afgedrukt naar de gebruiker met de tekst:"Meer dan drie verbindingen niet toegestaan ​​- Verbinding door 'verbindingsnaam' mislukt".

Om dit te verifiëren, opent u een nieuw queryvenster in de SQL Server-beheerstudio

Opmerking:Voorheen waren er twee verbindingen open, één voor SQL Server Management Studio en één voor het Query-venster.

Wanneer u een nieuw queryvenster probeert te openen, wordt de tr_CheckLogin-trigger geactiveerd, maar aangezien het totale aantal aanmeldingen op dit moment drie zal zijn, zal de trigger de aanmelding niet terugdraaien.

Voer de volgende query uit om te controleren of het totale aantal verbindingen per user_process is:

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

Nu zijn er in totaal 3 gebruikersverbindingen zoals weergegeven in de uitvoer:

Probeer nu opnieuw een nieuwe verbinding tot stand te brengen door een nieuw queryvenster te openen in SQL Server Management Studio.

U ziet de volgende fout:

De fout zegt dat de aanmelding is mislukt voor "DESKTOP-GLQ5VRA\Mani" (de naam van mijn pc) vanwege het uitvoeren van de trigger. Kortom, de trigger die we hebben gemaakt, stond de verbinding niet toe. Wacht! Maar waar is de foutmelding die we hebben afgedrukt? We kunnen het hier niet zien in het bovenstaande berichtvenster. Het aangepaste foutbericht dat we in de trigger hebben geschreven, kan worden bekeken in het foutenlogboek.

Voer het volgende script uit om het foutenlogboek te bekijken:

EXECUTE sp_readerrorlog

Blader door het foutenlogboek totdat u het aangepaste bericht vindt dat u hebt geschreven voor de aanmeldingstrigger. De volgende schermafbeelding toont het foutenlogboek van mijn databaseserver. Het aangepaste bericht is te zien in het foutenlogboek:

Verdere lezing:

  • YouTube:SQL Server-aanmeldingstriggers
  • Microsoft.com:aanmeldingstriggers
  • SQL-onderzoek:ontsnappen aan een op hol geslagen aanmeldingstrigger

  1. DevOps:DBA of Developer – De juiste balans vinden

  2. Waarom is Oracle zo traag als ik een java.sql.Timestamp voor een DATE-kolom doorgeef?

  3. Hoe 2 datums in orakel af te trekken om het resultaat in uren en minuten te krijgen

  4. Verbinding maken met MySQL met Python