我已经面临着以下问题:通过执行普通的查询一切努力,从而与作为档案查询结果发送电子邮件时,使用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'
有什么建议?
Answer 1:
我来变通方法问题。 不知道为什么会工作,但从来没有少。 :)这肯定是安全问题。
我已经研究了SQL代理代表域用户的运行,说域\用户 。 它拥有全套的服务器上的管理权限(“系统管理员”服务器角色,等等)。 SQL Server本身是相同的用户下运行。
工作包含调用sp_send_dbmail同一域\用户下运行的步骤。
此外,我一直追溯到跑跑sp_send_dbmail的查询部分,当它试图执行EXEC xp_logininfo域\用户'来检查对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.
也就是说,以一定的概率可能意味着关于该用户的密码已过期或用户被锁定或那个人的任何其他非愉快的事情什么。
我决定,其风险要更改用户的代理。 于是我拿出来代表它具有相同的“系统管理员”服务器角色,但SQL授权,并忽略此指令检查步骤“山”的发送邮件。
它看起来像伪装成管理员要求真正的管理员为他跑了危险的代码一个用户:)
因此,这项工作的最终代码是第一个,也是唯一的步骤类似于此:
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
Answer 2:
我有这个问题。 我使用SQL Server 2008 R2。 我买了有关新增选项错误的详细信息发送的电子邮件:
@append_query_error = 1,
我得到这个错误有关权限,而不是我的查询电子邮件:
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.
我的查询语句试图访问某个表,其中SQL代理没有权限(其实在我的情况下,它有它甚至没有进入)。
我通过添加新用户“CONTROLLEDNETWO \ sql.service”的分贝“MYDB01”和授予的权限“选择”固定它通过SQLSMS。
Answer 3:
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Main Profile',
@recipients = 'me@vwp.com',
@subject = 'Test',
@body = 'this is a test',
@execute_query_database = 'myTargetDatabase_mscrm',
@query = N'SELECT * from myTargetDatabase_mscrm.dbo.SystemUserBase',
@attach_query_result_as_file = 1,
@query_attachment_filename = 'Test.txt'
作为参考,这种失败多次显示为调用的域管理员,但作为本地\ sqladmin。 一对翻转变量关闭,试图给权限后,我在,它仍然使用主数据库中的作业的脚本中所看到。 我发现设置盯着我的脸。 这是在步骤的配置。 我改成了MSDB和它的工作。 请记住,我改变了选择从myTable的基础上的一些帖子来自myDatabase.dbo.myTable选择。 这可能会或可能不会对解决问题作出了贡献。 我还用@execute_query_database,以确保它运行在正确的地方查询。 同样,这可能不会是必要的。
不管是什么终于成功了高兴,它有什么用它做是否安装与否。
Answer 4:
在我的情况,它无法识别的表属于同数据库。 一旦database.dbo.table加入到查询它的工作。
Answer 5:
当您手动执行查询,使用您的凭据。 当SQL代理执行相同的查询,使用SQL代理服务帐户的凭据。 默认情况下,SQL Server代理将使用本地帐户凭据。 解决该问题的一个方法是改变在其下SQL Server代理服务与访问您的CSV目录\文件中的用户运行的用户。
Answer 6:
我相信这个问题是由于SQL 2008和以后关于锁定下来的安全性只是sp_send_dbmail实现的改变。 它只有当你传递一个QRY到send_dbmail执行,和通电子邮件返回的结果发生。 问题是错误消息是误导和不恰当的。 一个好的解决方案是创建一个具有只是最低限度的必要权限的SQL用户执行查询。 例如,db_reader,或db_writer,和db_owner在绝对必要的。 而要使该用户的所有者。 您还可以创建一个SQL凭据和配置SQL作业到SQL凭据下运行。
Answer 7:
我有这个问题太,并使用了很多意见在这里解决了这个问题两个部分。
1)右键单击“查看历史记录”在工作中表现出故障的详细信息,故障通知给了工作下运行的用户的名字,所以我给这个用户只读到我的DB访问。
2)我忘了指定DBName.dbo .MyTableName并仅用MyTableName。
顺便说一句,电子邮件都到我的垃圾邮件文件夹。
Answer 8:
这是所有有帮助谢谢。 想分享我试图用这是把结果列在Excel文件(XLS)附件做。 这为我工作通过添加query_result_no_padding = 1,query_result_separator =“”。 (这是一个标签,标签中的蜱)
@query_result_header= 1,
@attach_query_result_as_file = 1,
@query_result_no_padding = 1,
@query_attachment_filename = 'TestPriceFlingerReport.xls',
@query_result_separator= ' , ',
@profile_name = 'Test Exchange Server'
文章来源: sp_send_dbmail executed from job fails with query result attached as file