トリガーイベントの違いにより、システムトリガーは大きく二つのカテゴリに分類されます。すなわち、DDLイベントトリガーとデータベースイベントトリガーです。DDLイベントトリガーとは、DDLの実行によってトリガーされるトリガーを指し、データベースイベントトリガーとは、データベースイベントによってトリガーされるトリガーを指します。ログオンとログオフはデータベースイベントに属するため、これら二種類のトリガーはデータベースイベントトリガーに含まれ、それぞれユーザーのログイン後とユーザーのログアウト前にトリガーされます。
適用対象
この内容はOceanBaseデータベースのOracleモードにのみ適用されます。
説明
現時点では、システムトリガー内で動的ステートメントを使用してDDLを実行することはサポートされていません。
OceanBaseデータベースV4.3.5 BP2以降のバージョンでは、スタンバイデータベースはシステムトリガーをトリガーしません。
システムトリガー構文
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER }
{LOGON | LOGOFF}
ON {[schema_name.]SCHEMA | DATABASE}
[{ FOLLOWS | PRECEDES } other_trigger_name]
[WHEN condition]
[ENABLE | DISABLE]
trigger_body;
システムトリガーの使用ルール
after logonおよびbefore logoffトリガーのみを作成でき、before logonおよびafter logoffトリガーは作成できません。- システムトリガーの名前を変更することはできません。
SYS SCHEMAにトリガーを作成することはできません。- ユーザーのログオンまたはログオフ時に
SCHEMAレベルとDATABASEレベルの両方のトリガーが存在する場合、まずSCHEMAレベルのトリガーが実行され、次にDATABASEレベルのトリガーが実行されます。 - システムトリガーはスキーマ(ユーザー)およびデータベースに作成でき、それぞれユーザーのログオン時およびすべてのユーザーのログオン時に実行されるように指定できます。
ON user_name.SCHEMAを使用して特定のユーザーのログオン時にトリガーを実行するように指定できます。user_nameを指定しない場合、デフォルトではトリガーを作成したユーザーのログオン時にトリガーが実行されます。 - 各システムトリガーは独立してトランザクションを開始し、独立してコミットします。
- ログオントリガーの実行に失敗すると、ログオンに失敗します。ログオフトリガーの実行に失敗しても、ログオフに失敗することはありません。
- ログイン中のユーザーがトリガーの所有者であるか、
ALTER ANY TRIGGER権限を持っている場合、トリガーの実行に失敗してもログインに成功します。
例
obclient> CREATE TABLE logon_logoff_log
(user_name varchar2(100), action varchar2(10), time timestamp);
Query OK, 0 rows affected (0.132 sec)
-- スキーマレベルのログオントリガー
obclient> CREATE or replace after_logon_trg after logon on user1.schema
begin
insert into logon_logoff_log values ('user1', 'logon', systimestamp);
end;
/
-- スキーマレベルのログオフトリガー
obclient> CREATE or replace before_logoff_trg before logoff on user1.schema
begin
insert into logon_logoff_log values ('user1', 'logoff', systimestamp);
end;
/
-- データベースレベルのログオントリガー
obclient> CREATE or replace after_logon_db_trg after logon on database
when (ora_login_user() in ('user1', 'user2', 'user3'))
begin
insert into logon_logoff_log values (ora_login_user(), 'logon', systimestamp);
end;
/
-- データベースレベルのログオフトリガー
obclient> CREATE or replace before_logoff_db_trg before logoff on database
when (ora_login_user() in ('user1', 'user2', 'user3'))
begin
insert into logon_logoff_log values (ora_login_user(), 'logoff', systimestamp);
end;
/