|
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
|
|||
---|---|---|---|
#18+
Доброго времени суток, уважаемые эксперты! Сразу суть проблемы: Есть две хранимые процедуры, которые загружают данные в базу из файлов, расположенных в сетевой share Пардон, опишу кратко, но сразу оговорюсь, что в SSMS они работаю корректно: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64.
Версия: Microsoft SQL Server 2012 - 11.0.2100.60 (X64) Feb 10 2012 19:39:15 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) Как уже писал в SSMS все работает файлы загружаются в базу и переносятся в архив, ставлю в задачу - получаю в логах: "Массовая загрузка невозможна, так как файл "N:\Полное имя файла " не удалось открыть. Код ошибки операционной системы 3(Системе не удается найти указанный путь.). [SQLSTATE 01000]" Т.е. файлы находит, полные имена второй процедуре передает, но спотыкается на BULK INSERT, и переносит их в архив... Собственно вопрос классический "Кто виноват и что делать?" P.S . Нашел вот ТУТ кое-что про " I guess this happens because Agent performs EXECUTE AS USER and as a consequence you are sandboxed into the current database, and therefore you don't have access to server-level tasks. " и TRUSTWORTHY Но что-то до конца не понял как так "sandboxed" но xp_cmdshell и xp_dirtree файлы видят /переносят... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2021, 15:56 |
|
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
|
|||
---|---|---|---|
#18+
InterventXXX, у вас пользователь под которым работает агент ничего не знает о сетевом диске N: пишите полный UNC путь вместо N:\ => \\share_diskN\blablabla куда там он у вас смотрит. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2021, 17:07 |
|
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
|
|||
---|---|---|---|
#18+
Небольшой офф, почему нельзя использовать путь в формате \\Server\SharedFolder\Folder\File, зачем нужен сетевой диск? и вы уверены, что у другого пользователя диск N - есть и ссылается на тот же ресурс и что так будет постоянно? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2021, 17:11 |
|
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
|
|||
---|---|---|---|
#18+
felix_ff, Пока писал Вы ответили, прошу прощения ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2021, 17:12 |
|
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
|
|||
---|---|---|---|
#18+
Сделано через сетевой диск т.к. сервер не в домене (так сложилось исторически и вводить его туда пока не желательно), в любом случае придется сохранять уч. данные, плюс полные имена получаются длинные и кириллические... Но прошу обратить внимание, что список файлов процедура получает, значит диск подключен и доступ есть (xp_cmdshell 'move ...', xp_fileexist, xp_dirtree - все отрабатывают без ошибок), ошибка получается только в BULK INSERT. Чтоб убедится, что доступ есть писал в теле второй процедуры xp_cmshell "type N:\ИмяФайла" и содержимое файла в журнал задания записалось, но на BULK INSERT все равно "не найден указанный путь" ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2021, 14:37 |
|
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
|
|||
---|---|---|---|
#18+
Из документации FROM ' data_file ' Is the full path of the data file that contains data to import into the specified table or view. BULK INSERT can import data from a disk or Azure Blob storage (including network, floppy disk, hard disk, and so on). data_file must specify a valid path from the server on which SQL Server is running. If data_file is a remote file, specify the Universal Naming Convention (UNC) name. A UNC name has the form \\Systemname\ShareName\Path\FileName. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2021, 14:51 |
|
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
|
|||
---|---|---|---|
#18+
В SSMS все отрабатывает хорошо с тем же сетевым диском, проблемы возникают при запуске из задачи, т.е. проблем с синтаксисом и путями быть не должно, процедура даже параметров не содержит, вызывается в обоих случаях одинаково. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2021, 15:45 |
|
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
|
|||
---|---|---|---|
#18+
InterventXXX В SSMS все отрабатывает хорошо с тем же сетевым диском, проблемы возникают при запуске из задачи, т.е. проблем с синтаксисом и путями быть не должно, процедура даже параметров не содержит, вызывается в обоих случаях одинаково. Вы уже попробовали указать полный путь к файлу? Результат тот же? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2021, 16:19 |
|
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
|
|||
---|---|---|---|
#18+
Вероятнее всего ЭТО особой радости не доставит, хотя шанс есть Но всегда есть вариант без привлечения одминов скопировать файл через copy в локальную папку на сервере, откуда и булкать. Или через xз_cmdshell можно запустить сформированную команду с булкой и подключением через авторизацию sql ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2021, 17:12 |
|
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
|
|||
---|---|---|---|
#18+
Собственно все были правы)) Действительно BULK INSERT выполняется с правами уч. записи агента (т.к. соединение устанавливается агентом с windows авторизацией ), а вот xp_cmdshell, xp_fileexist, xp_dirtree , судя по всему, всегда выполняются с правами процесса SQL Server , по крайней мере для моей версии. В SSMS все работало т.к. соединение было через авторизацию SQL Server, соответственно в BULK не было особого выбора и он использовал контекст процесса SQL Server, а в нем и диски подключены и уч. данные для доступа к домену сохранены. В итоге создал агенту новую локальную учетку (с таким же именем и паролем как доменная, что имеет доступ к нужным шарам) и все заработало, не пришлось даже в нее сохранять доменные уч. данные, ну и сетевые диски убрал, заменив полными именами шар... P.S. Хотел сначала сохранить уч. данные домена в NT SERVICE\SQLSERVERAGENT или сетевые диски ей подключить, но не придумал как это сделать или даже запустить cmd в его контексте... Было ощущение, что отвалится часть планов обслуживания, вроде резервного копирования, но нет, видимо тоже все работает в контексте SQL Server. Ждем пока кто-то из админов заменит пароль от доменной учетки, или слетят кодировки/всплывет пробел/потеряется кавычка в конгломерате "xp_cmdshell - xp_dirtree - BULK INSERT", и все развалится, а пока "...костыли наше все!!!") Всем спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2021, 09:49 |
|
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
|
|||
---|---|---|---|
#18+
InterventXXX, поведение xp_cmdshell относительно безопасности описано в справке, а что касается xp_fileexist, xp_dirtree, то не пользуйтесь недокументированными функциями, это плохая практика. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2021, 10:26 |
|
|
start [/forum/topic.php?fid=46&msg=40118654&tid=1684010]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
146ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 240ms |
total: | 479ms |
0 / 0 |