MSSQLSERVER_17892

适用于:SQL Server

详细信息

属性
产品名称 SQL Server
事件 ID 17892
事件来源 MSSQLSERVER
组件 SQLEngine
符号名称 SRV_LOGON_FAILED_BY_TRIGGER
消息正文 由于触发器执行,登录 <名> 登录失败。

说明

登录触发器代码无法成功执行时,会引发错误 17892。 登录触发器将为响应 LOGON 事件而激发存储过程。 与 SQL Server 实例建立用户会话时将引发此事件。 将向用户报告如下错误消息:

Msg 17892、级别 14、状态 1、服务器 <服务器名称>、第 1 行
由于触发器执行,登录 <名> 登录失败。

可能的原因

如果对该特定用户帐户执行触发器代码时存在错误,则可能出现此问题。 其中一些情况包括:

  • 触发器尝试将数据插入表中不存在。
  • 登录名对登录触发器引用的对象没有权限。

用户操作

可根据所面临的场景使用以下解决方案之一。

  • 方案 1:当前有权在管理员帐户下访问 SQL Server 的打开会话

    在这种情况下,你可采取修复触发器代码所需的纠正措施。

    • 示例 1:如果触发器代码引用的对象不存在,请创建该对象,以便登录触发器可以成功执行。

    • 示例 2:如果触发器代码引用的对象存在,但用户没有权限,请向他们授予访问对象所需的权限。

    或者,只需删除或禁用登录触发器,以便用户可以继续登录到 SQL Server。

  • 方案 2:没有在管理员权限下打开的任何当前会话,但在 SQL Server 上启用了专用管理员连接(DAC)。

    在这种情况下,由于 DAC 连接不受登录触发器的影响,因此可使用 DAC 连接来执行在案例 1 中讨论的相同步骤。 有关 DAC 连接的详细信息,请参阅: 数据库管理员的诊断连接。

    若要检查是否在 SQL Server 上启用了 DAC,可以检查 SQL Server 错误日志中是否存在类似于以下内容的消息:

    2020-02-09 16:17:44.150 已建立服务器专用管理员连接支持,以在端口 1434 进行本地侦听。

  • 方案 3:既未在服务器上启用 DAC,也没有对 SQL Server 的现有管理员会话。

    在这种情况下,只能执行以下步骤来解决此问题:

    1. 停止 SQL Server 和相关服务。

    2. 使用启动参数-m-c-f和 从命令提示符处启动 SQL Server。 这样做将禁用登录触发器,并使你能够执行上述案例 1 中讨论的补救措施

      注意

      上述过程需要 SA 或等效的管理员帐户

      有关这些和其他启动选项的详细信息,请参阅:数据库引擎服务启动选项

详细信息

在使用 EVENTDATA 函数时,也会出现登录触发器失败的情况。 此函数会返回 XML 并区分大小写。 因此,你需要创建以下登录触发器来根据 IP 地址阻止访问,你可能会遇到以下问题:

 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

用户通过 Internet 在此部分的触发器上复制此脚本时,未保留大小写格式:

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

因此,EVENTDATA 始终返回 NULL,且其所有 SA 等效登录访问都会被拒绝。 在这种情况下,不启用 DAC 连接,因此我们只能通过上面列出的启动参数重启服务器来删除触发器。