2016-07-28 109 views
1

ストアドプロシージャ内からPowerShellファイルを実行するにはどうすればよいですか?ストアドプロシージャからPowerShellファイルを実行する方法

私はストアドプロシージャ内からPowerShellファイルを実行することはありませんでした。

exec xp_cmdshell 'powershell ""E:\PowershellScripts\todayErrorLog.ps1""' 

ストアドプロシージャを実行すると、ファイルに対するアクセスが拒否されます。私は、コマンドラインとエージェントジョブの両方で実行できるので、ps1ファイル自体が良いことを知っています。だから私は、ストアドプロシージャに十分な権限を与えることが重要だと考えています。

Access denied errors

以前、私はこのスクリプト私は、ストアドプロシージャからPowerShellスクリプトファイルを実行するために何をする必要があります他に何

-- To allow advanced options to be changed. 
EXEC sp_configure 'show advanced options', 1; 
GO 

-- To update the currently configured value for advanced options. 
RECONFIGURE; 
GO 

-- To enable the feature. 
EXEC sp_configure 'xp_cmdshell', 1; 
GO 

-- To update the currently configured value for this feature. 
RECONFIGURE; 
GO 

xp_cmdshellを有効にしてください作ったのですか?

これはストアドプロシージャです:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[RefreshErrorQuery] 
    -- No parameters  
AS 
BEGIN 
    SET NOCOUNT ON; 
    -- Step 1 
    exec xp_cmdshell 'powershell ""E:\PowershellScripts\todayErrorLog.ps1""' 

    -- Step 2: TODO: Run SSIS package 
END 
+1

あなたはストアドプロシージャ内から言及したSQLAgentジョブの実行だけと考えましたか?私はprocから直接powershellを実行しようとしたことはありませんが、proc内からエージェントジョブを実行しており、ここでは両方の例があります。 –

+1

これはすべてこのためです:http://stackoverflow.com/questions/38624228/trigger-stored-procedure-from-view-and-refresh-view-after-stored-procedure-compl。私のエージェントジョブをストアドプロシージャに変換して、MVCコントローラがプロセスがいつ終了したかを知ることができるようにすることを提案しました。 –

答えて

0

エージェントが使用しているアカウントに、ファイルにアクセスするための十分な権限を持っていないので、あなたの問題があります。

確認方法:

(1)あなたは (2)あなたは内からスクリプトを実行することはできませんコマンドラインからPSを実行することができますxp_cmdshellを (3)誰もがフルコントロールにファイルを含むフォルダを変更します (4)xp_cmdshellを使用してスクリプトを実行してみてください

また、テストのために、SQLエージェントが実行中のログインを自分の資格情報に変更することもできます。エージェントはコマンドラインで実行しているのと同じように "あなた"として実行されています。

+0

エージェントに問題はありません。そのとき私は問題があるストアドプロシージャでファイルを実行しようとします。 –

+0

エージェントはスケジュールされたジョブとして実行できます(SMS経由でインタラクティブに実行するのではなく)。 SMSを使用して対話形式でジョブを実行すると、エージェントの資格情報ではなくログイン資格情報が使用されます。 –

+0

私はそれをスケジュールされたジョブとして実行することができます - 基本的な問題は、MVCコントローラメソッドを使用してオンデマンドで実行し、ジョブが完了した後にビューを更新するエージェントジョブをトリガーすることです。私はジョブの代わりにストアドプロシージャを実行する必要があると言われており、ストアドプロシージャはジョブを非同期で実行し、完了したら通知しません。 –

関連する問題