ストアド プロシージャから呼び出すとバッチ ファイルが完全に機能しないという奇妙な問題が発生していますが、手動で実行するとすべて正常に機能します。
バッチ ファイルはいくつかのディレクトリを作成し、次のようにアクセス許可を設定します。
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 という名前のフォルダーが作成され、サブフォルダー (Material、Costs、Project) が作成され、すべて適切な権限が設定されます。
その後、SQL がストアド プロシージャを起動すると、バッチ ファイルが実行され、「変数」フォルダーとそのサブフォルダーが作成されますが、アクセス許可は適用されません。
言及する価値のあるいくつかのこと:
- \\SERVER\Share (共有レベルと NTFS レベルの両方) で SQL サーバー オブジェクトにフル コントロールを与えました。
- バッチ ファイルは SQL サーバーに対してローカルです
ストアド プロシージャが十分に高い特権で実行されていないように感じますが、それを変更する方法がわかりません。