我的上一篇博客提到了Logon Trigger会被触发多次的情况,经过几番的资料查找后,终于找到问题的最终原因了。
下面详细解释一下。
1、触发器功能调整
(1)用于记录触发器事件内容的表,增加了AppName(AppName可以帮忙解决很多问题)、HostName、OriginalLogin等信息
(2)AfterLogon Trigger的内容相应的做了调整
2、观察触发器记录的数据
(1) 发现有部分的AppName是“Microsoft SQL Server Management Studio - Transact-SQL IntelliSense”!
也就是SSMS2008自带的IntelliSense(智能感知,智能提示) Enable导致的,在SSMS里把这个关闭后,就不会再有这样的数据触发“登录触发器”了。
(2) 关闭IntelliSense后,每次新建Connection都会触发两次“登录触发器”
触发两次的记录中,只有SPID是不一样的,一个SPID是新建的Connection显示的SPID,另外一个则是肉眼不可见的。
使用DBCC INPUTBUFFER把这个SPID的内容查出来看一下,发现都是:
官方文档上没有合理的解释,最后发现这样一个解释:这个Session是用于ActivityMonitor获取数据的,参考下面的URL。
http://stackoverflow.com/questions/4021428/where-are-all-those-sql-server-sessions-from
3、遗留问题
到了这个时候,基本上也就搞清楚为什么LogonTrigger会被触发多次了,但是又带来两个新的问题!
1、为什么新建Connection的时候会多一个Session,且该Session是为了Activity Monitor使用的,这个可以设置关闭?
2、研究了一下ActivityMonitor,发现一个新的问题,使用SQLServer Authentication连接到Remote Instance时,%Processor Time这个窗口是无法使用的,在微软的官方文档上找到了一点点相应的解答,如下:
https://connect.microsoft.com/SQLServer/feedback/details/350723/ssms-activity-monitor-does-not-show-cpu-time-for-remote-instances
http://connect.microsoft.com/SQLServer/feedback/details/551890/ssms-activity-monitor-resume-does-not-always-show-processor-time
有时间值得仔细的研究一下,如何使用 Activity Monitor 监控 Remote Instance 的CPU状态!