在SQL存储过程中调用批处理文件时无法正常运行

时间:2018-07-18 20:07:43

标签: sql-server batch-file

我遇到一个奇怪的问题,即如果从存储过程中调用批处理文件,则该批处理文件将无法完全工作,但是如果手动运行,则一切正常。

批处理文件仅创建几个目录,然后按如下所示设置权限:

md "\\SERVER\Share\Job\%1\Material"
md "\\SERVER\Share\Job\%1\Costs"
md "\\SERVER\Share\Job\%1\Project"

icacls  "\\SERVER\Share\Job\%1\Material" /inheritance:r
icacls  "\\SERVER\Share\Job\%1\Material" /grant "SYSTEM":F
icacls  "\\SERVER\Share\Job\%1\Material" /grant "DOMAIN\Domain Admins":(CI)(OI)M
icacls  "\\SERVER\Share\Job\%1\Material" /grant "DOMAIN\SG_Material":(CI)(OI)M

icacls  "\\SERVER\Share\Job\%1\Costs" /inheritance:r
icacls  "\\SERVER\Share\Job\%1\Costs" /grant "SYSTEM":F
icacls  "\\SERVER\Share\Job\%1\Costs" /grant "DOMAIN\Domain Admins":(CI)(OI)M
icacls  "\\SERVER\Share\Job\%1\Costs" /grant "DOMAIN\SG_Costs":(CI)(OI)M 

icacls  "\\SERVER\Share\Job\%1\Project" /inheritance:r
icacls  "\\SERVER\Share\Job\%1\Project" /grant "SYSTEM":F
icacls  "\\SERVER\Share\Job\%1\Project" /grant "DOMAIN\Domain Admins":(CI)(OI)M
icacls  "\\SERVER\Share\Job\%1\Project" /grant "DOMAIN\SG_Project":(CI)(OI)M

下面的SQL存储过程将'foldernumber'传递给批处理文件(%1)

 DECLARE @CMDSQL VARCHAR(1000)
    SET @CMDSQL = 'C:\CreateFolders.bat ' + @foldernumber
    EXEC master..xp_CMDShell @CMDSQL

运行“ CreateFolders.bat 1125”会正确创建一个名为1125的文件夹,创建子文件夹(“材料”,“成本”,“项目”)并设置所有权限。

如果随后使用SQL启动存储过程,则批处理文件将运行,创建“变量”文件夹及其子文件夹,但应用权限。

几件事值得一提:

  • 我已经在\\ SERVER \ Share(共享和NTFS级别)上赋予了SQL Server对象“完全控制”权限
  • 批处理文件对于SQL Server是本地的

感觉存储过程没有以足够高的特权运行,但是我不确定如何进行更改(如果可能的话)。

1 个答案:

答案 0 :(得分:0)

最终弄清楚了。

我更改了批处理文件以删除继承并在一行上授予SYSTEM权限。

因此,此:

icacls  "\\SERVER\Share\Job\%1\Project" /inheritance:r
icacls  "\\SERVER\Share\Job\%1\Project" /grant "SYSTEM":F
icacls  "\\SERVER\Share\Job\%1\Project" /grant "DOMAIN\Domain Admins":(CI)(OI)M
icacls  "\\SERVER\Share\Job\%1\Project" /grant "DOMAIN\SG_Project":(CI)(OI)M

对此:

icacls  "\\SERVER\Share\Job\%1\Project" /inheritance:r /grant "SYSTEM":F
icacls  "\\SERVER\Share\Job\%1\Project" /grant "DOMAIN\Domain Admins":(CI)(OI)M
icacls  "\\SERVER\Share\Job\%1\Project" /grant "DOMAIN\SG_Project":(CI)(OI)M

不能100%知道它为什么能工作,但是可以!