Přišel jsem k řešení tohoto problému. Nevím, proč by to fungovalo, ale nikdy méně. :)Jde rozhodně o bezpečnost.
Zjistil jsem, že SQL Agent běží jménem uživatele domény, řekněme DOMÉNA\Uživatel .Má úplnou sadu práv správce na serveru (role serveru 'sysadmin' atd.). Samotný SQL Server běží pod stejným uživatelem.
Krok úlohy, který obsahuje volání sp_send_dbmail běží pod stejnou DOMÉNA\Uživatel .
Také jsem to vysledoval při spuštění části dotazu sp_send_dbmail pokusí se spustitexec xp_logininfo 'DOMAIN\User' zkontrolovat proti Active Directory, zda je uživatel v pořádku. A překvapení:něco určitě není v pořádku. Tato kontrola končí:
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.
To s určitou pravděpodobností může znamenat cokoli o tom, že vypršela platnost hesla tohoto uživatele nebo je uživatel uzamčen, nebo jiné nepříjemné věci pro toho chlapa.
Rozhodl jsem se, že je riskantní změnit uživatele pro agenta. Přišel jsem tedy k odesílání pošty jménem 'sa', který má stejnou roli serveru 'sysadmin', ale autorizaci SQL a tento krok kontroly AD vynechává.
Vypadá to, že jeden uživatel, který předstírá, že je administrátor, požádal skutečného administrátora, aby pro něj spustil nebezpečný kód :)
Takže konečný kód této úlohy je prvním a jediným krokem, který se podobá tomuto:
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