首批通过分布式安全可靠测评,为关键业务系统打造
系统触发器
更新时间:2026-07-15 20:56:58
按照触发事件不同可以将系统触发器分为两大类,即 DDL 事件触发器和 Database 事件触发器,DDL 事件触发器是指通过执行DDL 触发的触发器,Database 事件触发器是指通过 Database 事件触发的触发器。logon 和 logoff 属于 Database 事件,所以这两种触发器属于 Database 事件触发器,分别在用户登录后和用户退出前进行触发。
功能适用性
该内容仅适用于 OceanBase 数据库 Oracle 模式。
说明
暂不支持在系统触发器中通过动态语句执行 DDL。
系统触发器语法
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级别触发器。 - 系统触发器可以创建在 schema(user)和 database 上,分别用于指定用户登录和所有用户登录时触发。可以通过
ON user_name.SCHEMA指定某个用户登录时触发,如果不指定user_name,默认创建触发器的用户登录时会触发。 - 每个系统触发器会独立开启事务,并独立进行提交。
- logon 触发器执行失败,会导致登录失败。logoff 触发器执行失败,不会导致退出失败。
- 如果正在登录的用户是触发器所有者或者拥有
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)
-- schema 级别 logon 触发器
obclient> CREATE or replace after_logon_trg after logon on user1.schema
begin
insert into logon_logoff_log values ('user1', 'logon', systimestamp);
end;
/
-- schema 级别 logoff 触发器
obclient> CREATE or replace before_logoff_trg before logoff on user1.schema
begin
insert into logon_logoff_log values ('user1', 'logoff', systimestamp);
end;
/
-- database 级别 logon 触发器
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;
/
-- database 级别 logoff 触发器
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;
/