データベースのオープンを毎回捕捉して外部プログラムで処理を行わせることが、V5R3 からできるようになりました。PTF を適用することで V5R2 でも同機能がサポートされるようになっています。
QIBM_QDB_OPEN という出口点 (= Exit ポイント) があり、ここに出口プログラムを登録することでデータベースのオープン毎に行いたい処理を実行させることができる、という仕組みになっています。
今回は V5R2 のマシンで実行しました。
V5R2 で SI17353 と SI17578 を適用すると、WRKREGINF の画面で QIBM_QDB_OPEN
という Exit ポイントが増えるのが以下の二つの画面からわかります。
PTF 適用前の WRKREGINF コマンドの出力画面です。

PTF 適用後の WRKREGINF コマンドの出力画面です。

監査やログなどが、まずは思いつく代表的な使用方法でしょうか。
今回は、DBA の人 ("DBA"という名のユーザープロファイル、ということにしてあります) 以外はあるファイルを削除することはできないようにする、というのをこちらのサイトのプログラムを参考にして作ってみました。
今回のプログラムは ILE/RPG です。

内容はこんなかんじです。
仕様の詳細はこちらを参考にしてください。



コンパイルします。

コンパイルできたプログラムを WRKREGINF コマンドを使って登録します。

上の画面でオプション 8 を入れるとこんな画面になります。

さらにこんな画面になります。

登録完了後の画面です。

DBA 以外の人 ("DBA"というユーザー以外のユーザー) が該当ファイルの DELETE を行おうとすると、こんなかんじのメッセージが出てきます。

ジョブログを見ると ......
![]()
理由がちゃんとわかるようになっています。
これで出口プログラムがちゃんと登録されて動いていることもわかりますね。

上記の詳細メッセージです。

"DBA" というユーザーで DELETE を行うと、ちゃんと完了します。
こちらのジョブログには特別なメッセージは送られません。

上記テストに使った出口プログラムのソースはこちらです。
Dreturn_cd S 10I 0
Dds_parm DS
D header_size 10I 0
D format 8
D offset 10I 0
D number_of_file 10I 0
D length_of_elem 10I 0
D job 10
D usrprf 10
D jobnbr 6
D cur_usrprf 10
D reserved 1024
Delement DS qualified
D file 10
D library 10
D member 10
D filler 2
D file_type 10I 0
D base_pf 10I 0
D read n
D write n
D update n
D delete n
D i S 10I 0
C *entry plist
C parm ds_parm
C parm return_cd
/free
offset += 1;
FOR i = 1 to number_of_file;
element = %subst(ds_parm : offset : length_of_elem);
IF element.file = 'L1'
and element.library = 'LOG'
and element.delete = *on
and cur_usrprf <> 'DBA';
return_cd = 0;
return;
ELSE;
offset += length_of_elem;
ENDIF;
ENDFOR;
*inlr = *on;
/end-free
|
|
|