Sql-Server

由於觸發器執行,登錄失敗

  • March 9, 2021

我一直在嘗試使用其中一個登錄,sql server logins但收到以下錯誤消息:

一般錯誤資訊

在此處輸入圖像描述

複製消息文本

TITLE: Connect to Server
------------------------------

Cannot connect to MY_SERVER.

------------------------------
ADDITIONAL INFORMATION:

Logon failed for login 'cola' due to trigger execution.
Changed database context to 'master'.
Changed language setting to us_english. (Microsoft SQL Server, Error: 17892)

For help, click: http://go.microsoft.com/fwlink?> ProdName=Microsoft%20SQL%20Server&EvtSrc=MSSQLServer&EvtID=17892&LinkId=20476

------------------------------
BUTTONS:

OK
------------------------------

高級資訊

在此處輸入圖像描述

我知道下面的問題,但它略有不同,我已經嘗試了那裡所說的一切,但它對我不起作用,這就是我在這裡提出這個問題的原因:

“由於觸發器執行,登錄 ‘sa’ 登錄失敗。” 未定義 SA 登錄觸發器時

這裡的這個問題也非常相似:

使用者登錄失敗 - 錯誤:18456,嚴重性:14,狀態:38

從這個我得到以下資訊:

使用者登錄失敗 - 錯誤 18456 - 嚴重性 14,狀態 38

1      'Account is locked out'
2      'User id is not valid'
3-4    'Undocumented'
5      'User id is not valid'
6      'Undocumented'
7      'The login being used is disabled'
8      'Incorrect password'
9      'Invalid password'
10     'Related to a SQL login being bound to Windows domain password policy enforcement.
       See KB925744.'
11-12  'Login valid but server access failed'
16     'Login valid, but not permissioned to use the target database'
18     'Password expired'
27     'Initial database could not be found'
38     'Login valid but database unavailable (or login not permissioned)'

根據上面的資訊,我有以下問題:

登錄有效但伺服器訪問失敗

仍然沒有喜悅。

我試圖刪除登錄並重新創建它,但遇到了 Login can not be dropped because it is in use.

我使用下面的腳本來找出where it is used, by whom, from where

USE master
go
SELECT 
       sdes.session_id 
      ,sdes.login_time 
      ,sdes.last_request_start_time
      ,sdes.last_request_end_time
      ,sdes.is_user_process
      ,sdes.host_name
      ,sdes.program_name
      ,sdes.login_name
      ,sdes.status

      ,sdec.num_reads
      ,sdec.num_writes
      ,sdec.last_read
      ,sdec.last_write
      ,sdes.reads
      ,sdes.logical_reads
      ,sdes.writes

      ,sdest.DatabaseName 
      ,sdest.ObjName
   ,sdes.client_interface_name
   ,sdes.nt_domain
   ,sdes.nt_user_name
   ,sdec.client_net_address
   ,sdec.local_net_address
   ,sdest.Query
   ,KillCommand  = 'Kill '+ CAST(sdes.session_id  AS VARCHAR)
FROM sys.dm_exec_sessions AS sdes

INNER JOIN sys.dm_exec_connections AS sdec 
       ON sdec.session_id = sdes.session_id

CROSS APPLY (

               SELECT DB_NAME(dbid) AS DatabaseName
                   ,OBJECT_NAME(objectid) AS ObjName
                   ,COALESCE((
                           SELECT TEXT AS [processing-instruction(definition)]
                           FROM sys.dm_exec_sql_text(sdec.most_recent_sql_handle) 
                           FOR XML PATH('')
                               ,TYPE
                           ), '') AS Query

               FROM sys.dm_exec_sql_text(sdec.most_recent_sql_handle)

   ) sdest
WHERE sdes.session_id <> @@SPID 
--ORDER BY sdes.last_request_start_time DESC

然後我殺死了 2 個會話,重新創建了登錄,再次嘗試,同樣的錯誤。

我錯過了什麼?

根據您發布的螢幕截圖,您遇到了錯誤 17892,它大致轉換為登錄觸發錯誤。

您之前可能有一個登錄觸發器,用於評估您是否被允許登錄到 SQL Server。此觸發器可能已被刪除或可能產生錯誤結果,現在不允許任何人登錄 SQL Server 實例。

有三種可能的解決方法:

1.打開查詢視窗可用

通過以下方式搜尋觸發器:

SELECT * FROM sys.server_triggers;

如果您看到可能導致登錄問題的伺服器級觸發器,則可以使用以下命令刪除它:

DROP TRIGGER triggername ON ALL SERVER;

不要刪除觸發器,只需使用以下命令禁用它:

DISABLE TRIGGER triggername ON ALL SERVER;
  1. 允許 DAC;沒有可用的打開查詢視窗

如果您沒有打開的查詢視窗,則必須使用 DAC (ADMIN) 連接登錄到您的 SQL Server 實例:

sqlcmd –S 127.0.0.1,1434 

1434 是 DAC 連接的預設埠

然後,您可以從解決方案 1 執行上述查詢以確定觸發器,然後刪除或禁用觸發器。

3、沒有打開查詢視窗;不允許 DAC

如果您沒有打開的視窗並且 DAC 尚未打開,那麼您將不得不停止實例並使用以下步驟重新啟動:

sqlserver.exe –c -m –f

這將允許您以最少的配置和更短的啟動時間以單使用者模式啟動實例。

然後您可以根據上面的步驟 1. 禁用觸發器。

引用自:https://dba.stackexchange.com/questions/218811