长时间读者,但这里是第一次海报。希望你能帮助我解决一些SQL问题。我不是专家所以你可能不得不忍受我: - )
我尝试安排SQL作业使用sp_send_dbmail通过电子邮件发送SQL服务器上存在的SQL系统管理员列表。我遇到的问题是我在一台SQL服务器上工作(通过电子邮件发送一个包含19行的CSV附件),但是当我在另外两台服务器上尝试完全相同的工作时,它只从查询中返回1行(sa帐户)。如果我从作业步骤中取出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 :(得分: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';