Spouštěč přihlášení, jak název napovídá, je spouštěč, který se spouští v reakci na událost LOGON na serveru SQL Server.
Jednoduše řečeno, spouštěč přihlášení se spustí vždy, když se někdo pokusí navázat nové připojení k databázovému serveru. Spouštěč se spustí po autentizaci uživatele a dokončení fáze přihlášení, ale ještě předtím, než je uživatelská relace skutečně zahájena.
Výhody spouštěčů přihlášení
Přihlašovací spouštěče mají několik výhod:
- Sledování aktivity přihlášení
Spouštěče přihlášení lze použít ke sledování aktivity přihlášení na databázovém serveru. Lze jej například použít k udržování seznamu všech uživatelů, kteří se přihlásili k databázovému serveru během zadaného časového období. - Omezení celkového počtu připojení
Příliš mnoho přihlášení k databázi může ovlivnit výkon databáze, zvláště když k databázi přistupuje velký počet uživatelů. V případech, jako jsou tyto, lze použít spouštěče přihlášení ke kontrole počtu již existujících celkových přihlášení, než budou povolena další. - Omezení počtu relací na připojení
Spouštěč přihlášení lze použít k omezení počtu relací na připojení. Kdykoli se uživatel pokusí navázat novou relaci, spouštěč přihlášení může zkontrolovat počet relací, které jsou již pro dané přihlášení aktivní, a může omezit jakékoli nové relace, pokud překročí limit.
Než začneme, ujistěte se, že máte plnou zálohu.
Přístup k připojením aktivních uživatelů
Následující skript vrátí všechna aktivní uživatelská připojení k databázi.
SELECT * FROM sys.dm_exec_sessions
sys.dm_exec_sessions je systémové zobrazení, které vrací všechna aktivní uživatelská připojení. Výstup výše uvedeného dotazu vypadá takto:
Výstup obsahuje podrobné informace o všech aktivních spojeních. Zajímají nás dva z těchto sloupců:is_user_process a original_login_name.
První nám říká, zda bylo připojení vytvořeno uživatelským procesem nebo ne, a první obsahuje informace o názvu připojení, které provedlo přihlášení.
Proveďte následující dotaz:
SELECT is_user_process, original_login_name, * FROM sys.dm_exec_sessions ORDER BY login_time DESC
Výše uvedený dotaz vrátí is_user_process a original_login_name jako první a druhý sloupec spolu se zbytkem všech sloupců ze zobrazení sys.dm_exec_sessions. Seřadí výsledky sestupně podle času přihlášení. Nejaktuálnější připojení se tedy zobrazí nahoře.
Ve výstupu přejděte dolů na řádky, kde sloupec is_user_process obsahuje 1.
V mém případě mám dva takové řádky, jak je znázorněno na výstupu níže:
Ve sloupci original_login_name můžete vidět název připojení, které provedlo přihlášení (v tomto případě název mého PC). Ve sloupci název_programu můžete vidět typ připojení. Ve výše uvedeném případě je spojení s session_id 51 spojením s SQL Server Object Explorer. Spojení s session_id 52 je připojení pro jediné okno dotazu, ve kterém je skript spuštěn. Pokud máte otevřená dvě okna dotazů, uvidíte zde celkem tři uživatelská připojení a tak dále.
Chcete-li spočítat celkový počet připojení vytvořených uživatelskými procesy, proveďte následující dotaz:
SELECT COUNT(*) FROM sys.dm_exec_sessions WHERE is_user_process = 1
Výše uvedený dotaz vrací dvě, protože mám na svém serveru pouze dvě připojení user_process.
Spouštěč přihlášení pro omezení počtu přihlášení
Vytvořme jednoduchý spouštěč přihlášení, který omezí celkový počet přihlášení, které lze provést jedním připojením, na 3. Pokud se připojení pokusí přihlásit k databázovému serveru počtvrté, spouštěč přihlášení vrátí proces přihlášení zpět.
Skript pro tento spouštěč je následující:
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
Ve výše uvedeném skriptu vytvoříme spouštěč s názvem tr_CheckLogin. Rozsah spouštění je nastaven na server.
Podrobnosti spouštění můžete zobrazit v Průzkumníku objektů -> Objekty serveru -> Spouštěče, jak je znázorněno na obrázku níže:
Spouštěč se spustí vždy, když dojde k události LOGON, tj. když se připojení pokusí přihlásit k serveru. Pečlivě se podívejte na tělo spouště.
Funkce ORIGINAL_LOGIN vrací jméno uživatelského procesu nebo připojení, které se pokouší přihlásit k serveru. Dále se pomocí pohledu sys.dm_exec_session spočítá celkový počet připojení se stejným názvem. Pokud je počet připojení větší než 3, přihlášení je vráceno zpět a uživateli je vytištěno prohlášení, které zní:„Více než tři připojení nejsou povolena – Připojení podle ‚název_připojení‘ se nezdařilo.“
Chcete-li to ověřit, otevřete nové okno dotazu v SQL Server Management Studio
Poznámka:Dříve byla otevřena dvě připojení, jedno pro SQL Server Management Studio a jedno pro okno Query.
Když se pokusíte otevřít nové okno dotazu, spustí se spouštěč tr_CheckLogin, ale protože celkový počet přihlášení bude v tomto okamžiku tři, spouštěč přihlášení nevrátí.
Chcete-li ověřit, že celkový počet připojení podle user_process, proveďte následující dotaz:
SELECT COUNT(*) FROM sys.dm_exec_sessions WHERE is_user_process = 1
Nyní jsou zde celkem 3 uživatelská připojení, jak je znázorněno na výstupu:
Nyní znovu zkuste vytvořit nové připojení otevřením nového okna dotazu v SQL Server Management Studio.
Uvidíte následující chybu:
Chyba říká, že přihlášení selhalo pro „DESKTOP-GLQ5VRA\Mani“ (název mého PC) kvůli spuštění spouště. Spouštěč, který jsme vytvořili, v podstatě neumožňoval připojení. Počkejte! Ale kde je chybová zpráva, kterou jsme vytiskli? Tady ve výše uvedeném okně se zprávou to nevidíme. Vlastní chybovou zprávu, kterou jsme zapsali do spouštěče, lze zobrazit v protokolu chyb.
Chcete-li zobrazit protokol chyb, spusťte následující skript:
EXECUTE sp_readerrorlog
Posouvejte dolů protokol chyb, dokud nenajdete vlastní zprávu, kterou jste napsali pro aktivační událost přihlášení. Následující snímek obrazovky ukazuje protokol chyb mého databázového serveru. Vlastní zprávu lze vidět v protokolu chyb:
Další čtení:
- YouTube:Spouštěče přihlášení k serveru SQL
- Microsoft.com:Spouštěče přihlášení
- Studie SQL:Únik před spouštěčem při přihlašování na útěku