プリントスタック TOKYO

データベースとセキュリティの世界から離れて早数年。過去の記憶を探しています。

AFTER トリガーと BEFORE トリガー

Oracle データベースで AFTER トリガーと BEFORE トリガーによるログオンとログオフの記録をテーブルに格納する方法を紹介します。なお、ここで紹介する方法は、簡単なものしか紹介していませんが、Oracle のマニュアルにある「イベント属性」などを組み合わせて精度の高いものを作成することもできます。

記録用の表を作成
まず、ユーザーのログオンやログオフを記録していくための表を作成します。ここでは、SCOTT スキーマを対象に記載していきます。

SQL> CREATE TABLE users_log (user_name VARCHAR2(30), activity VARCHAR2(20), event_date TIMESTAMP);

ログオン・トリガーの作成
SCOTT スキーマに接続すると、このトリガーによりLOGONイベント・レコードが users_log 表に挿入されます。これはAFTERトリガーで命令します。

CREATE OR REPLACE TRIGGER users_logon_trigger
AFTER LOGON
ON SCOTT.SCHEMA
BEGIN
INSERT INTO users_log VALUES (USER, 'LOGON', CURRENT_TIMESTAMP);
END;
/

ログオフ・トリガーの作成
SCOTT スキーマへの接続が切断されると、ログオフした情報が users_log 表に挿入されます。これはBEFOREトリガーで命令します。

SQL> CREATE OR REPLACE TRIGGER users_logoff_trigger
BEFORE LOGOFF
ON SCOTT.SCHEMA
BEGIN
INSERT INTO users_log VALUES (USER, 'LOGOFF', CURRENT_TIMESTAMP);
END;
/

記録内容の確認
一度、SCOTT ユーザーでログオン/ログオフした後に users_log 表を参照します。

SQL> SELECT * FROM scott_users_log;

USER_NAME ACTIVITY EVENT_DATE
------------------------------ -------------------- ------------------------------
SCOTT LOGON 09-08-25 16:02:30.125000
SCOTT