Tôi đã đến để giải quyết vấn đề đó. Không biết tại sao nó sẽ hoạt động nhưng không bao giờ ít hơn. :) Đó chắc chắn là về bảo mật.
Tôi đã điều tra rằng SQL Agent đang chạy thay mặt cho người dùng miền, chẳng hạn như DOMAIN \ User . Nó có đầy đủ các quyền quản trị trên máy chủ (vai trò máy chủ 'sysadmin', v.v.). Bản thân SQL Server đang chạy dưới cùng một người dùng đó.
Bước công việc có chứa lệnh gọi đến sp_send_dbmail chạy trong cùng một DOMAIN \ User .
Ngoài ra, tôi đã theo dõi điều đó khi chạy phần truy vấn của sp_send_dbmail nó cố gắng thực thi executive xp_logininfo 'DOMAIN \ User' để kiểm tra Active Directory nếu người dùng đó đồng ý. Và ngạc nhiên:một cái gì đó chắc chắn là không ổn. Kiểm tra này kết thúc bằng:
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.
Điều đó, với một số xác suất có thể có nghĩa là bất kỳ điều gì về mật khẩu của người dùng đó đã hết hạn hoặc người dùng bị khóa hoặc bất kỳ điều gì không dễ chịu khác đối với người đó.
Tôi quyết định rằng việc thay đổi người dùng cho Đại lý là rất rủi ro. Vì vậy, tôi nghĩ đến việc gửi thư thay mặt cho 'sa' có cùng vai trò máy chủ 'sysadmin' nhưng ủy quyền SQL và bỏ qua bước kiểm tra AD này.
Có vẻ như một người dùng giả danh quản trị viên để yêu cầu quản trị viên thực chạy mã nguy hiểm cho anh ta :)
Vì vậy, mã cuối cùng của công việc này là bước đầu tiên và duy nhất tương tự như sau:
execute as login = 'sa'
exec msdb.dbo.sp_send_dbmail
@profile_name = 'profile_name',
@recipients = '[email protected]',
@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