我已经找到了解决这个问题的方法。不知道为什么它会起作用,但无论如何。 :)
这肯定与安全有关。
我调查了SQL代理正在以域用户的名义运行,比如说DOMAIN\User。
它在服务器上拥有完整的管理员权限(sysadmin服务器角色等)。 SQL Server本身也在同一用户下运行。
包含对sp_send_dbmail的调用的作业步骤在同一个DOMAIN\User下运行。
此外,我跟踪了当运行sp_send_dbmail的查询部分时,它尝试执行exec xp_logininfo 'DOMAIN\User'来检查该用户是否OK。 令人惊讶的是:某些东西明显不对。 这个检查以以下方式结束:
Msg 15404, Level 16, State 19, Server SQLC002INS02\SQLC002INS02, Line 1
Could not obtain information about Windows NT group/user 'DOMAIN\User.', error code 0x2.
这可能意味着用户的密码已过期、用户被锁定或其他对该用户不利的事情。
我决定更改代理用户存在风险。所以我想到了以“sa”的名义发送邮件,该用户具有相同的“sysadmin”服务器角色但具有SQL授权并省略此AD检查步骤。
看起来像是一个用户假装成管理员要求真正的管理员为他运行危险代码 :)
因此,这个作业的最终代码的第一步也是唯一一步如下:
execute as login = 'sa'
exec msdb.dbo.sp_send_dbmail
@profile_name = 'profile_name',
@recipients = 'some@mail.com',
@body = 'body',
@subject = 'subj',
--Parameters that refers to attached file
@attach_query_result_as_file = 1,
@query_result_header = 0,
@query_result_no_padding = 1,
@query = 'select 1',
@query_attachment_filename = 'test.csv'
revert