从作业执行的sp_send_dbmail失败,查询结果作为文件附加

Pau*_*jto 17 sql-server sp-send-dbmail attachment sql-server-2008

我遇到了以下问题:当尝试发送带有作为文件附加查询结果的电子邮件时,通过执行普通查询使用sp_send_dbmail一切似乎都正常.

但是,如果将相同的代码添加到JobStep并运行作业,则会失败.

工作经历中的错误说

格式化查询时出错,可能是无效参数[SQLSTATE 42000](错误22050).步骤失败了.

但是当我注释掉引用文件的参数时,它再次开始正常工作.

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'
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Pau*_*jto 26

我来解决这个问题.不知道为什么它会起作用但从来没有.:)这绝对是关于安全的.

我已经调查过SQL Agent是代表域用户运行的,比如DOMAIN\User.它在服务器上具有完整的管理员权限('sysadmin'服务器角色等).SQL Server本身在同一个用户下运行.

包含对sp_send_dbmail的调用的作业步骤在相同的DOMAIN\User下运行.

另外我跟踪了当运行sp_send_dbmail的查询部分时,它尝试执行 exec xp_logininfo'DOMAIN\User'以检查Active Directory是否该用户正常.而且意外:有些事情肯定不行.此检查最终得到:

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.
Run Code Online (Sandbox Code Playgroud)

有一些概率可能意味着该用户的密码已过期或用户被锁定或该家伙的任何其他不愉快的事情.

我决定改变Agent的用户风险.所以我代表'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
Run Code Online (Sandbox Code Playgroud)

  • 这并不能真正解决根本问题,而是使用可能远远超过所需权限的帐户.这个链接解决了root问题,而不需要`sa`帐户:http://stackoverflow.com/a/12963109/4416750 (2认同)

小智 7

我有这个问题.我正在使用SQL Server 2008 R2.通过添加选项,我收到了有关错误的更多信息的电子邮件:

@append_query_error = 1,
Run Code Online (Sandbox Code Playgroud)

我收到了有关权限而不是我的查询的错误的电子邮件:

   Msg 916, Level 14, State 1, Server SERVER\INST01, 
Procedure GetSalesReport, Line 62
The server principal "CONTROLLEDNETWO\sql.service" is not able 
to access the database "MYDB01" under the current security co
ntext.
Run Code Online (Sandbox Code Playgroud)

我的查询是试图访问SQL Agent没有权限的一些表(实际上在我的情况下它甚至都没有访问它).

我通过SQLSMS修复它,向db"MYDB01"添加一个新用户"CONTROLLEDNETWO\sql.service"并授予"select"权限.

  • 非常非常有用的答案!!+1 (2认同)