注意SQLServer2012中带参数的XP_ReadErrorLog

时间:2023-03-08 15:36:29
注意SQLServer2012中带参数的XP_ReadErrorLog

--15:26 2014-6-10
数据库错误日志通知其中有一部分是检测ERRORLOG中若有用户登录失败信息时,会记录到Errorlog表,并邮件提醒。
当时直接从同事那拿过来的脚本(08),按理说版本都是向前兼容的。平常有个习惯,会把相关脚本在测试环境下先运行,更新、插入的会先看同条件下的SELECT
当把下面的语句放在2012查询窗口运行时,理所当然认为会返回相应结果

 exec master.dbo.xp_ReadErrorLog 0, 1, 'Failed', 'login',@startTime,@endTime,'DESC'

消息 22004,级别 12,状态 1,第 0 行
执行扩展存储过程时出错: 参数类型无效
解答#1 网上查找 Using xp_Readerrorlog, to find related error we used to put string in ' ' while in sql 2012 its changed to " "
改成" "再次在2012查询窗口运行

 exec master.dbo.xp_ReadErrorLog 0, 1, "Failed", "login",@startTime,@endTime,'DESC'

正常返回结果,把代码放到作业步骤下面,作业历史记录都成功。直到6月9号查看ERRORLOG发现有很多Login failed信息,但却没收到相关邮件,想起那个作业是不是有问题。
首先想到的是数据库邮件设置问题,直接运行作业里面的发送邮件的代码,是可以收到邮件的。
然后怀疑里面统计影响行数的@@ROWCOUNT,接着查Errorlog表也没数据!也就是说根本就没有筛选出数据,是数据问题还是其他异常?再次把代码拿出来,放到查询窗口,时间区间改成有Login failed时段,显示有记录出来。可为什么当时作业没把这些记录到Errorlog表中。
多次测试(本地、服务器),2012作业里面用' '它会报错,用" "不报错,但表中没数据插入!开始怀疑是作业中对" "的判别。
网上查找 在最后面看到这样一段回复
exec xp_readerrorlog 0, 1, N'error', N'', N'2012-08-22 00:00:01.000', N'9999-12-31', N'desc'
works on ss2012 -- the N beging the key
Note that you actually don't need it on the date / order options:
exec xp_readerrorlog 0, 1, N'error', N'', '2012-08-22 00:00:01.000', '9999-12-31', 'desc'
will work as well
2012查询窗口运行

 exec master.dbo.xp_ReadErrorLog 0, 1,N'failed',N'login',@startTime,@endTime,'DESC'

确实有返回记录,把这个放入到作业下,运行有记录插入。然后将更改放到服务器上,用错误密码登录数据库,产生一条Login failed日志,之后收到一封错误日志的邮件。
补充:08R2作业中,上面三种方式都可以正常运行

 declare @startTime datetime
declare @endTime datetime
set @startTime = DATEADD(day,-1,GETDATE())
set @endTime = GETDATE()
insert into dbo.Errorlog(LogDate,ProcessInfo,Text)
exec master.dbo.xp_ReadErrorLog 0, 1, 'Failed', 'login',@startTime,@endTime
insert into dbo.Errorlog(LogDate,ProcessInfo,Text)
exec master.dbo.xp_ReadErrorLog 0, 1,N'failed',N'login',@startTime,@endTime
insert into dbo.Errorlog(LogDate,ProcessInfo,Text)
exec master.dbo.xp_ReadErrorLog 0, 1, "Failed", "login",@startTime,@endTime