我有一个简单的查询,当帐户被禁用超过30天时,我会向我们的AD帐户管理员发送电子邮件通知.当我自己运行它,以SA身份登录时,它可以正常工作,但在sql Server代理作业中运行时会失败.
DECLARE @QueryString varchar(max) SET @QueryString = 'Select TrackingTable.Username FROM dbName.Schema.TrackingTable inner join dbName.Schema.viewName on DisabledAccounts.username = viewName.username WHERE DATEDIFF(dd,DateDisabled,GETDATE()) > 25 AND viewName.OU = ''InactiveAccounts''' EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Profile',@body = 'This is the body text. Nothing interesting here. ',@recipients = 'me@mydomain.tld',@subject='Account status update',@query = @QueryString,@importance = 'High'
当我将其作为SA运行时,将发送消息.在sql Server代理作业中,我收到此错误:
Executed as user: DOMAIN\MemberOfDomainAdmins. Error formatting query,probably invalid parameters [sqlSTATE 42000] (Error 22050). The step Failed.
作业执行的域用户在msdb上分配了db_owner角色,并为附加到消息的查询分配了数据库.它在两个数据库上的默认架构都是dbo.
它还在服务器上分配了sysadmin角色,并且是msdb上DatabaseMailuserRole的成员.它还具有对查询使用的数据库邮件配置文件的私有和公共访问权限.
我在网上看过几十个相同问题的例子,但我已经采取了在我看到的例子中解决这个问题的步骤.我还能尝试什么?
解决方法
我今天早上想通了.问题出在DATEADD函数上.当它在EXECUTE语句中(这是sql Server代理程序作业将如何运行它)时,间隔必须是特定的datepart(day),而不是其中一个标记(“dd”).
所以,这个函数:DATEDIFF(dd,GETDATE())
需要更像这样:DATEDIFF(day,GETDATE())
以下是我弄清楚的方法:我在sql Server Management Studio脚本中将作业作为新查询编辑器文档中的CREATE脚本.一旦我找到了我试图运行的步骤,我就把它复制出来了.多汁的东西看起来像这样:
@command = N'[我的查询]’
我将该组行复制到一个新窗口,并为命令变量添加了一个DECLARE.
最后,我使用了EXECUTE(@command)AS USER ='[作业运行的用户]’来查看会发生什么.以这种方式运行查询,我得到了比我从日志中获得的更详细的错误消息.
我现在已经纠正了,而且工作完美无缺.