Как правило, нет, такая работа не может быть выполнена без большого количества суеты и усилий и прав системного администратора.
SQL - это движок базы данных, который ориентирован на проблемы с базами данных, и поэтому совершенно справедливо имеет очень плохие инструменты для работы с файлами. Обходные пути включают в себя:
- xp_cmdshell - инструмент выбора для манипулирования файлами.
- Мне нравится решение sp_OA *, потому что оно дает мне воспоминания о SQL 7.0. Но использование этих функций всегда заставляло меня нервничать.
- Возможно, вы сможете что-то сделать с OPENROWSET, где целью вставки является файл, определенный с помощью этой функции. Звучит маловероятно, возможно, стоит посмотреть.
- Аналогичным образом, определение связанного сервера может использоваться в качестве цели для вставок или выбора ... в ... операторах.
Похоже, безопасность - это ваш показ. По большому счету, когда SQL отправляется в ОС, он обладает всеми правами учетной записи NT, под которой запускается служба SQL; если вы хотите ограничить доступ к сети, тщательно настройте эту учетную запись (и никогда не назначайте ее администратором домена!)
Можно вызвать xp_cmdshell от имени пользователя без прав sysadmin и настроить эти вызовы так, чтобы они не имели тех же прав доступа, что и учетная запись SQL Service NT. Согласно BOL (SQL 2005 и выше):
xp_cmdshell Proxy Account
Когда он вызывается пользователем, который не является членом предопределенной роли сервера sysadmin, xp_cmdshell подключается к Windows, используя имя учетной записи и пароль, хранящиеся в учетных данных с именем ## xp_cmdshell_proxy_account ##. Если эти учетные данные прокси не существуют, xp_cmdshell завершится ошибкой.
Учетные данные прокси-сервера можно создать, выполнив процедуру sp_xp_cmdshell_proxy_account. В качестве аргументов эта хранимая процедура принимает имя пользователя и пароль Windows. Например, следующая команда создает учетные данные прокси для пользователя домена Windows SHIPPING \ KobeR с паролем Windows sdfh% dkc93vcMt0.
Таким образом, ваш пользователь входит в систему с любыми правами пользователя ( не sysadmin!) И выполняет хранимую процедуру, которая вызывает xp_cmdshell, которая «подхватит» все настроенные права прокси. Опять же, неловко, но звучит так, как будто бы ты сделал то, что хотел. (Возможным ограничивающим фактором является то, что вы получаете только одну учетную запись прокси, поэтому она должна соответствовать всем возможным потребностям.)
Честно говоря, мне кажется, что лучшим решением было бы:
- Определите источник вызова хранимой процедуры,
- Попросите, чтобы процедура вернула данные, которые будут записаны в файл (вы можете при необходимости выполнить все форматирование и макетирование в процедуре), и
- Пусть вызывающая подпрограмма управляет всеми этапами подготовки файла (это может быть так же просто, как перенаправление данных, возвращаемых из SQL, в открытый файл)
Итак, что запускает вызов хранимой процедуры?