[ Oracle PL/SQL ] 行レベル BEFORE トリガー ( SQLを書き換える )

Pocket

消費税法が施行された 1989年(平成元年)4月1日から月日が経過し、3%だった税率は 5%、8% を経てそろそろ 10% かと騒がれている今日この頃です。ここでは、消費税を例にユーザが発行した SQL の値を書き換えてテーブルにレコードを挿入、更新する PL/SQL のサンプルを掲載しています。

スポンサーリンク

行レベル BEFORE トリガーサンプル

行レベルのBEFOREトリガーを作成し INSERT や UPDATE する値を書き換えるサンプルになります。 サンプルで使用するテーブル ( test_table ) には、KINGAKU と TAX の NUMBER 型の2列があるものとします。

CREATE OR REPLACE TRIGGER test_trigger
BEFORE INSERT OR UPDATE ON test_table -- test_table に insert および update 文が発行される前
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW                          -- 行トリガー  
BEGIN

  /*
   * 後述の実行結果では、サンプル1またはサンプル2のみを処理した結果となっています
   */
  /*
   * サンプル1
   * 列:KINGAKUの消費税(5%)を、列:TAXに入れる場合
   */
  :NEW.TAX := :NEW.KINGAKU * 0.05;

  /*
   * サンプル2
   * 列:KINGAKUの値に消費税を加算する場合
   */
  :NEW.KINGAKU := :NEW.KINGAKU * 1.05;
END;
/

実行結果は以下のとおり。いずれも事前に test_table にレコードが存在しない状態で 実行したものになります。

サンプル1の実行結果

この動作結果から思いついたのですが、列ごとにクラスのようなアクセスレベルのような機能もあってもよさそうだなと思いました。ユーザー毎に列Aは public で 列B は private みたいな感じでしょうか。このサンプルで言うと 列 tax は private みたいなイメージです。

追記:public や private のような設定はないですが、ビューを使ったアクセス制御や仮想プライベートデータベース(VPD) なるもので制御は出来るようです。浅い知識の思いつきでした。失礼しました。

参考:データベース・セキュリティの実装 第1回 アクセスコントロールと権限管理

insert into test_table(kingaku) values(100);

/*
 * kingaku        tax
 *-------------------------------
 *   100            5
 */

update test_table set kingaku = 200;

/*
 * kingaku        tax
 *-------------------------------
 *   200           10
 */

サンプル2の実行結果

insert into test_table(kingaku) values(100);

/*
 * kingaku        tax
 *-------------------------------
 *   105            
 */

update test_table set kingaku = 200;

/*
 * kingaku        tax
 *-------------------------------
 *   210          
 */
参考
スポンサーリンク


Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>