1.创建触发器

1.1创建触发器时需要给出四条信息:

  1. 唯一的触发器名;
  2. 触发器关联的表
  3. 触发器应该相应的活动(DELETE,INSERT,UPDATE)
  4. 触发器何时执行(处理前或处理后)

    1.2可选条件:

  • FOR EACH ROW 当操作修改时每行调用一次;
  • FOR EACH STATEMENT,不管修改了多少行,每个语句标记的触发器执行一次。

    1.3 触发器何时执行

    BEFORE 和 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作

    1.4语法

    1. CREATE TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name
    2. ON table_name
    3. [
    4. -- 触发器逻辑....
    5. ];
    6. --event_name 可以是在所提到的表 table_name 上的 INSERTDELETE UPDATE 数据库操作。

    1.4.1 INSERT 触发器

    ```sql —创建一个comany表演示 CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL )

    OK 时间: 0.095s

—创建一个名为 audit的新表用于审计,当company表中有一个新的记录项时,日志消息将被插入其中 CREATE TABLE AUDIT( EMP_ID INT NOT NULL, ENTRY_DATE TEXT NOT NULL )

OK 时间: 0.064s

—创建TRIGGER CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY FOR EACH ROW EXECUTE PROCEDURE auditlogfunc()

错误: 函数 auditlogfunc() 不存在 — 报错了 时间: 0.062s

—创建函数 auditlogfunc() 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

Affected rows: 0 时间: 0.13s

—重新创建TRIGGER CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY FOR EACH ROW EXECUTE PROCEDURE auditlogfunc()

Affected rows: 0 时间: 0.006s

—插入数据测试 INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, ‘Paul’, 32, ‘California’, 20000.00 )

Affected rows: 1 时间: 0.043s

—查看audit表中是否生成了数据 runoobdb=# SELECT * FROM audit; emp_id | entry_date ————+———————————————- 1 | 2022-06-29 17:36:32.396313+08 (1 行记录) ```