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

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

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

ошибка в истории Иов говорит

ошибка форматирования запроса, вероятно, недопустимые параметры [SQLSTATE 42000] (ошибка 22050). Шаг неудачный.

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

exec msdb.dbo.sp_send_dbmail 
    @profile_name = 'profile_name', 
    @recipients  = 'some@mail.com',
    @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'

какие предложения?

8 ответов


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

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

шаг задания, содержащего вызов процедура sp_send_dbmail работает под тем же домен\пользователь.

также я проследил это при запуске части запроса процедура sp_send_dbmail он пытается выполнить exec xp_logininfo 'домен\пользователь' чтобы проверить 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 и опускает этот шаг проверки объявления.

похоже, что один пользователь, который притворяется администратором, просит реального администратора запустить опасный код для него:)

таким образом, окончательный код этого задания является первым и единственным шагом, подобным этому:

execute as login = 'sa'
exec msdb.dbo.sp_send_dbmail 
    @profile_name = 'profile_name', 
    @recipients  = 'some@mail.com',
    @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

у меня была эта проблема. Я использую 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.сервис " для БД "MYDB01" и предоставления прав на "выбор".


EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'Main Profile',
    @recipients = 'me@vwp.com',
    @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. После отключения переменных и попытки дать разрешения я увидел в скрипте задания, что он все еще использует базу данных master. Я обнаружил, что декорации смотрят мне прямо в лицо. Это в конфигурации для шага. Я изменил его на msdb, и он работал. Имейте в виду, что я изменил выбор из myTable, чтобы выбрать из myDatabase.dbo.myTable на основе некоторые должности. Это могло способствовать или не способствовать решению проблемы. Я также использовал @execute_query_database, чтобы убедиться, что он выполняет запрос из нужного места. Опять же, в этом не было необходимости.

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


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


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


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

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

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

кстати, все письма шли на мою нежелательную почту папка.


это все было полезно спасибо. Хотел поделиться тем, что я пытался сделать с приложением 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'

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