powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
11 сообщений из 11, страница 1 из 1
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
    #40118434
InterventXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, уважаемые эксперты!

Сразу суть проблемы:

Есть две хранимые процедуры, которые загружают данные в базу из файлов, расположенных в сетевой 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.
CREATE PROCEDURE LoadAllFiles ()
AS
BEGIN

DECLARE 
    @FILES table(FileName varchar(512)),
    @FOLDER varchar(512) = 'N:\folder\', -- ресурс в сети, подключенный как сетевой диск
    @CUR_FILE varchar(512) -- имя  текущего файла

INSERT INTO @FILES
EXEC xp_dirtree 

WHILE @@FETCH_STATUS = 0
BEGIN
    
    EXEC LoadFile(@FOLDER+@CUR_FILE)
    
    FETCH NEXT ...
    INTO @CUR_FILE

    EXEC xp_cmdshell 'move /Y N:\ИмяФайла N:\АрхивнаяПапка'
END

END


CREATE PROCEDURE LoadFile(@FULL_FILE_NAME varchar(512))
AS
BEGIN

-- проверяем что файл существует
DECLARE @fileexist table(isExist int, isDir int, isParDirExist int)

insert into @fileexist
exec master.dbo.xp_fileexist @FULL_FILE_NAME 

if (select count(isExist) from @fileexist where isExist=1 and isDir=0)<> 1 
   BEGIN
      print 'Файл не существует или сбой проверки: ' + @FULL_FILE_NAME 
      return;
   END

DECLARE @SQL_CMD varchar(4000) =''


-- считываем данные во временную таблицу
if (OBJECT_ID('TEMPDB..#TEMP_TABLE')  is not null) DROP TABLE #TEMP_TABLE
CREATE TABLE #TEMP_TABLE(VAR_NAME varchar(100),VAR_VALUE varchar(100))

SET @SQL_CMD =	'BULK insert #TEMP_TABLE from ''' + @FULL_FILE_NAME + '''
					with( 
						CODEPAGE = ''1251''
						,FIRSTROW = 1
						,DATAFILETYPE = ''char''
						,ROWTERMINATOR = ''0x0a''
						);'
BEGIN TRY						
EXEC (@SQL_CMD);
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE()
END CATCH

END



Версия:
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 файлы видят /переносят...
...
Рейтинг: 0 / 0
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
    #40118463
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterventXXX,

у вас пользователь под которым работает агент ничего не знает о сетевом диске N:

пишите полный UNC путь вместо N:\ => \\share_diskN\blablabla куда там он у вас смотрит.
...
Рейтинг: 0 / 0
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
    #40118465
iiyama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Небольшой офф,
почему нельзя использовать путь в формате \\Server\SharedFolder\Folder\File, зачем нужен сетевой диск?
и вы уверены, что у другого пользователя диск N - есть и ссылается на тот же ресурс и что так будет постоянно?
...
Рейтинг: 0 / 0
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
    #40118467
iiyama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

Пока писал Вы ответили, прошу прощения
...
Рейтинг: 0 / 0
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
    #40118619
InterventXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделано через сетевой диск т.к. сервер не в домене (так сложилось исторически и вводить его туда пока не желательно), в любом случае придется сохранять уч. данные, плюс полные имена получаются длинные и кириллические...

Но прошу обратить внимание, что список файлов процедура получает, значит диск подключен и доступ есть (xp_cmdshell 'move ...', xp_fileexist, xp_dirtree - все отрабатывают без ошибок), ошибка получается только в BULK INSERT.

Чтоб убедится, что доступ есть писал в теле второй процедуры xp_cmshell "type N:\ИмяФайла" и содержимое файла в журнал задания записалось, но на BULK INSERT все равно "не найден указанный путь"
...
Рейтинг: 0 / 0
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
    #40118626
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из документации


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.
...
Рейтинг: 0 / 0
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
    #40118638
InterventXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В SSMS все отрабатывает хорошо с тем же сетевым диском, проблемы возникают при запуске из задачи, т.е. проблем с синтаксисом и путями быть не должно, процедура даже параметров не содержит, вызывается в обоих случаях одинаково.
...
Рейтинг: 0 / 0
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
    #40118654
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterventXXX
В SSMS все отрабатывает хорошо с тем же сетевым диском, проблемы возникают при запуске из задачи, т.е. проблем с синтаксисом и путями быть не должно, процедура даже параметров не содержит, вызывается в обоих случаях одинаково.

Вы уже попробовали указать полный путь к файлу? Результат тот же?
...
Рейтинг: 0 / 0
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
    #40118680
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вероятнее всего ЭТО особой радости не доставит, хотя шанс есть
Но всегда есть вариант без привлечения одминов скопировать файл через copy в локальную папку на сервере, откуда и булкать.
Или через xз_cmdshell можно запустить сформированную команду с булкой и подключением через авторизацию sql
...
Рейтинг: 0 / 0
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
    #40120496
InterventXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно все были правы))

Действительно 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", и все развалится, а пока "...костыли наше все!!!")

Всем спасибо!
...
Рейтинг: 0 / 0
BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
    #40120510
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterventXXX,

поведение xp_cmdshell относительно безопасности описано в справке, а что касается xp_fileexist, xp_dirtree, то не пользуйтесь недокументированными функциями, это плохая практика.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / BULK INSERT ... from \\WIN_SHARE работает в SMSS, а из задачи - "не найден путь"
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]