2017-01-20 51 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';