Ben*_*att 5 sql-server sql-server-2008
我有一个简单的查询,当帐户被禁用超过 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'
Run Code Online (Sandbox Code Playgroud)
当我作为 SA 运行它时,消息被发送。在 SQL Server 代理作业中,我收到此错误:
Executed as user: DOMAIN\MemberOfDomainAdmins. Error formatting query, probably invalid parameters [SQLSTATE 42000] (Error 22050). The step failed.
Run Code Online (Sandbox Code Playgroud)
为执行作业的域用户分配了 msdb 上的 db_owner 角色以及用于附加到消息的查询的数据库。它在两个数据库上的默认架构都是 dbo。
它还在服务器上分配了 sysadmin 角色,并且是 msdb 上 DatabaseMailuserRole 的成员。它还具有对查询使用的数据库邮件配置文件的私有和公共访问权限。
我在网上看到了许多相同问题的例子,但我已经在我看到的例子中采取了解决这个问题的步骤。我还能尝试什么?
我今天早上想通了。问题出在DATEADD函数上。当它在 EXECUTE 语句中时(这是 SQL Server 代理作业运行它的方式),间隔必须是特定的日期部分(天),而不是标记之一(“dd”)。
所以,这个函数:DATEDIFF(dd,DateDisabled,GETDATE())
需要更像这样: DATEDIFF(day,DateDisabled,GETDATE())
那里有对该函数的多次调用,但你明白了。
我是这样想出来的:我让 SQL Server Management Studio 在新的查询编辑器文档中将作业编写为 CREATE 脚本。找到我试图运行的步骤后,我将其复制出来。多汁的部分看起来像这样:
@command = N'[my query]'
我将该组行复制到一个新窗口,并为命令变量添加了一个 DECLARE。
最后,我曾经EXECUTE (@command) AS USER = '[the user the job runs as]'看到会发生什么。以这种方式运行查询,我得到的错误消息比我从作业日志中得到的要详细得多。
我现在已经更正了,工作运行完美。
| 归档时间: |
|
| 查看次数: |
10626 次 |
| 最近记录: |