Udostępnij za pomocą


MSSQLSERVER_17892

Dotyczy:SQL Server

Szczegóły

Atrybut Wartość
Nazwa produktu SQL Server
Identyfikator zdarzenia 17892
Źródło zdarzenia MSSQLSERVER
Składnik SQLEngine
Nazwa symboliczna SRV_LOGON_FAILED_BY_TRIGGER
Tekst wiadomości Logowanie nie powiodło się dla nazwy< logowania logowania >z powodu wykonania wyzwalacza.

Wyjaśnienie

Błąd 17892 jest zgłaszany, gdy kod wyzwalacza logowania nie może zostać wykonany pomyślnie. Wyzwalacze logowania wyzwalają procedury składowane w odpowiedzi na zdarzenie LOGON. To zdarzenie jest zgłaszane podczas nawiązywania sesji użytkownika z wystąpieniem programu SQL Server. Komunikat o błędzie podobny do następującego jest zgłaszany użytkownikowi:

Msg 17892, poziom 14, stan 1, nazwa< serwera>, wiersz 1
Logowanie nie powiodło się dla nazwy< logowania logowania >z powodu wykonania wyzwalacza.

Możliwe przyczyny

Problem może wystąpić, jeśli wystąpił błąd podczas wykonywania kodu wyzwalacza dla tego konkretnego konta użytkownika. Niektóre scenariusze obejmują:

  • Wyzwalacz próbuje wstawić dane do tabeli, która nie istnieje.
  • Logowanie nie ma uprawnień do obiektu, do którego odwołuje się wyzwalacz logowania.

Akcja użytkownika

Możesz użyć jednej z poniższych rozwiązań w zależności od scenariusza, w którym się znajdują.

  • Scenariusz 1. Obecnie masz dostęp do otwartej sesji programu SQL Server na koncie administratora

    W takim przypadku możesz wykonać akcję naprawczą, która jest wymagana do naprawienia kodu wyzwalacza.

    • Przykład 1: Jeśli obiekt, do którego odwołuje się kod wyzwalacza, utwórz ten obiekt, aby wyzwalacz logowania mógł zostać wykonany pomyślnie.

    • Przykład 2: Jeśli obiekt, do którym odwołuje się kod wyzwalacza, ale użytkownicy nie mają uprawnień, przyznaj im niezbędne uprawnienia dostępu do obiektu.

    Alternatywnie możesz po prostu usunąć lub wyłączyć wyzwalacz logowania, aby użytkownicy mogli nadal logować się do programu SQL Server.

  • Scenariusz 2: Nie masz żadnej bieżącej sesji, która jest otwarta w ramach uprawnień administratora, ale dedykowane połączenie administratora (DAC) jest włączone w programie SQL Server.

    W takim przypadku można użyć połączenia DAC, aby wykonać te same kroki, co opisano w przypadku 1, ponieważ połączenia DAC nie mają wpływu na wyzwalacze logowania. Aby uzyskać więcej informacji na temat połączenia DAC, zobacz: Połączenie diagnostyczne dla administratorów bazy danych.

    Aby sprawdzić, czy funkcja DAC jest włączona w programie SQL Server, możesz sprawdzić dziennik błędów programu SQL Server pod kątem komunikatu podobnego do następującego:

    2020-02-09 16:17:44.150 Dedykowane połączenie administratora serwera zostało ustanowione do nasłuchiwania lokalnie na porcie 1434.

  • Scenariusz 3. Nie masz włączonego modułu DAC na serwerze ani nie masz istniejącej sesji administracyjnej programu SQL Server.

    W tym scenariuszu jedynym sposobem rozwiązania problemu jest wykonanie następujących kroków:

    1. Zatrzymaj program SQL Server i powiązane usługi.

    2. Uruchom program SQL Server z poziomu wiersza polecenia przy użyciu parametrów -curuchamiania , -mi -f. Spowoduje to wyłączenie wyzwalacza logowania i umożliwia wykonanie tych samych środków zaradczych, które zostały omówione w sekcji Przypadek 1 powyżej.

      Uwaga / Notatka

      Powyższa procedura wymaga konta administratora lub równoważnego konta administratora.

      Aby uzyskać więcej informacji na temat tych i innych opcji uruchamiania, zobacz: Opcje uruchamiania usługi aparatu bazy danych.

Więcej informacji

Inną sytuacją, w której wyzwalacze logowania kończą się niepowodzeniem EVENTDATA , jest użycie funkcji. Ta funkcja zwraca kod XML i uwzględnia wielkość liter. Dlatego utworzysz następujący wyzwalacz logowania, który zamierza zablokować dostęp na podstawie adresu IP, możesz napotkać problem:

 CREATE TRIGGER tr_logon_CheckIP  
 ON ALL SERVER  
 FOR LOGON  
 AS
 BEGIN
  IF IS_SRVROLEMEMBER ( 'sysadmin' ) = 1  
     BEGIN
         DECLARE @IP NVARCHAR ( 15 );  
         SET @IP = ( SELECT EVENTDATA ().value ( '(/EVENT_INSTANCE/ClientHost)[1]' , 'NVARCHAR(15)' ));  
         IF NOT EXISTS( SELECT IP FROM DBAWork.dbo.ValidIP WHERE IP = @IP )  
         ROLLBACK ;  
     END ;  
 END ;  
 GO

Użytkownik nie zachowywał wielkości liter podczas kopiowania tego skryptu z Internetu w tej części wyzwalacza:

 SELECT EVENTDATA().value ( '(/event_instance/clienthost)[1]' , 'NVARCHAR(15)');

W związku EVENTDATA z tym zawsze zwracano wartość NULL, a wszystkie ich równoważne identyfikatory logowania sa zostały odrzucone. W takim przypadku połączenie DAC nie zostało włączone, więc nie mieliśmy wyboru, ale aby ponownie uruchomić serwer z parametrami uruchamiania wymienionymi powyżej, aby usunąć wyzwalacz.