3

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

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

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

EXEC SP1 

который работал отлично.

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

EXECUTE AS user = 'Domain\JDoe' 

EXECUTE SP1 

REVERT 

Который не удалось.

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

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

+0

Рассматривали ли вы выполнение задания SQL или заданий в качестве конкретного (доменного) пользователя вместо определения его при выполнении? – Jens

+0

@Jens, да, это была моя первая попытка. Я проверил историю заданий и заметил, что сообщение об ошибке говорит, что у меня не было правильного доступа к одному из необходимых DB. Увидев, что я запускал SP вручную с помощью строки EXEC, которая работала так, я попробовал EXEC AS с моим именем пользователя, и сбой произошел с той же ошибкой, что и задание – Powell21

+0

Какие dbms вы используете? – jarlh

ответ

3

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

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

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