---
title: "创建触发器 | OceanBase 文档中心"
description: 创建触发器 您可以使用 CREATE TRIGGER 语句创建触发器。 创建触发器的用户需要具备以下权限： 触发器关联的表的 SELECT 、 INSERT 、 UPDATE 、 DELETE 等权限。 触发器权限，即 CREATE TRIGGER 权限。 触发器激活后要执行的语句的权限。 语法 创建触发器的 SQL…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

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

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

# 创建触发器

更新时间：2024-08-02 09:57:24

您可以使用 `CREATE TRIGGER` 语句创建触发器。

创建触发器的用户需要具备以下权限：

- 触发器关联的表的 `SELECT`、`INSERT`、`UPDATE`、`DELETE` 等权限。
 - 触发器权限，即 `CREATE TRIGGER` 权限。
 - 触发器激活后要执行的语句的权限。

## 语法

创建触发器的 SQL 语法如下：

```sql
CREATE
    TRIGGER trigger_name
    trigger_time trigger_event
    ON tbl_name FOR EACH ROW
    trigger_body

trigger_time: { BEFORE | AFTER }

trigger_event: { INSERT | UPDATE | DELETE }

```

## 参数说明

| **参数** | **含义** |
| --- | --- |
| trigger_name | 触发器名称。同一个数据库下触发器名称必须唯一。 |
| trigger_time | `BEFORE` 或 `AFTER`，`BEFORE` 是指在执行触发事件之前激活当前所创建的触发器；`AFTER` 是指在执行触发事件之后激活当前所创建的触发器。 |
| trigger_event | `INSERT`、`UPDATE` 或 `DELETE` 表示激活触发器的操作类型。 |
| table_name | 表示建立触发器的表名。 |
| trigger_body | 触发执行的代码主体。可以是单行语句，也可以是多行命令。如果是多行命令，需要写在 `BEGIN ... END` 之间。可以通过 `OLD.columnName` 访问将要或已经被修改的原数据，`NEW.columnName` 用来表示将要或已经修改后的新数据。`LD.columnName` 是只读的，而 `NEW.columnName` 则可以在触发器中使用 `SET` 赋值。 |

## 示例

在表 `account` 上创建触发器 `trigger_account_insert`，在执行插入数据时，同时向表 `account_log` 插入数据。

```sql
obclient> CREATE TABLE account(id INT, name VARCHAR(20));
Query OK, 0 rows affected

obclient> CREATE TABLE account_log(id INT, action VARCHAR(20));
Query OK, 0 rows affected

obclient> DELIMITER /

obclient> CREATE TRIGGER trigger_account_insert BEFORE INSERT ON account FOR EACH ROW
  BEGIN
    INSERT INTO account_log VALUES(NEW.id, 'ADD');
END;/

obclient> DELIMITER ;

obclient> SELECT * FROM information_schema.triggers WHERE trigger_name = 'trigger_account_insert'\G;
*************************** 1. row ***************************
           TRIGGER_CATALOG: def
            TRIGGER_SCHEMA: chz
              TRIGGER_NAME: trigger_account_insert
        EVENT_MANIPULATION: INSERT
      EVENT_OBJECT_CATALOG: def
       EVENT_OBJECT_SCHEMA: chz
        EVENT_OBJECT_TABLE: account
              ACTION_ORDER: 0
          ACTION_CONDITION: NULL
          ACTION_STATEMENT: TRIGGER trigger_account_insert BEFORE INSERT ON account FOR EACH ROW
  BEGIN
    INSERT INTO account_log VALUES(NEW.id, 'ADD');
END
        ACTION_ORIENTATION: ROW
             ACTION_TIMING: BEFORE
ACTION_REFERENCE_OLD_TABLE: NULL
ACTION_REFERENCE_NEW_TABLE: NULL
  ACTION_REFERENCE_OLD_ROW: OLD
  ACTION_REFERENCE_NEW_ROW: NEW
                   CREATED: NULL
                  SQL_MODE: STRICT_ALL_TABLES,NO_ZERO_IN_DATE
                   DEFINER: 'chz'@'%'
      CHARACTER_SET_CLIENT: utf8mb4
      COLLATION_CONNECTION: utf8mb4
        DATABASE_COLLATION: gbk
1 row in set

obclient> INSERT account VALUES(1, 'name1');
Query OK, 1 row affected

obclient> SELECT * from account_log;
+------+--------+
| id   | action |
+------+--------+
|    1 | ADD    |
+------+--------+
1 row in set

```

## 使用限制

MySQL 模式的触发器有以下使用限制：

- 对于同一个表，不能有多个触发器具备相同的触发事件和触发动作的时间。
 - 只能在永久表上创建触发器，不能对临时表创建触发器。
 - 触发器不能使用 `CALL` 语句调用将数据返回给客户端或使用动态 SQL 的存储过程，但是允许存储过程或者函数通过 `OUT` 或者 IN`OUT` 类型的参数将数据返回触发器。
 - 触发器中不能使用开启或结束事务的语句段，例如，开始事务（`START TRANSACTION`）、提交事务（`COMMIT`）或回滚事务（`ROLLBACK`），但是可以回滚到一个保存点，即 Savepoint 是允许的，因为回滚到保存点不会结束事务。
 - 外键不会激活触发器。
 - 触发器中不允许返回值，因此触发器中不能有返回语句，如果需要立即停止一个触发器，则需要使用 `LEAVE` 语句。

 上一篇 下一篇 ![有帮助](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) 咨询热线
