更新时间:2025-09-19 GMT+08:00
分享

触发器(Trigger)

简介

触发器是一种特殊的函数,当某个数据变更事件(INSERT、UPDATE、DELETE 或者 TRUNCATE)或者数据库事件(DDL语句)发生时自动执行,而不是由用户或者应用程序进行调用。

表1 表和视图上支持的触发器种类

触发时机

触发事件

行级

语句级

BEFORE

INSERT/UPDATE/DELETE

表和视图

TRUNCATE

不支持

AFTER

INSERT/UPDATE/DELETE

表和视图

TRUNCATE

不支持

INSTEAD OF

INSERT/UPDATE/DELETE

视图

不支持

TRUNCATE

不支持

不支持

管理触发器

  • 创建触发器
    --创建COMPANY表。
    gaussdb=# CREATE TABLE COMPANY(
       ID INT PRIMARY KEY     NOT NULL,
       NAME           TEXT    NOT NULL,
       AGE            INT     NOT NULL,
       ADDRESS        CHAR(50),
       SALARY         REAL);
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "company_pkey" for table "company"
    CREATE TABLE
    
    --创建AUDIT表。
    gaussdb=# CREATE TABLE AUDIT(
       EMP_ID INT NOT NULL,
       ENTRY_DATE TEXT NOT NULL);
    CREATE TABLE
    
    --使用CREATE FUNCTION语句创建一个触发器函数。
    gaussdb=#  CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$
       BEGIN
          INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp);
          RETURN NEW;
       END;
    $example_table$ LANGUAGE plpgsql;
    CREATE FUNCTION
    
    --使用CREATE TRIGGER语句将该函数与表进行关联。
    gaussdb=# CREATE TRIGGER example_trigger AFTER INSERT ON company FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();
    CREATE TRIGGER
    
    --向company表中插入数据。
    gaussdb=# INSERT INTO company (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, '张三', 32, '济南', 20000.00 );
    INSERT 0 1
    
    --查看audit表数据。
    gaussdb=# SELECT * FROM audit;
     emp_id |          entry_date           
    --------+-------------------------------
          1 | 2024-12-09 11:25:55.992644+08
    (1 row)
  • 修改触发器
    GaussDB提供了ALTER TRIGGER 语句,用于修改触发器。
    --修改触发器的名称。
    gaussdb=# ALTER TRIGGER example_trigger ON company RENAME TO example_trigger1;
    ALTER TRIGGER

    默认创建的触发器处于启用状态,可以使用以下语句禁用或者启用某个触发器。

    --触发器的禁用。
    gaussdb=# ALTER TABLE company DISABLE TRIGGER example_trigger1;
    ALTER TABLE
    
    --向company表中插入数据,查看audit表。
    gaussdb=# INSERT INTO company (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2, '李四', 30, '安徽', 30000.00 );
    INSERT 0 1
    
    gaussdb=# SELECT * FROM audit;
     emp_id |          entry_date           
    --------+-------------------------------
          1 | 2024-12-09 11:25:55.992644+08
    (1 row)
    
    
    --触发器的启用。
    gaussdb=# ALTER TABLE company ENABLE TRIGGER example_trigger1 ;
  • 查看触发器
    视图information_schema.triggers中存储了关于触发器的信息。
    --使用如下元命令使查询结果竖行回显。
    gaussdb=# \x
    Expanded display is on.
    
    gaussdb=# SELECT * FROM information_schema.triggers WHERE trigger_name = 'example_trigger1';
    -[ RECORD 1 ]--------------+---------------------------------
    trigger_catalog            | postgres
    trigger_schema             | public
    trigger_name               | example_trigger1
    event_manipulation         | INSERT
    event_object_catalog       | postgres
    event_object_schema        | public
    event_object_table         | company
    action_order               | 
    action_condition           | 
    action_statement           | EXECUTE PROCEDURE auditlogfunc()
    action_orientation         | ROW
    action_timing              | AFTER
    action_reference_old_table | 
    action_reference_new_table | 
    action_reference_old_row   | 
    action_reference_new_row   | 
    created                    | 
    
    gaussdb=# \x
    Expanded display is off.
  • 删除触发器
    gaussdb=# DROP TRIGGER example_trigger1 ON company;
    DROP TRIGGER
    
    --删除表。
    gaussdb=# DROP TABLE company;
    DROP TABLE
    gaussdb=# DROP TABLE audit;
    DROP TABLE

相关文档