V5R3 からの新しいデータベース機能として、INSTEAD OF トリガーというものがあります。
これはビューに定義するトリガーで、BEFORE だったり AFTER ではなく、まさしく"代わり"に処理を実行するトリガーになっています。
機能の概略の紹介や、前提となる PTF、例などはこちらに載っています。
今回は、上記サイトにある例を参考にして実際にやってみました。
今回の例は、以前紹介したカラムの暗号化機能と組み合わせたものです。
若干ありきたり気味ではあるかもしれませんが、パスワードを持つファイルにパスワードを暗号化して格納し、(もちろん権限は考慮して) 認可のある人にはパスワードを文字列にして表示するビューを提供する、というのが想定されている要件です。
まず、最終的にデータが格納されるテーブルを定義します。
暗号化されたものを格納するために、FOR BIT DATA がカラムの属性として指定されています。
CREATE TABLE LOG/L1
(U CHAR (10 ) NOT NULL WITH DEFAULT,
P CHAR (20) FOR BIT DATA NOT NULL WITH DEFAULT)
暗号化されたカラムを文字列に復号化するビューを作成します。
DECRYPT_xxx 関数でパスワードを指定していないので、環境変数 ENCRYPT_PASSWORD
がセットされていることが前提になっています。(前の記事にも書いてありますね)
また、INSTEAD OF トリガーは、このビューに対して定義されます。
CREATE VIEW LOG/V1 (U, DP) AS
SELECT U, DECRYPT_CHAR(P) FROM LOG/L1
INSTEAD OF トリガーの作成です。
あんまり難しいことはないですね。SQL トリガーについては起動タイミングやモードについての記事があるので参考にしてみてください。
トリガーはビューに対して定義していますが、実際の INSERT はテーブルに対して行っています。
CREATE TRIGGER LOG/T1
INSTEAD OF INSERT ON LOG/V1
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
INSERT INTO LOG/L1 VALUES(N.U, ENCRYPT(N.DP))
6文字以上の任意の文字を暗号化のためのパスワードとします。
SET ENCRYPTION PASSWORD = 'SPY007'
実際の実行例を順を追って見ていきましょう。
わかりやすくするため、最初にスキーマを作成しています。

テーブルの作成です。

ビューを定義しています。

トリガーを作成しています。
トリガーについては F4 キーによるプロンプトはサポートされません。面倒でも一字一字入力します。まぁ、他のプラットフォームではこうやって面倒に入力するのが当たり前のことなのですが
...... プロンプト機能の有難みを感じますねぇ。

環境変数 ENCRYPTION_PASSWORD を定義します。

実行されると、この環境変数も非表示になります。

これで準備は完了です。
実際に文字と、暗号化される文字を INSERT してみましょう。

格納元のテーブルの内容を見てみましょう。

ちゃんと暗号化されていることがわかりますね。

復号化して表示されるビューで内容の確認をしてみましょう。

ちゃんとただしく復号化されて文字として表示されるのが確認できますね。

|
|