2011-07-29 27 views
1

このプログラムはInformix 4GLを使用しています。目的は、レポートを削除することです。実際はうまくいきますが、特定のユーザーだけがレポートの物理ファイル(管理者を意味します)を削除できるという問題があります。他のユーザーはデータベース内のレポートを削除できますが、物理パスは削除できません。だから私は構文コマンドrm -fのエラーをキャッチする必要があります。 WHENEVER ERRORを使用しようとしましたが、それをキャッチできませんでした。誰もそれを行う方法を知っていますか?これは、レポートを削除するためのコードです:informixのキャッチエラー

DELETE FROM sysrpt 
WHERE srpt_seq_no = p_sysrpt.srpt_seq_no   
LET sel_rpt_id = ""  
LET sel_rpt_id = p_sysrpt.srpt_pgm_id CLIPPED, ".", 
        p_sysrpt.srpt_seq_no USING "<<<<<<" 
LET sel_rpt_id = sel_rpt_id CLIPPED  
LET prt_comand = "\\rm -f ", rpt_path CLIPPED, sel_rpt_id CLIPPED 
LET prt_comand = prt_comand CLIPPED        
RUN prt_comand             
+0

議論されている言語はInformix-4GLまたはI4GLです(または、あまりにも多くのサークルでは4GLだけですが、常にそう思われます)。 –

答えて

1

私はあなたがrmコマンドの一部として別のファイルに標準出力/標準エラー出力をリダイレクトしない限り、あなたは完全なエラーメッセージをキャプチャすることができるでしょうとは思いません。 RUN文のRETURNING節を使用すると、シェルコマンドからの戻りコードを4glプログラムに戻すことができます。あなたは「RUNのprt_command」の後に、次を追加することができます。

RUN prt_comand RETURNING p_return_code 

メモリから、私はあなたがMOD 256にリターンコードが必要と考えています。

+0

MOD 256を使用すると、実際に信号から抹消された場合、子プロセスが終了したシグナル番号が得られます。終了ステータスを取得するには、256で割ります。返される数値は 'wait()'システムコールのように16ビットの値です。 –

0

rm -fは、ファイルの削除に失敗した場合でも、ファイルが存在しない場合でも正常に戻ります。 rmにエラーを返すには、エラーを返さないように指示してはいけません。

そうでない場合は、使用するためのアドバイス:

RUN prt_command RETURNING p_retcode 

は正しいです。 p_retcodeの値がゼロでない場合、コマンドは何らかの方法で失敗しました。


以下コピーラインは不要である:

LET prt_comand = prt_comand CLIPPED 

prt_commandはCHAR変数である場合、格納された結果は再び空白埋めである(すべてのCHAR変数は、全長に空白埋め格納されています) 。 prt_commandがVARCHR変数の場合、CLIPPEDを使用した以前の割り当てでは、後続の空白がすでに削除されています。

rmコマンドの前にバックスラッシュを使用する理由はわかりません。エイリアスを避けていますか?もしそうなら、rmのエイリアスを取り除く時間。それは長期的には致命的です。 rawコマンドを正しく使用する方法を学んでください。エイリアスのないマシンに到達した場合、保護されず、エイリアスが提供するセーフティネットがなくてもコマンドを誤用します。

1

これは古典的なX-Y problemのように聞こえますが、実際の問題は最初に生成されたレポートのアクセス許可です。

レポートファイルは、他のユーザーが削除できるように生成後にchmod -edにするか、アプリユーザーが正しくumaskに設定する必要があります。

関連する問題