【问题标题】:batch file with sqlcmd needs correct user permissions带有 sqlcmd 的批处理文件需要正确的用户权限
【发布时间】:2015-08-20 22:53:06
【问题描述】:

我有一个在 SQL Management Studio 中运行的 SQL 脚本,但无法作为批处理执行。
我发现当我使用路径 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

问题:

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

但是,我可以批量插入以将文件复制到 C:\ 并在执行后再次删除它,但这将是多头的。

【问题讨论】:

    标签: batch-file sqlcmd


    【解决方案1】:

    在 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
    

    【讨论】:

    • 为什么本地管理员“当然”没有权限?因为当我连接到服务器时,我已经映射了网络驱动器,甚至批处理文件的位置也在网络中的 Nass 驱动器上。也谢谢,我下班回家试试看
    • 我认为使用“本地管理员”的 local 系统帐户 意味着它在 Windows 默认情况下只有 local 的管理员权限b> 机器。但是可以在 ComputerA 上拥有一个具有本地管理员权限的本地 UserX 帐户,该帐户还配置为对 上的共享具有读或读/写甚至完全访问权限计算机B。关于其他机器的权限,如果网络是具有本地用户的自我管理专用网络或具有域用户的域网络,则会有所不同。持久性网络驱动器映射与用户相关,仅在登录时存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    相关资源
    最近更新 更多