---
title: "系统触发器 - OceanBase 数据库 V4.2.5 | OceanBase 文档中心"
description: 系统触发器 按照触发事件不同可以将系统触发器分为两大类，即 DDL 事件触发器和 Database 事件触发器，DDL 事件触发器是指通过执行DDL 触发的触发器，Database 事件触发器是指通过 Database 事件触发的触发器。logon 和 logoff 属于 Database 事件，所以这两种触发器属于…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.2.5 LTS

# 系统触发器

更新时间：2026-07-15 20:56:58

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.2.5/zh-CN/700.reference/500.sql-reference/300.pl-reference/300.pl-oracle/800.trigger-oracle/800.system-trigger-oracle.md)  

按照触发事件不同可以将系统触发器分为两大类，即 DDL 事件触发器和 Database 事件触发器，DDL 事件触发器是指通过执行DDL 触发的触发器，Database 事件触发器是指通过 Database 事件触发的触发器。logon 和 logoff 属于 Database 事件，所以这两种触发器属于 Database 事件触发器，分别在用户登录后和用户退出前进行触发。

#### 功能适用性

该内容仅适用于 OceanBase 数据库 Oracle 模式。

#### 说明

暂不支持在系统触发器中通过动态语句执行 DDL。

## 系统触发器语法

```sql
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` 的权限，即使触发器执行失败，也可以登录成功。

## 示例

```sql
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;
/

```

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
