Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

sp_send_dbmail, изпълнен от задание, се проваля с резултат от заявката, прикачен като файл

Стигнах до решение на този проблем. Не знам защо ще работи, но въпреки това. :) Определено става дума за сигурност.

Проучих дали SQL Agent работи от името на потребител на домейн, да речем DOMAIN\User .Има пълен набор от администраторски права на сървъра (роля на сървъра 'sysadmin' и т.н.). Самият SQL Server работи под същия потребител.

Стъпката от заданието, която съдържа извикване на sp_send_dbmail работи под същия ДОМЕЙН\потребител .

Също така проследих това при изпълнение на частта за заявка на sp_send_dbmail опитва се да изпълниexec xp_logininfo 'DOMAIN\User' за да проверите в Active Directory дали този потребител е ОК. И изненада:нещо определено не е наред. Тази проверка завършва с:

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.

Това с известна вероятност може да означава нещо за паролата на този потребител, която е изтекла или потребителят е заключен, или всякакви други неприятни неща за този човек.

Реших, че е твърде рисковано да променя потребителя на агент. Така че стигнах до изпращане на поща от името на „sa“, който има същата сървърна роля „sysadmin“, но SQL оторизация и пропуска тази стъпка за проверка на AD.

Изглежда, че един потребител, който се представя за администратор, иска от истинския администратор да изпълни опасен код вместо него :)

Така че крайният код на тази работа е първата и единствена стъпка, която прилича на това:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Премахване на дубликати с помощта на дял от SQL Server

  2. Поправете „Преобразуването не бе успешно при конвертиране на стойността на varchar“ при опит за конкатенация в SQL Server

  3. Най-бързият начин да определите дали записът съществува

  4. Присъединяване на таблица въз основа на стойности, разделени със запетая

  5. Как мога да конвертирам bigint (UNIX timestamp) в datetime в SQL Server?