由于触发器执行,登录失败

Mar*_*lli 6 security sql-server logins connections sql-server-2016

我一直在尝试使用我的其中之一登录,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
------------------------------
Run Code Online (Sandbox Code Playgroud)

高级信息

在此处输入图片说明

我知道下面的问题,但它略有不同,我已经尝试了那里所说的所有内容,但对我没有用,这就是我在这里提出这个问题的原因:

“由于触发器执行,登录 '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)'
Run Code Online (Sandbox Code Playgroud)

根据上述信息,我有以下问题:

登录有效但服务器访问失败

还是没有快乐。

我试图删除登录名并重新创建它,但遇到了 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
Run Code Online (Sandbox Code Playgroud)

然后我杀死了 2 个会话,重新创建登录名,再次尝试,同样的错误。

我错过了什么?

Joh*_* N. 6

根据您发布的屏幕截图,您遇到了错误 17892,它大致可转换为登录触发错误。

您以前可能有一个登录触发器来评估您是否被允许登录到 SQL Server。此触发器可能已被删除或可能产生错误的结果,现在不允许任何人登录到 SQL Server 实例。

有三种可能的解决方法:

1. 打开查询窗口可用

通过以下方式搜索触发器:

SELECT * FROM sys.server_triggers;
Run Code Online (Sandbox Code Playgroud)

如果您看到可能导致登录问题的服务器级触发器,则可以使用以下命令删除它:

DROP TRIGGER triggername ON ALL SERVER;
Run Code Online (Sandbox Code Playgroud)

与其删除触发器,不如使用以下命令禁用它:

DISABLE TRIGGER triggername ON ALL SERVER;
Run Code Online (Sandbox Code Playgroud)

2. DAC 允许;没有可用的打开查询窗口

如果没有打开的查询窗口,则必须使用 DAC (ADMIN) 连接登录到 SQL Server 实例:

sqlcmd –S 127.0.0.1,1434 
Run Code Online (Sandbox Code Playgroud)

1434 是 DAC 连接的默认端口

然后,您可以从解决方案 1. 运行上述查询以确定触发器,然后删除或禁用触发器。

3.没有打开查询窗口;不允许使用 DAC

如果您没有打开的窗口并且 DAC 尚未打开,那么您将不得不停止实例并使用以下步骤重新启动:

sqlserver.exe –c -m –f
Run Code Online (Sandbox Code Playgroud)

这将允许您以最少的配置和更短的启动时间在单用户模式下启动实例。

然后您可以根据上面的步骤 1 禁用触发器。