Dela via


MSSQLSERVER_17892

gäller för:SQL Server

Detaljer

Egenskap Värde
Produktnamn SQL Server
Händelse-ID 17892
Händelsekälla MSSQLSERVER
Komponent SQLEngine
Symboliskt namn SRV_LOGON_FAILED_BY_TRIGGER
Meddelandetext Inloggningen misslyckades för inloggningens <inloggningsnamn> på grund av utlösarkörning.

Förklaring

Fel 17892 utlöses när en inloggningsutlösarkod inte kan köras korrekt. Inloggning utlöser brand lagrade procedurer som svar på en INLOGGNINGshändelse. Den här händelsen utlöses när en användarsession upprättas med en instans av SQL Server. Följande felmeddelande rapporteras till användaren:

Msg 17892, nivå 14, delstat 1, serverservernamn<>, rad 1
Inloggningen misslyckades för inloggningens <inloggningsnamn> på grund av utlösarkörning.

Möjliga orsaker

Problemet kan uppstå om det uppstår ett fel vid körning av utlösarkod för det specifika användarkontot. Några av scenarierna är:

  • Utlösaren försöker infoga data i en tabell som inte finns.
  • Inloggningen har inte behörighet till det objekt som refereras till av inloggningsutlösaren.

Användaråtgärd

Du kan använda någon av följande lösningar beroende på ditt scenario:

  • Scenario 1: Du har för närvarande åtkomst till en öppen session till SQL Server under ett administratörskonto

    I det här fallet kan du vidta den korrigerande åtgärd som krävs för att åtgärda utlösarkoden.

    • Exempel 1: Om ett objekt som anges av utlösarkoden inte finns skapar du objektet så att inloggningsutlösaren kan köras korrekt.

    • Exempel 2: Om ett objekt som anges av utlösarkoden finns men användarna inte har behörighet, ger du dem de behörigheter som krävs för att få åtkomst till objektet.

    Du kan också bara släppa eller inaktivera inloggningsutlösaren så att användarna kan fortsätta att logga in på SQL Server.

Hantera inloggningsutlösare

Visa en lista över alla inloggningsutlösare på servern:

SELECT name, is_disabled, create_date, modify_date
FROM sys.server_triggers
WHERE type_desc = 'LOGON';

Inaktivera en inloggningsutlösare tillfälligt utan att ta bort den:

DISABLE TRIGGER trigger_name ON ALL SERVER;

Släpp (ta bort) en inloggningsutlösare permanent:

DROP TRIGGER trigger_name ON ALL SERVER;

Mer information finns i Hantera utlösarsäkerhet.

  • Scenario 2: Du har ingen aktuell session som är öppen under administratörsbehörighet, men dedikerad administratörsanslutning (DAC) är aktiverad på SQL Server.

    I det här fallet kan du använda DAC-anslutningen för att utföra samma steg som beskrivs i scenario 1. Inloggningsutlösare påverkar inte DAC-anslutningar. Mer information om DAC-anslutning finns i: Diagnostikanslutning för databasadministratörer.

    Om du vill kontrollera om DAC är aktiverat läser du SQL Server-felloggen. Leta efter ett meddelande som liknar det här exemplet:

    2020-02-09 16:17:44.150 Server Dedikerad administratörsanslutning har upprättats för att lyssna lokalt på port 1434.

  • Scenario 3: DAC är inte aktiverat på servern och du har ingen befintlig administratörssession för SQL Server.

    I det här scenariot är det enda sättet att åtgärda problemet att vidta följande steg:

    1. Stoppa SQL Server och relaterade tjänster.

    2. Starta SQL Server från kommandotolken med startparametrarna -c, -moch -f. Den här åtgärden inaktiverar inloggningsutlösaren och gör att du kan utföra samma åtgärdsåtgärder som beskrivs i scenario 1.

      Anmärkning

      Den här proceduren kräver ett systemadministratörskonto (SA) eller motsvarande administratörskonto.

      Mer information om dessa och andra startalternativ finns i: Startalternativ för databasmotortjänsten.

Mer information

Inloggningsutlösare kan också misslyckas när funktionen används EVENTDATA felaktigt. Funktionen EVENTDATA returnerar XML och är skiftlägeskänslig. Om du till exempel skapar följande inloggningsutlösare för att blockera åtkomst baserat på IP-adress kan det uppstå fel 17892 om XML-sökvägen använder felaktigt hölje:

 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

Om du inte behåller rätt skiftlägeskänslighet när du kopierar det här skriptet, särskilt i den här delen av utlösaren, misslyckas utlösaren:

-- Incorrect: lowercase 'event_instance' and 'clienthost' will cause EVENTDATA to return NULL
 SELECT EVENTDATA().value ( '(/event_instance/clienthost)[1]' , 'NVARCHAR(15)');

Därför EVENTDATA returnerar alltid NULL och alla SA-motsvarande inloggningar nekas åtkomst. Om DAC-anslutningen i det här fallet inte är aktiverad måste du starta om servern med startparametrarna som beskrevs tidigare för att släppa utlösaren.