dポイントプレゼントキャンペーン実施中!

現在、Windows XP Pro、SQL Server2005 Developer Editionで開発を行っています。
行いたいことは、DMLトリガによって入力画面のあるプログラム(例えばメモ帳など)を実行したいと思っているのですが、下記のサイトで調べた結果、xp_cmdshellではできそうもありません。
そこで、どうにかして入力画面のあるプログラムを実行したいと思っているのですが、なかなか見つからず困っています。
(セキュリティに関しては、無問題とします。)

SQL Server 2005でこのようなプログラムを作成できますか?
また、どのようにすれば良いでしょうか?
具体的なソース、参考サイト等ありましたら、教えてください。
よろしくお願いします。

参考サイト:http://support.microsoft.com/kb/323411/ja

A 回答 (4件)

本来の質問からは相当乖離しているような気がしてきましたが。


コンソールアプリケーションはその環境であれば動くはずです。
ファイルの書き出し先をマイドキュメントにしているようですが、C:\Tempなど普通のフォルダを指定して試してみてください。

SQL Serverがxp_cmdshellを実行するとき、質問者さんのユーザIDの権限で実行すると思っていませんか?
何も考えないでインストールしたのだったら、おそらくローカルシステムアカウントで実行されます。そのフォルダにアクセスする権限がなければファイルは書き出せません。

#念のため、ちなみに書かれていたものをコピペして、フォルダを変更してコンソールアプリケーションにして実行してみたら、ファイルは書き出されました。
    • good
    • 0
この回答へのお礼

jamshid6様
当初の質問からかなりずれてしまったにも拘らずご丁寧なアドバイスをありがとうございました。
おっしゃったとおり、フォルダの権限がなかったために書き込まれていないだけでした。
これからはもう少し調べて、どうしても分からなかったら質問しようと思います。
本当に長い間お世話になりました。ありがとうござます。

お礼日時:2008/08/19 13:22

サーバ処理とクライアント処理は別物だと思ってください。



SQL Serverでxp_cmdshellを実行させるということは、当然SQL Serverのあるサーバで処理が走ることになりますから、サーバのローカルドライブを見にいきます。
質問者さんはSQL Serverに接続して実行の指示をしているだけに等しいのです。

やはりEXEは了承を得てサーバに置くか、クライアント処理させたければSQL Serverにやらせるのはあきらめた方がいいです。

そもそもアプローチ的に変なので以下は余談として見てほしいのですが、SQL Serverのあるサーバが質問者さんの端末にドライブマップしてネットワーク経由でexeを叩いたとすれば、そのexeは動くと思います。
しかし、モジュールがどこにあろうが実行はサーバで行われます。
質問者さんのexeがサーバで正常に動くことが確認できていない状態でそれを試すのはやめた方がいいと思いますよ。ハングしてもサーバにアクセスできないんですよね?
    • good
    • 0
この回答へのお礼

大変失礼しました。
自分のPCにもDBが作れることを知らなかったので、サーバ処理でストアドを作っていましたが、自分のPCにもDBを作って再度試してみまた。
jamshid6様のおっしゃるEXEファイルをPCに置くことでストアドの処理自体は正常に終了したとでます。(メッセージにSuccess)
しかし、肝心のProgram.exeが動いてないようなのです。
Program.exeはVB2005のコンソールアプリケーションとして作成し、下記のようなコードを適当に作ってみました。(VSの方で実行し正しく動くことを確認)

Module Module1

Sub Main()

Dim FileName As String = "C:\Documents and Settings\***\My Documents\SutoadoTest.CSV"
Dim Code As String = "Shift-JIS"
Dim Message As String = "テステス"
Dim Num As Integer = 1234567890
Dim Join As String
Dim Writer As IO.StreamWriter
Dim Encode As System.Text.Encoding

Join = Message & "," & Num
Encode = System.Text.Encoding.GetEncoding(Code)

Writer = New IO.StreamWriter(FileName, true, Encode)
Writer.WriteLine(Join)
Writer.Close()

End Sub

End Module

入力画面等のないアプリケーションなら動くかと思っていたのですが、コンソールアプリケーションでも動かないのでしょうか?
もし、動かないのでしたら、いったい何なら動くのでしょうか?
度々質問ばかりで申し訳ありません。
よろしくお願いいたします。

お礼日時:2008/08/19 11:16

Developer Editionということなので、ローカル接続でやっているのかと思っていましたが、もしかしてリモート接続(SQL Serverは別のPCかサーバにある)ですか?


そのメッセージは、通常その場所にExeがないときに返されます。
SQL Serverの動いているPCかサーバに「Program.exe」を置いていますか?
    • good
    • 1
この回答へのお礼

説明不足ですみません。
SQL Serverは別のサーバにあります。
デスクトップPCの方で、VB2005でProgram.exeを作りCドライブ直下に置きました。
もしかして、ストアドでC:\Program.exeとするとサーバの方のCドライブを見てしまうのでしょうか…?
現在、研修の関係でサーバの中身を見ることが出来ないのですが、ストアドの実行をデスクトップPCの方のCドライブにすることはできないのでしょうか?
また、作ったexeファイルの出力先もCドライブ直下にしたのですが、これもサーバ側のCドライブになってしまうのでしょうか?
何度も質問ばかりして申し訳ございません。

お礼日時:2008/08/18 16:44

>DMLトリガによって入力画面のあるプログラム(例えばメモ帳など)を実行したい


そこまで考える人がいるとはちょっと感動しました。

結論からいくとできないと思います。
・SQL Serverから直接他のプログラムを起動する方法はxp_cmdshellとCLRだけですが、いずれもInteractiveな動きはサポートしないようです。xp_cmdshellだとプロセスをKillするまで永遠に待ちに入ってしまいます。CLRでも試してみましたが、NOTEPAD.exeを起動して正常終了はしますが、なにぶん起動しているのがSQL Serverなので自分の画面には帰ってきません。これは偽装しても同じ結果でした(結局、タスクマネージャからKillするしかないのですが)

それ以前の問題として、
・リモートのSQL Serverではそもそもできないアプローチです。
・更新処理というのはトリガも含めて正常終了したときに初めてCommitがかかるものなので、DMLトリガにこのようなものを仕込むとおそらくトランザクションがロックされてしまうでしょう。

所詮SQL Serverもデータベースですので、この仕組みは更新処理を掛けるアプリケーション側で実装するようお勧めしておきます。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
やはり、出来ませんか・・・。

これとはまた別の質問になってしまうのですが、PDFを出力するEXEファイル(VB2005で作成)をxp_cmdshellで実行することはできますか?
このEXEには入力画面はなくフォームロードに出力をして閉じています。
SQL Serverからストアドプロシージャを通して実行してみたのですがエラーがでてきてしまって、どうしたらいいのか困っています。
EXEファイルは正常に実行できますので、問題はストアドのほうだと思うのですが、よくわかりません。
下記にストアドのソースを載せるので、見てもらえないでしょうか?

ALTER PROCEDURE [dbo].[OUTSIDE_PROGRAM]

AS
BEGIN

DECLARE @result int

EXEC @result = master.dbo.xp_cmdshell 'C:\Program.exe'
IF (@result = 0)
PRINT 'Success'
ELSE
PRINT 'Failure'

RETURN @result

END

これを実行すると、結果欄には
1 'C:\Program.exe' は、内部コマンドまたは外部コマンド、
2 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
3 NULL
と表示されてしまい、EXEが実行されていませんでした。

ただ、手動でコマンドプロンプトを開き、C:\Program.exeを実行すると
しっかり動いています。

お礼日時:2008/08/18 15:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す