Wyzwalacz logowania, jak sama nazwa wskazuje, jest wyzwalaczem, który jest uruchamiany w odpowiedzi na zdarzenie LOGON w SQL Server.
Mówiąc prościej, wyzwalacz logowania jest uruchamiany za każdym razem, gdy ktoś próbuje nawiązać nowe połączenie z serwerem bazy danych. Wyzwalacz uruchamia się po uwierzytelnieniu użytkownika i zakończeniu fazy logowania, ale przed faktycznym zainicjowaniem sesji użytkownika.
Zalety wyzwalaczy logowania
Istnieje kilka zalet wyzwalaczy logowania:
- Śledzenie aktywności logowania
Wyzwalacze logowania mogą być używane do śledzenia aktywności logowania zachodzącej na serwerze bazy danych. Na przykład może być używany do utrzymywania listy wszystkich użytkowników, którzy zalogowali się do serwera bazy danych w określonym czasie. - Ograniczanie łącznej liczby połączeń
Zbyt wiele logowań do bazy danych może wpłynąć na wydajność bazy danych, szczególnie gdy duża liczba użytkowników uzyskuje dostęp do bazy danych. W takich przypadkach wyzwalacze logowania mogą być użyte do sprawdzenia łącznej liczby już istniejących logowań, zanim będzie dozwolone więcej. - Ograniczanie liczby sesji na połączenie
Wyzwalacz logowania może być użyty do ograniczenia liczby sesji na połączenie. Za każdym razem, gdy użytkownik próbuje ustanowić nową sesję, wyzwalacz logowania może sprawdzić liczbę sesji, które są już aktywne dla tego logowania i może ograniczyć wszelkie nowe sesje, jeśli przekroczyły limit.
Zanim zaczniemy, upewnij się, że masz pełną kopię zapasową.
Dostęp do aktywnych połączeń użytkownika
Poniższy skrypt zwraca wszystkie aktywne połączenia użytkowników do bazy danych.
SELECT * FROM sys.dm_exec_sessions
sys.dm_exec_sessions to widok systemowy, który zwraca wszystkie aktywne połączenia użytkowników. Wynik powyższego zapytania wygląda tak:
Dane wyjściowe zawierają szczegółowe informacje o wszystkich aktywnych połączeniach. Interesują nas dwie z tych kolumn:is_user_process i original_login_name.
Ta pierwsza informuje nas, czy połączenie zostało nawiązane przez proces użytkownika, czy nie, a pierwsza zawiera informacje o nazwie połączenia, które dokonało logowania.
Wykonaj następujące zapytanie:
SELECT is_user_process, original_login_name, * FROM sys.dm_exec_sessions ORDER BY login_time DESC
Powyższe zapytanie zwraca is_user_process i original_login_name jako pierwszą i drugą kolumnę wraz z resztą wszystkich kolumn z widoku sys.dm_exec_sessions. Sortuje wyniki według malejącej kolejności czasu logowania. W związku z tym najnowsze połączenia pojawiają się na górze.
W danych wyjściowych przewiń w dół do wierszy, w których kolumna is_user_process zawiera 1.
W moim przypadku mam dwa takie wiersze, jak pokazano na poniższym wyjściu:
W kolumnie original_login_name możesz zobaczyć nazwę połączenia, które dokonało logowania (w tym przypadku nazwa mojego komputera). W kolumnie nazwa_programu możesz zobaczyć typ połączenia. W powyższym przypadku połączenie z session_id 51 jest połączeniem z Eksploratorem obiektów SQL Server. Połączenie z identyfikatorem_sesji 52 jest połączeniem dla jedynego okna zapytania, w którym uruchomiony jest skrypt. Jeśli masz otwarte dwa okna zapytań, zobaczysz w tym miejscu łącznie trzy połączenia użytkowników i tak dalej.
Aby policzyć całkowitą liczbę połączeń wykonanych przez procesy użytkownika, wykonaj następujące zapytanie:
SELECT COUNT(*) FROM sys.dm_exec_sessions WHERE is_user_process = 1
Powyższe zapytanie zwraca dwa, ponieważ mam tylko dwa połączenia user_process na moim serwerze.
Wyzwalacz logowania do ograniczania liczby logowań
Utwórzmy prosty wyzwalacz logowania, który ogranicza łączną liczbę logowań, które mogą być wykonane przez jedno połączenie, do 3. Jeśli połączenie próbuje zalogować się do serwera bazy danych po raz czwarty, wyzwalacz logowania cofa proces logowania.
Skrypt tego wyzwalacza jest następujący:
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
W powyższym skrypcie tworzymy wyzwalacz o nazwie tr_CheckLogin. Zakres wyzwalacza jest ustawiony na serwer.
Możesz wyświetlić szczegóły wyzwalacza, przechodząc do Eksplorator obiektów -> Obiekty serwera -> Wyzwalacze, jak pokazano na poniższym rysunku:
Wyzwalacz uruchamia się za każdym razem, gdy ma miejsce zdarzenie LOGON, tj. połączenie próbuje zalogować się do serwera. Przyjrzyj się uważnie korpusowi spustu.
Funkcja ORIGINAL_LOGIN zwraca nazwę procesu użytkownika lub połączenia próbującego zalogować się do serwera. Następnie zliczana jest łączna liczba połączeń o tej samej nazwie przy użyciu widoku sys.dm_exec_session. Jeśli liczba połączeń jest większa niż 3, logowanie jest cofane, a użytkownikowi drukowane jest oświadczenie o treści:„Więcej niż trzy połączenia niedozwolone – Połączenie według „nazwa_połączenia” nie powiodło się”.
Aby to sprawdzić, otwórz nowe okno zapytania w studiu zarządzania SQL Server
Uwaga:Wcześniej były otwarte dwa połączenia, jedno dla SQL Server Management Studio, a drugie dla okna Zapytanie.
Podczas próby otwarcia nowego okna zapytania, wyzwalacz tr_CheckLogin zostanie uruchomiony, ale ponieważ łączna liczba logowań w tym momencie wyniesie trzy, wyzwalacz nie cofnie logowania.
Aby sprawdzić, czy łączna liczba połączeń przez user_process, wykonaj następujące zapytanie:
SELECT COUNT(*) FROM sys.dm_exec_sessions WHERE is_user_process = 1
Teraz są łącznie 3 połączenia użytkowników, jak pokazano w danych wyjściowych:
Teraz ponownie spróbuj utworzyć nowe połączenie, otwierając nowe okno zapytania w studiu zarządzania SQL Server.
Zobaczysz następujący błąd:
Błąd mówi, że logowanie nie powiodło się dla „DESKTOP-GLQ5VRA\Mani” (nazwa mojego komputera) z powodu wykonania wyzwalacza. Zasadniczo utworzony przez nas wyzwalacz nie zezwalał na połączenie. Czekać! Ale gdzie jest komunikat o błędzie, który wydrukowaliśmy? Nie możemy tego zobaczyć tutaj w powyższym oknie komunikatu. Niestandardowy komunikat o błędzie, który napisaliśmy w wyzwalaczu, można wyświetlić w dzienniku błędów.
Aby wyświetlić dziennik błędów, wykonaj następujący skrypt:
EXECUTE sp_readerrorlog
Przewiń w dół dziennik błędów, aż znajdziesz niestandardową wiadomość napisaną dla wyzwalacza logowania. Poniższy zrzut ekranu przedstawia dziennik błędów mojego serwera bazy danych. Niestandardową wiadomość można zobaczyć w dzienniku błędów:
Dalsze czytanie:
- YouTube:wyzwalacze logowania do serwera SQL
- Microsoft.com:wyzwalacze logowania
- Badania SQL:ucieczka przed niekontrolowanym wyzwalaczem logowania