| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > MS SQL Server > Доступ к файлам из внешних программ - SQL Server |
| Автор: Alex870 29.3.2016, 09:16 | ||
| Доброго времени суток всем. Столкнулся с такой проблемой: В хранимке загружается Excel в таблицу, но перед этим надо его немного поправить. Для этого решил написать скрипт на vbs. Проверил, из командной строки скрипт работает, а вот внутри процедуры:
Выдает ошибку, что не может получить доступ к файлу c:\myexcel.xlsx. Решил, что это особенности работы cscript, написал программку на delphi, делающую то же самое. Ситуация сохраняется, из командной строки программка отрабатывает, а из хранимки - не может получить доступ к файлу excel. Что может быть? Всё запускается под админом сервера. |
| Автор: Akina 29.3.2016, 10:06 |
Что, и процесс MS SQL Server тоже? можно, я буду сомневаться? Поправь просто права доступа к файлу, дай для группы аутентифицированных пользователей (или для группы "Все") доступ на хотя бы чтение файла (ну и содержимого каталога есссно). Для проверки - запусти из того же скрипта командный процессор и посмотри, от имени какой учётки он работает. |
| Автор: Alex870 29.3.2016, 13:10 | ||||
Конечно можно Но!... Я могу приведенным выше способом обратиться к любому файлу на сервере. Могу его (файл) удалить например:
А вот если я вызываю какую-то внешнюю программу, например cscript, которая в свою очередь пытается открыть какой-то файл, то у неё доступа к файлу уже нет. При этом сама программа (или скрипт) запускаются. С cmd.exe проверил. Сделал его запуск из скрипта. Cmd.exe запустился под админом. На папку доступ "Всем" тоже не помог. Думаю здесь дело в настройках именно самого MS SQL. Я пробовал аналогичную операцию сделать на 3-х разных серверах, естественно файлы там клал в разные каталоги. Везде результат одинаковый. |
| Автор: Alex870 29.3.2016, 13:28 | ||||
| Попробуйте пожалуйста у себя. Сделайте вот такой простейший скрипт. Он заполняет в первой строке Excel первые сорок ячеек значениями.
Кладем его например в c:\1\script.vbs (куда доступ есть всем) Туда же кладем файл c:\1\excel.xlsx Пробуем из командной строки - всё должно работать, в excel.xlsx в первой строке появляются значения. А теперь пробуем вот это с сервера:
Если у кого-то это отработает -напишите пожалуйста. В смысле SQL запрос пройдет без ошибок, но вернет он информацию о том, что не удалось получить доступ к файлу c:\1\excel.xlsx |
| Автор: Alex870 29.3.2016, 14:08 |
| Да никакого кода нет. Запрос в MS SQL выполняется без ошибок. Но, как результат, выводит сообщение "Приложению MS Excel не удалось получить доступ к файлу (и имя файла)" Попробуйте у себя запустить скрипт из моего предыдущего поста, Вы сами всё увидите. |
| Автор: Akina 29.3.2016, 14:34 | ||
КТО выводит это сообщение? Cscript? Значит, отлаживайте скрипт. Дробите цепочки, выводите всё в дебаг-инфо (хоть msgbox-ами). Код поправьте (строка 6, например - нет у Excel.Application коллекции Workbook, есть коллекция Workbooks). В итоге ошибка должна быть максимально точно локализована. Как минимум. Ну нет у меня сейчас в доступе MS SQL, на котором я бы мог это проделать. |
| Автор: Alex870 29.3.2016, 15:23 | ||
Это сообщение выводит скрипт, запущенный xp_cmdshell. Если скрипт запустить из командной строки он работает отлично. На счет ошибки в коде - виноват, я здесь (на форуме) его набирал вручную, а не копировал свой, т.к. не могу его перенести с сервера на машину, имеющую доступ в инет. Как же мне точно локализовать ошибку, если скрип рабочий (100%) и ошибку я вижу, но при запуске его из под xp_cmdshell, а уж как в нем локализовать - не знаю. Вообще думал, что xp_cmdshell запускается под тем пользователем, под которым запущен SQL сервер. Это же подтвердил эксперимент с cmd.exe, который Вы мне посоветовали. Однако запуск другой программы это одно, а доступ на запись к файлам - другое. |
| Автор: Akina 29.3.2016, 15:41 | ||
Раздробить скрипт на неделимые куски, и разбавить выводом отладочной информации. Например, начало скрипта может выглядеть так:
и так далее... и смотрим, что сыплется в консолю. Добавлено через 1 минуту и 52 секунды Кстати, мне вот не нравится обращение к книге по номеру в коллекции. Особенно с учётом того, что ссылка на неё УЖЕ есть в переменной objWorkBook. |
| Автор: Alex870 29.3.2016, 16:05 |
| Попробовал, до set objWorkBook=objWorkBook.Open(fPath) всё отрабатывает корректно (в MS SQL). после скрипт выдает ошибку которую описывал 2 поста назад. В смысле запрос exce... выводит таблицу отчета о работе внешнего модуля, в которой указано, что Excel не смог получить доступ к файлу и написано имя и путь к файлу xlsx |
| Автор: Akina 29.3.2016, 16:18 | ||
То есть к ошибке приводит попытка выполнить оператор
И сообщение выдаётся именно cscript-ом... При этом - процесс EXCEL.Application запущен? проверь... влепи в скрипте минутную паузу перед этой строкой и посмотри дерево процессов. |
| Автор: Alex870 29.3.2016, 16:33 |
| Поставил паузу. В процессах появляются cmd.exe и Excel.exe запущенные под администраторской учеткой. |
| Автор: Alex870 30.3.2016, 16:33 |
| Проблему решил!!! Вот описание её решения: https://social.msdn.microsoft.com/Forums/en-US/b81a3c4e-62db-488b-af06-44421818ef91/excel-2007-automation-on-top-of-a-windows-server-2008-x64 Ну кто бы мог догадаться до такого!!! |