使用sqlcmd的批处理文件需要正确的用户权限

时间:2015-08-20 22:53:07

标签: batch-file sqlcmd

我有一个SQL脚本,它在SQL Management Studio中工作,但无法以批处理方式执行 我发现当我使用路径C中的import.csv文件而不是所需的网络路径(D :)时,它正在工作

批量

rem ---------- SQL Import/Merge Configbuilder File ----------
SET LOGFILE=MyLogFile.log
call :Logit >> %LOGFILE% 
exit /b 0
:Logit
sqlcmd -S localhost\SERVER1 -d Database-U sa -P Password -i "Import.sql"
CMD

import.sql

BULK
INSERT Configbuildertemp
FROM 'D:\Batchfiles\Configbuilderimport.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n'
)
GO

问题:

当我(在服务器上与管理员连接)时,哪个用户正在批处理文件中执行sqlcmd请求所需的目标是通过Windows任务调度程序执行?

然而,我可以批量插入将文件复制到C:\并在执行后再次将其删除,但这将是公牛。

1 个答案:

答案 0 :(得分:2)

在Windows任务计划程序中,您可以为每个任务定义应该使用哪个用户帐户来运行任务。如果您定义了具有从运行批处理文件的任务的包含Configbuilderimport.csv的网络共享中读取文件的权限的用户帐户,则可以使用如下批处理文件:

rem Remove a perhaps already existing network share mapped to drive D:.
%SystemRoot%\system32\net.exe use D: /delete /yes 2>nul

rem Temporarily map \\ServerName\NameOfShare to drive D: using credentials
rem of user account running this batch file as defined in task scheduler.
%SystemRoot%\system32\net.exe use D: \\ServerName\NameOfShare /persistent:no

rem ---------- SQL Import/Merge Configbuilder File ----------
SET LOGFILE=MyLogFile.log
call :Logit >> %LOGFILE%

rem Remove network share mapped to drive D:.
%SystemRoot%\system32\net.exe use D: /delete /yes 2>nul
exit /b 0

:Logit
sqlcmd.exe -S localhost\SERVER1 -d Database-U sa -P Password -i "Import.sql"
goto :EOF

但是,如果批处理文件由本地管理员帐户执行,当然该帐户无权访问\\ServerName\NameOfShare上的文件,则需要在批处理文件中指定密码,域和用户名。与使用正确的用户帐户定义的任务相比,这更不安全,因为有权访问批处理文件的每个人都可以读取密码。在任务计划程序中为用于运行批处理文件的用户帐户输入的密码由Windows加密。

rem Remove a perhaps already existing network share mapped to drive D:.
%SystemRoot%\system32\net.exe use D: /delete /yes 2>nul

rem Temporarily map \\ServerName\NameOfShare to drive D: using credentials
rem specified here directly in the batch file in the line below.
%SystemRoot%\system32\net.exe use D: \\ServerName\NameOfShare password /user:domain\username /persistent:no

rem ---------- SQL Import/Merge Configbuilder File ----------
SET LOGFILE=MyLogFile.log
call :Logit >> %LOGFILE%

rem Remove network share mapped to drive D:.
%SystemRoot%\system32\net.exe use D: /delete /yes 2>nul
exit /b 0

:Logit
sqlcmd.exe -S localhost\SERVER1 -d Database-U sa -P Password -i "Import.sql"
goto :EOF