Подтвердить что ты не робот

Sp_send_dbmail, выполняемый с задания, не выполняется с результатом запроса, прикрепленным как файл

Я столкнулся со следующей проблемой: при попытке отправить электронную почту с результатами запроса, прикрепленными как файл, с помощью sp_send_dbmail через выполнение обычного запроса все работает нормально.

Но если добавить тот же код в JobStep и запустить задание, он терпит неудачу.

Ошибка в истории работы говорит

Запрос на форматирование ошибок, возможно недопустимые параметры [SQLSTATE 42000] (ошибка 22050). Не удалось выполнить шаг.

Но когда я комментирую параметр, относящийся к прикреплению файла, он снова начинает работать правильно.

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'

Любые предложения?

4b9b3361

Ответ 1

Я пришел к решению этой проблемы. Не знаю, почему это работает, но тем не менее.:) Это определенно о безопасности.

Я исследовал, что агент SQL работает от имени пользователя домена, скажем DOMAIN\User. Он имеет полный набор прав администратора на сервере (роль сервера sysadmin и т.д.). Сам SQL Server работает под тем же самым пользователем.

Шаг задания, содержащий вызов sp_send_dbmail, выполняется под тем же DOMAIN\User.

Также я проследил, что при запуске части запроса 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

Ответ 2

У меня была эта проблема. Я использую SQL Server 2008 R2. Я получил электронное письмо с дополнительной информацией об ошибке, добавив параметр:

@append_query_error = 1,

Я получил сообщение с этой ошибкой о разрешениях вместо моего запроса:

   Msg 916, Level 14, State 1, Server SERVER\INST01, 
Procedure GetSalesReport, Line 62
The server principal "CONTROLLEDNETWO\sql.service" is not able 
to access the database "MYDB01" under the current security co
ntext.

Мой запрос пытался получить доступ к некоторым таблицам, в которых у SQL Agent не было прав (фактически, в моем случае он даже не имел к нему доступа).

Я исправил его через SQLSMS, добавив нового пользователя "CONTROLLEDNETWO\sql.service" в db "MYDB01" и предоставив разрешения для "выбора".

Ответ 3

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'Main Profile',
    @recipients = '[email protected]',
    @subject = 'Test',
    @body = 'this is a test',
    @execute_query_database = 'myTargetDatabase_mscrm',
    @query = N'SELECT * from myTargetDatabase_mscrm.dbo.SystemUserBase',
    @attach_query_result_as_file = 1,
    @query_attachment_filename = 'Test.txt'

Для справки это неудачно повторяется, пока вызывается как администратор домена, но запускается как локальный \sqladmin. После включения переменных и включения прав доступа я увидел в script задания, что он все еще использует основную базу данных. Я нашел настрой, глядя на меня в лицо. Он в конфигурации для шага. Я изменил его на msdb, и он сработал. Имейте в виду, что я изменил выбор из myTable, чтобы выбрать из myDatabase.dbo.myTable на основе некоторых сообщений. Это может быть или не способствовать устранению проблемы. Я также использовал @execute_query_database, чтобы убедиться, что он запускает запрос из нужного места. Опять же, это, возможно, не было необходимо.

Независимо от того, что в конечном итоге сделало его счастливым, оно не имело никакого отношения к тому, было ли оно прикреплено или нет.

Ответ 4

Когда вы выполняете свой запрос вручную, используются ваши учетные данные. Когда SQL Agent выполняет один и тот же запрос, используются учетные данные учетной записи службы SQL Agent. По умолчанию агент SQL Server будет использовать учетные данные учетной записи LocalSystem. Один из способов устранить проблему - это изменить пользователя, под которым работает служба агента SQL Server, с пользователем, имеющим доступ к вашему каталогу\файл csv.

Ответ 5

Я считаю, что эта проблема возникла из-за изменений, внесенных в SQL 2008 и более поздних версий, в отношении блокировки безопасности только для sp_send_dbmail. Это происходит только в том случае, если вы передаете qry для send_dbmail для выполнения и возвращаете результаты через электронную почту. Проблема в том, что сообщение об ошибке вводит в заблуждение и не подходит. Хорошим решением является создание пользователя SQL с минимальными необходимыми разрешениями для выполнения этого запроса. Например, db_reader, или db_writer, и db_owner, если это абсолютно необходимо. И сделайте этого пользователя владельцем. Вы также можете создать учетные данные SQL и настроить это SQL-задание для работы под этими учетными данными SQL.

Ответ 6

У меня тоже была эта проблема, и я решил ее в двух частях, используя большую часть рекомендаций здесь.

1) Щелкните правой кнопкой мыши, "Просмотр истории" на задании отобразится информация о сбое, а уведомление о сбое дало имя пользователя, на котором выполнялось задание, поэтому я дал этому пользователю доступ только для чтения к моей базе данных.

2) Я забыл указать DBName.dbo.MyTableName и использовал только имя MyTableName.

Кстати, все электронные письма отправлялись в мою папку для нежелательной почты.

Ответ 7

Это все было полезно, спасибо. Хотелось поделиться тем, что я пытался сделать с приложением excel (xls), которое было помещено в столбцы. Это сработало для меня, добавив query_result_no_padding = 1 и query_result_separator = ','. (это вкладка, вкладка в тиках)

@query_result_header= 1,
@attach_query_result_as_file = 1,
@query_result_no_padding = 1,
@query_attachment_filename = 'TestPriceFlingerReport.xls',
@query_result_separator= '  ,   ',
@profile_name = 'Test Exchange Server'

Ответ 8

в моей ситуации, он не мог идентифицировать, что таблица принадлежит базе данных. Как только база данных .dbo.table была добавлена ​​в запрос, она сработала.