
# 触发器（Trigger）
#### 简介
触发器是一种特殊的函数，当某个数据变更事件（INSERT、UPDATE、DELETE 或者 TRUNCATE）或者数据库事件（DDL语句）发生时自动执行，而不是由用户或者应用程序进行调用。
表1表和视图上支持的触发器种类 
| 触发时机       | 触发事件                 | 行级  | 语句级  |
|:---|:---|:---|:---|
| BEFORE     | INSERT/UPDATE/DELETE | 表   | 表和视图 |
| BEFORE     | TRUNCATE             | 不支持 | 表    |
| AFTER      | INSERT/UPDATE/DELETE | 表   | 表和视图 |
| AFTER      | TRUNCATE             | 不支持 | 表    |
| INSTEAD OF | INSERT/UPDATE/DELETE | 视图  | 不支持  |
| INSTEAD OF | 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);
  NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'emp_id' as the distribution column by default.
  HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
  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 17:19:54.70118+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 ;
  ALTER TABLE
  ```
  
- **查看触发器**
  视图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
  ```
  
 
