执行登录触发器后,登录sql server报错: 由于执行触发器,登录'xxx \ Administrator'登录失败。已将数据库上下文更改为master

技术知识
0 2112
小师傅 小师傅2021-11-26
积分:2397

背景:


在cmd中执行sqlcmd命令:

sqlcmd -S WIN-FI7RNDQ5SB4\MYSQLINSTANCE -i mysql.sql


其中mysql.sql内容如下:

CREATE LOGIN test WITH PASSWORD = '输入密码'
GO

ALTER TRIGGER tr_connection_limit

ON ALL SERVER
FOR LOGON
AS
BEGIN


IF ORIGINAL_LOGIN()= 'test'

AND
(SELECT EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'NVARCHAR(15)'))
NOT IN('<local machine>','192.168.191.22')
     ROLLBACK;
END;


执行结果是:

C:\Users\Administrator>sqlcmd -S WIN-FI7RNDQ5SB4\MYSQLINSTANCE -i C:\Temp\sqltest\SQLQuery.sql
Sqlcmd:错误:用于SQL Server的Microsoft ODBC驱动程序13:由于执行触发器,登录'WIN-FI7RNDQ5SB4 \ Administrator'登录失败
结果使用SSMS登录Sql Server时失败,无论是用windows验证方式登录还是sql server账号登录都会报错:
由于执行触发器,登录'WIN-FI7RNDQ5SB4 \ Administrator'登录失败


我的解决方法是:


步骤一:用sqlcmd删除登录触发器:

C:\Users\Administrator>sqlcmd -A -S WIN-FI7RNDQ5SB4\MYSQLINSTANCE[服务器名]
1> select * from sys.server_trigger_events
2> go

object_id   type      type_desc                 
   is_trigger_event is_first is_last event_group_type event_group_type_desc  
-------------------------------- ---------------- -------- --
-------------------------------------------------------------------
 2107154552         147 LOGON   
  1        0       0             NULL NULL 
(1 行処理されました)

1> select * from sys.server_triggers
2> go

name     
    object_id   parent_class parent_class_desc      parent_id   type type_desc  
 create_date      modify_date       is_ms_shipped is_disabled
---------------------------------------------------------------------------------------------------
tr_connection_limit     2107154552          100 SERVER   
  0 TR   SQL_TRIGGER      
2018-10-23 17:40:04.367 2018-10-24 11:29:30.647     0     0

(1 行処理されました)
(1 行処理されました)

1> drop trigger tr_connection_limit[登录触发器名] on all server;
2> go
1> select * from sys.server_triggers
2> go

name    
 object_id   parent_class parent_class_desc  parent_id   type type_desc  
create_date             modify_date       is_ms_shipped is_disabled
--------------------------------------------------------------------------

(0 行処理されました)
1>


接下来登录Sql Server就成功了,无论是用什么账户登录。


步骤二:修改mysql.sql内容如下:

USE [master]
GO


SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
 

CREATE LOGIN test WITH PASSWORD = '输入密码'
GO

ALTER TRIGGER tr_connection_limit

ON ALL SERVER
FOR LOGON
AS
BEGIN


IF ORIGINAL_LOGIN()= 'test'

AND
(SELECT EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'NVARCHAR(15)'))
NOT IN('<local machine>','192.168.191.22')
     ROLLBACK;
END;


这次再运行就不会出现登录失败的问题了。


精选帖子
Android 可可影视 v3.3.6无广告纯净版 3091
Android QQ音乐 v11.3.7 定制版解锁免费听歌无广告版 3672
Android 草图大师SKP v1.5 解锁会员版 9024
Android OmoFun追漫神器 v4.2.1 无广告绿色版 6066
AdobeGenP Adobe全家桶系列激活工具 v3.5.0/3.4.14.1 绿色版 6647
Android 七猫免费听书 v1.4 解锁高级版 5055
超良心的抢票神器——Bypass1.16 4788
Android 玲珑加速器 v6.10.9.40 解锁无限时间 3441
Android 大师兄影视 v3.3.8 去广告会员版 2568
热门帖子
一键激活Win系统和Office办公软件,最强电脑激活KMS HUE工具,免费永久可用,支持win系统使用 58
得间免费小说 v5.5.8.1 免费网文追书APP 54
酷我音乐 v12.1.8.2 无损音乐播放APP 去广告解锁会员版 51
ChatGPT+Codex电脑自动化课:环境搭建×三大核心实战×全场景应用拓展×AI自主操控电脑×零基础上手 51
豆丁视频 v3.3.0 高清影视播放 免费追剧APP 46
蚂蚁视界 v6.7.0 高清影视追剧APP 全品类视频播放软件 45