Представьте себе следующий сценарий: мне нужно выполнить хранимую процедуру, которая, помимо прочего, должна ВЫПОЛНИТЬ xp_cmdshell для запуска сценария командной строки, который выполняет команду массовой вставки (bcp) для помещения данных в другую базу данных.
У меня на сервере три учетных записи пользователя Windows: MyAdmin, MyProxy и MyUser.
MyAdmin - это db_owner базы данных и роль сервера bulkadmin. MyProxy - это учетная запись, связанная с xp_cmdshell
через sp_xpcmdshell_proxy_account
. MyUser имеет разрешение EXECUTE для хранимой процедуры и ничего больше.
Если я вхожу в систему как SERVER \ MyUser и выполняю хранимую процедуру, происходит сбой с ошибкой «В разрешении EXECUTE было отказано для объекта« xp_cmdshell », базы данных« mssqlsystemresource », схемы« sys ».
Итак, я подумал, что ответ - предоставить EXECUTE на xp_cmdshell
в MyProxy, но это тоже не сработало. Затем я предоставил EXECUTE на xp_cmdshell
на MyAdmin и изменил определение хранимой процедуры на WITH EXECUTE AS 'MyAdmin' и хотя xp_cmdshell
выполняется нормально, массовая вставка не выполняется.
Что мне нужно сделать, чтобы этот сценарий заработал?
Обновление: был задан на StackOverflow.com (1440332), но не получил ответов - надеемся на лучший результат здесь
Я бы сделал это комментарием вместо «ответа», если бы у меня было на это разрешение, но почему бы не использовать команду BULK INSERT T-SQL вместо xp_cmdshell для bcp?
Кажется, я помню шаг BCP в SSIS. Не могли бы вы создать пакет SSIS и запустить его? Вы можете запускать пакеты SSIS из .net.