SQL Server выполняет процедуру от имени пользователя

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

Когда я пытаюсь запустить его в задании (опять же с моими данными AD в опции «Запуск от имени»), у входа в систему внезапно нет доступа к одной из баз данных.

я использовал

EXEC SP1

Который работал нормально.

Я использовал (для эмуляции запуска хранимой процедуры в задании)

EXECUTE AS user = 'Domain\JDoe'

EXECUTE SP1

REVERT

Который провалился.

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

заранее спасибо


person Powell21    schedule 17.11.2016    source источник
comment
Рассматривали ли вы запуск своего задания SQL или шагов задания от имени конкретного пользователя (домена) вместо того, чтобы определять его при выполнении?   -  person Jens    schedule 17.11.2016
comment
@Jens, да, это была моя первая попытка. Я проверил историю заданий и заметил, что в сообщении об ошибке говорилось, что у меня нет правильного доступа к одной из необходимых БД. Увидев, что я запустил SP вручную с помощью строки EXEC, которая сработала, я попробовал EXEC AS с моим именем пользователя, и он потерпел неудачу с той же ошибкой, что и задание.   -  person Powell21    schedule 17.11.2016
comment
Какие СУБД вы используете?   -  person jarlh    schedule 17.11.2016
comment
Какую ошибку вы получаете, когда это не удается?   -  person Alec.    schedule 17.11.2016
comment
Можете ли вы запустить выполнение как внутри хранимой процедуры   -  person TheGameiswar    schedule 17.11.2016
comment
@Алек. Субъект сервера Domain\JBlogs не может получить доступ к базе данных SourceDB в текущем контексте безопасности.   -  person Powell21    schedule 17.11.2016
comment
@TheGameiswar Я думаю, что мог бы, но я не понимаю, как это мне поможет, поскольку проблема, с которой я столкнулся, заключается в том, что я могу запустить БД вручную, но она не работает, когда я использую задание или EXEC AS. Если бы у меня была учетная запись, которая могла бы успешно запустить его с помощью EXEC AS, это помогло бы, но, боюсь, я не   -  person Powell21    schedule 17.11.2016
comment
Вам нужно установить исходную базу данных на TRUSTWORTHY. Обратите внимание, что это имеет и другие последствия для безопасности.   -  person RBarryYoung    schedule 17.11.2016
comment
Если вы хотите запустить его из задания агента SQL, вы можете определить прокси-сервер агента, который имеет все необходимые права доступа, а затем запустить его под этим прокси-сервером в агенте. Это позволит обойти необходимость использования TRUSTWORTHY.   -  person RBarryYoung    schedule 17.11.2016
comment
@RBarryYoung, большое спасибо, не могли бы вы уточнить это или указать мне где-нибудь в Интернете, где это может понравиться?   -  person Powell21    schedule 17.11.2016
comment
@RBarryYoung, запуск задания с прокси-сервером был первым планом, но, к сожалению, он не удался.   -  person Powell21    schedule 17.11.2016
comment
@RBarryYoung, я пытался установить свойство TRUSTWORTHY, но исходная БД - это наша производственная БД CRM, и я не могу получить блокировку   -  person Powell21    schedule 17.11.2016
comment
По умолчанию в SQL Server вы не можете использовать предполагаемый контекст безопасности для выхода из одной базы данных в другую, если источник не является доверенным. Установка базы данных в TRUSTWORTHY — это то, как вы указываете, что база данных является надежным источником. Это мера безопасности, предназначенная для предотвращения взлома базы данных из формы приложения (обычно с помощью инъекции), а затем использования ее в качестве трамплина для всех других баз данных на том же SQL Server. Установив значение TRUSTWORTHY, вы говорите, что эта база данных защищена и никто не может выйти из нее, если это не предполагается.   -  person RBarryYoung    schedule 17.11.2016
comment
Изменить операторы базы данных, подобные этому, требуют, чтобы в БД никого не было. Вы можете добавить WITH ROLLBACK IMMEDIATE в конец команды, чтобы выкинуть всех остальных первыми.   -  person RBarryYoung    schedule 17.11.2016
comment
@RBarryYoung Спасибо за вашу помощь. Я не могу убить все соединения сейчас, но я сделаю это первым делом завтра или ночью и посмотрю, решит ли это мою проблему. Всем большое спасибо за помощь!   -  person Powell21    schedule 17.11.2016
comment
Думаю, я добавлю это как ответ ...   -  person RBarryYoung    schedule 17.11.2016
comment
@RBarryYoung Я рад сделать это и отдать вам должное, как только смогу протестировать, решать вам   -  person Powell21    schedule 17.11.2016


Ответы (1)


Вам необходимо установить исходную базу данных как TRUSTWORTHY. Обратите внимание, что это имеет и другие последствия для безопасности (см. ниже).

По умолчанию в SQL Server вы не можете использовать предполагаемый контекст безопасности для выхода из одной базы данных в другую, если только источник не является доверенным. Установка базы данных в TRUSTWORTHY — это то, как вы указываете, что база данных является надежным источником. Это мера безопасности, предназначенная для предотвращения того, кто взламывает одну базу данных из приложения (обычно с помощью инъекции), а затем использует ее в качестве трамплина для всех других баз данных в том же SQL Server. Установив значение TRUSTWORTHY, вы говорите: «эта база данных защищена и никто не может выбраться из нее, если не должен. "

Операторы базы данных Alter, подобные этому, требуют, чтобы никто другой не находился в базе данных, когда вы ее ALTER. Вы можете добавить WITH ROLLBACK IMMEDIATE в конец команды, чтобы сначала выбросить всех остальных. Конечно, это может иметь свои последствия... ;-)

person RBarryYoung    schedule 17.11.2016