2017-01-20 52 views
0

长时间阅读器,但第一次在这里发布海报。希望你能帮我解决一些有问题的SQL。我不是专家,所以你可能不得不忍受我:-)运行SELECT查询的SQL作业只返回一行

我试图安排一个SQL作业,以使用sp_send_dbmail向SQL服务器上存在的SQL系统管理员列表发送电子邮件。我遇到的问题是我在一台SQL服务器上工作(用19行电子邮件发送一个CSV附件),但是当我在另外两台服务器上尝试完全相同的工作时,它只从查询(sa帐户)返回1行。如果我将SELECT查询从作业步骤中取出并通过新的查询窗口手动运行它,它将返回正确的行数,但如果作为作业的一部分运行,则只返回1行。

林几乎肯定它必须是一些访问或权限问题,但我可以指出我们的东西。作业历史记录显示作业正在运行并成功完成。

谁能帮助?我真的把我的头发撕掉了!

这是进入作业步骤的T-SQL。

谢谢!

`EXEC msdb.dbo.sp_send_dbmail 
@profile_name = 'SQL DB Alerts', 
@recipients = '<EmailAddressHere>', 
@subject = 'SQL Sysadmins', 
@execute_query_database = 'master', 
@query = N'SELECT @@SERVERNAME as SQLServerName, 
@@SERVICENAME as SQLInstanceName, 
name as LoginName 
FROM syslogins 
WHERE sysadmin = 1', 
@attach_query_result_as_file = 1, 
@query_attachment_filename = 'ListofSysAdmins.csv', 
@query_result_no_padding = 1, 
@append_query_error = 0, 
@exclude_query_output = 1, 
@query_result_header = 1, 
@query_result_separator=' '` 
+0

不知道DMV你使用的是什么,你可以使用运行在作业属性选项,使用系统管理员账号 – TheGameiswar

+0

去看一下谁执行作业(查询)的用户。是一个SQL用户?一个域用户? – M84

回答

0

作业需要在sysadmin或securityadmin角色成员的安全上下文下运行以返回所有sysadmin角色成员。确保作业所有者是上述服务器角色的成员,以便作业在所需的安全环境下运行。作业历史记录将显示实际用于运行作业的帐户。

我建议你使用DMV而不是弃用的系统视图。

SELECT 
     @@SERVERNAME AS SQLServerName 
    , @@SERVICENAME AS SQLInstanceName 
    , logins.name as LoginName 
FROM sys.server_principals AS logins 
JOIN sys.server_role_members AS srm ON srm.member_principal_id = logins.principal_id 
JOIN sys.server_principals AS server_roles ON server_roles.principal_id = srm.role_principal_id 
WHERE 
    server_roles.name = 'sysadmin';