Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Тригери за влизане в SQL Server

Тригерът за влизане, както подсказва името, е тригер, който се задейства в отговор на събитие LOGON в SQL Server.

Казано по-просто, тригерът за влизане се задейства всеки път, когато някой се опита да установи нова връзка със сървър на база данни. Задействането се задейства след удостоверяването на потребителя и фазата на влизане завърши, но преди действително стартирането на потребителската сесия.

Предимства на тригерите за влизане

Има няколко предимства на тригерите за влизане:

  • Проследяване на активността при влизане
    Тригерите за влизане могат да се използват за проследяване на активността за влизане, извършвана на сървъра на базата данни. Например може да се използва за поддържане на списък с всички потребители, които са влезли в сървъра на базата данни в рамките на посочения период от време.
  • Ограничаване на общия брой връзки
    Твърде много влизания в база данни могат да повлияят на производителността на база данни, особено когато голям брой потребители имат достъп до база данни. В случаи като тези тригери за влизане могат да се използват за поставяне на проверка на общия брой вече съществуващи влизания, преди да бъдат разрешени повече.
  • Ограничаване на броя на сесиите на връзка
    Може да се използва тригер за влизане за ограничаване на броя на сесиите на връзка. Всеки път, когато потребител се опита да установи нова сесия, тригерът за влизане може да провери броя на сесиите, които вече са активни за това влизане, и може да ограничи всички нови сесии, ако са надвишили ограничението.

Преди да започнем, уверете се, че имате пълно резервно копие.

Достъп до активни потребителски връзки

Следният скрипт връща всички активни потребителски връзки към база данни.

SELECT * FROM sys.dm_exec_sessions

sys.dm_exec_sessions е системен изглед, който връща всички активни потребителски връзки. Резултатът от горната заявка изглежда така:

Резултатът съдържа подробна информация за всички активни връзки. Интересуват ни две от тези колони:is_user_process и original_login_name.
Първата ни казва дали връзката е била осъществена от потребителски процес или не, а първата съдържа информация за името на връзката, която е направила влизането.

Изпълнете следната заявка:

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

Горната заявка връща is_user_process и original_login_name като първа и втора колона заедно с останалите колони от изгледа sys.dm_exec_sessions. Той сортира резултатите по низходящ ред на времето за влизане. Следователно най-скорошните връзки се показват в горната част.

В изхода превъртете надолу до редовете, където колоната is_user_process съдържа 1.

В моя случай имам два такива реда, както е показано в изхода по-долу:

В колоната original_login_name можете да видите името на връзката, която е направила влизането (в този случай името на моя компютър). В колоната име на програмата можете да видите вида на връзката. В горния случай връзката с session_id 51 е връзката с SQL Server Object Explorer. Връзката с session_id 52 е връзката за единствения прозорец на заявка, в който се изпълнява скриптът. Ако имате отворени два прозореца за заявка, тук ще видите общо три потребителски връзки и т.н.

За да преброите общия брой връзки, направени от потребителски процеси, изпълнете следната заявка:

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

Горната заявка връща две, тъй като имам само две user_process връзки на моя сървър.

Задействане за влизане за ограничаване на броя на влизанията

Нека създадем прост тригер за влизане, който ограничава общия брой влизания, които могат да бъдат направени от една връзка, до 3. Ако връзката се опита да влезе в сървъра на базата данни за четвърти път, тригерът за влизане връща обратно процеса на влизане.

Скриптът за този тригер е както следва:

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

В скрипта по-горе създаваме тригер с име tr_CheckLogin. Обхватът на тригера е зададен на сървър.

Можете да видите подробностите за тригерите, като отидете на Object Explorer -> Server Objects -> Triggers, както е показано на фигурата по-долу:

Тригерът се задейства всеки път, когато се случи събитието LOGON, т.е. връзка се опитва да влезе в сървъра. Погледнете внимателно тялото на спусъка.

Функцията ORIGINAL_LOGIN връща името на потребителския процес или връзката, която се опитва да влезе в сървъра. След това общият брой връзки със същото име се отчита с помощта на изгледа sys.dm_exec_session. Ако броят на връзките е по-голям от 3, влизането се връща назад и на потребителя се отпечатва изявление, което гласи:„Повече от три връзки не са разрешени – Връзката чрез ‘connection_name’ неуспешна.

За да проверите това, отворете нов прозорец за заявка в студиото за управление на SQL Server

Забележка:Преди имаше две отворени връзки, една за SQL Server Management Studio и една за прозореца на заявката.

Когато се опитате да отворите нов прозорец на заявка, тригерът tr_CheckLogin ще се задейства, но тъй като общият брой влизания ще бъде три в този момент, тригерът няма да върне обратно данните за влизане.

За да се уверите, че общият брой връзки от user_process, изпълнете следната заявка:

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

Сега има общо 3 потребителски връзки, както е показано в изхода:

Сега отново опитайте да създадете нова връзка, като отворите нов прозорец за заявка в студиото за управление на SQL Server.

Ще видите следната грешка:

Грешката казва, че влизането е неуспешно за „DESKTOP-GLQ5VRA\Mani“ (името на моя компютър) поради изпълнение на тригера. По принцип спусъкът, който създадохме, не позволи връзката. Изчакайте! Но къде е съобщението за грешка, което отпечатахме? Не можем да го видим тук в горното поле за съобщения. Персонализираното съобщение за грешка, което написахме в тригера, може да се види в регистъра за грешки.

За да видите регистъра на грешките, изпълнете следния скрипт:

EXECUTE sp_readerrorlog

Превъртете надолу дневника за грешки, докато намерите персонализираното съобщение, което сте написали за тригера за влизане. Следната екранна снимка показва регистъра на грешките на моя сървър на база данни. Персонализираното съобщение може да се види в регистъра за грешки:

Допълнително четене:

  • YouTube:тригери за влизане в SQL Server
  • Microsoft.com:Тригери за влизане
  • Проучвания на SQL:Бягство от избягал тригер за влизане

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SSMS 2016 Грешка при импортиране на Azure SQL v12 bacpac:главните ключове без парола не се поддържат

  2. Връщане на номера на дял за всеки ред при запитване на разделена таблица в SQL Server (T-SQL)

  3. Има ли сериозен спад в производителността при използване на външни ключове в SQL Server?

  4. Какво е @@SERVICENAME в SQL Server?

  5. Sql сървър - свържете се с удостоверяване на Windows