e-learning、オラクル研修、LMS(学習管理システム)のiStudy

e-learning、オラクル研修、LMS(学習管理システム)のiStudy

第71回 「ログオントリガー」

2013.09.09

こんにちは。インストラクターの蓑島です。

ようやく秋の気配が漂ってきましたね。秋の爽やかさが待ち遠しいです。

さて、「その他のトリガー」というコンセプトで解説しております。
前回、前々回はDDLトリガーをご紹介しました。
DDLトリガーを使えば、オブジェクトのタイプに関係なく、CREATE、ALTER、DROPのタイミングで何かの処理を実行できるわけでしたね。
たとえば、DDLの履歴を記録したり、特定のオブジェクトのDROPを制限したりなど。

今回からはまた違ったトリガーとして、ログオントリガー、ログオフトリガーをご紹介します。
とても簡単なトリガーです。

では今回は、ログオントリガーです。
こちらは名前の通り、データベースにログオンしたときに起動するトリガーです。
トリガーの一般的な構文はすでに解説済みなので、さっそく以下の例で、ログオントリガー特有の部分を解説します。

SQL> show user
ユーザーは"SYSTEM"です。

1
2
3
4
5
6
7
8
9
10
REATE OR REPLACE TRIGGER LOGON_TRIG
AFTER LOGON  ON DATABASE
BEGIN
   IF  USER = 'SCOTT' AND TO_CHAR(SYSDATE, 'D' ) = 1 THEN
       RAISE_APPLICATION_ERROR(-20000, 'User SCOTT can not logon on Sunday!' );
   END IF;
END ;
/
 
トリガーが作成されました。

このトリガーは、SCOTTユーザが日曜日にログオンするとエラーを起こし、ログオンを失敗させるトリガーです。

まず、2行目ですが、「AFTER LOGON」のキーワードがログオントリガーであることを示します。
つまりログオンの直後に起動するトリガーです。
ちなみに、ログオントリガーで、BEFOREの指定はできませんので、「BEFORE LOGON」と記述するとコンパイルエラーとなります。

また2行目の「ON DATABASE」というキーワードですが、これは以前ご紹介したDDLトリガーの場合と同じく、すべてのユーザを対象とするということです。
ただし、SYSユーザは例外扱いとなっており、ログオントリガーは起動しません。
理由はログオントリガーでエラーになるとログオンが失敗するので、SYSユーザについては、そのようなことがないように、配慮されているからです。
なお次回以降に説明しますが、ログオントリガーでなく、ログオフトリガーの場合は、SYSユーザでも起動します。

また2行目の「ON DATABASE」を「ON SCHEMA」に変更すれば、このトリガーのスキーマユーザがログオンする場合にのみ起動するトリガーとなり、他のユーザがログオンしても起動することはありません。

3行目から7行目がこのトリガーの無名PL/SQLブロックの部分ですが、ここでは、ログオン時のチェックを行っています。
すなわち、ユーザがSCOTTで、かつ、本日が日曜日の場合(TO_CHAR(SYSDATE,'D') = 1)はユーザ定義のシステムエラー(RAISE_APPLICATION_ERROR)を発生させてログオンをエラーにしています。
すなわち特定の条件の時にログオンを不可能にするトリガーということになります。

このトリガーではログオンのためのチェック処理を行っているわけですが、トリガー内で表のデータを参照(SELECT)したり、更新(INSERT,UPDATE,DELETE)することも可能ですから、誰が、いつログオンしたのか、といった履歴情報を記録したり、そのユーザセッション用のなんらかのデータをそのユーザ用に初期化するといった処理も可能です。

では早速、このトリガーの働きを検証してみます。本日は日曜日なのですが、SCOTTユーザでログオンしてみます。

SQL> CONNECT SCOTT/tiger
ERROR:
ORA-00604: 再帰SQLレベル1でエラーが発生しました。
ORA-20000: User SCOTT can not login on Sunday!
ORA-06512: 行3

このように、トリガーの中で発生させているエラー「ORA-20000: User SCOTT can not login on Sunday!」によってログオンが失敗していますね。

警告: Oracleにはもう接続されていません。

このようにログオントリガーがエラーになるとログオンが失敗するので、ログオンを失敗させることが目的でない場合は、必要に応じて発生しうるエラーの例外処理が必要になる場合もあります。

いかがでしたか?大変簡単ですね。
先ほど述べたように、他の表を参照(SELECT)したり、更新(INSERT,UPDATE,DELETE)することもできますから応用範囲はとても広いです。

それでは今回はここまでにいたします。また次回、ご期待ください。

先頭へ戻る