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 的现有管理员会话。
在这种情况下,只能执行以下步骤来解决此问题:
停止 SQL Server 和相关服务。
使用启动参数
-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 连接,因此我们只能通过上面列出的启动参数重启服务器来删除触发器。