Я что-то упускаю при попытке использовать мою хранимую процедуру EXECUTE AS
. Хранимая процедура считывает данные source_db
, объединяет их и сохраняет результат target_db
.
Сам SP находится в target_db
. У меня есть специальный логин и сопоставьте его пользователей как source_db
и target_db
для владельца зр ( в так что пользователь app_agent
в source_db
и target_db
для входа в систему app_agent
).
Если я войду как app_agent
и выполню
EXEC target_db.app_agent_schema.import_data
все отлично работает Но если я изменю
ALTER PROCEDURE app_agent_schema.import_data WITH EXECUTE AS OWNER` (or `AS SELF`)
и попробуйте выполнить его, он бросает
Участник сервера "app_agent" не может получить доступ к базе данных "source_db" в текущем контексте безопасности.
Я использую SQL Server 2008.
Может ли кто-нибудь указать на мою ошибку?
Благодарность
Обновление
После некоторых исследований я обнаружил, что это ALTER DATABASE target_db SET TRUSTWORTHY ON
решает проблему, но это не кажется мне правильным решением ...
источник
Ответы:
Это объясняется в разделе Расширение олицетворения базы данных с помощью EXECUTE AS . Контекст EXECUTE AS является доверенным только в текущей базе данных, и его распространение на другие базы данных является вектором повышения привилегий.
Есть два решения, оба описаны в статье, приведенной выше:
легкий один является пометка достоверной базы данных:
ALTER DATABASE [source_db] SET TRUSTWORTHY ON;
. Хотя легко, также опасно, как это делаетdbo
изsource_db
де-фактоsysadmin
.безопасным является использование подписи кода, см. Пример вызова процедуры в другой базе данных . Это более сложно, но на 100% безопаснее.
источник
Какой пользователь запускает команду ALTER PROCEDURE? Возможно, он установил уровень доступа владельца (сам) для этого пользователя, а не того, который вы намеревались.
источник
app_agent
). Если у меня есть процедура, созданнаяapp_agent
безexecute as owner/self
, войдите в системуapp_agent
, SP выполняется правильно. Если я добавлюEXECUTE AS SELF
(опять же, тот же пользователь) иapp_agent
...is not able to access the database...