PostgreSql TRIGGER 触发器简单样例

1.创建测试表、视图

   CREATE TABLE COMPANY(  
       ID INT PRIMARY KEY NOT NULL,  
       NAME TEXT NOT NULL,  
       AGE INT NOT NULL,  
       ADDRESS CHAR(50),  
       SALARY REAL  
    );

   CREATE TABLE AUDIT_HIS(  
       EMP_ID INT NOT NULL,
       EMP_NAME TEXT NOT NULL,  
       ENTRY_DATE TEXT NOT NULL  
   );

   CREATE TABLE AUDIT(  
       EMP_ID INT NOT NULL,
       EMP_NAME TEXT NOT NULL,  
       ENTRY_DATE TEXT NOT NULL  
   );

   CREATE OR REPLACE VIEW "public"."company_view" AS 
   SELECT company.id,company.name,company.age
   FROM company;

 2.创建触发器函数

 CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $$  
        BEGIN  
            INSERT INTO AUDIT_HIS(EMP_ID,EMP_NAME,ENTRY_DATE) VALUES (OLD.ID,OLD.NAME,current_timestamp); 
            INSERT INTO AUDIT(EMP_ID,EMP_NAME,ENTRY_DATE) VALUES (NEW.ID,NEW.NAME,current_timestamp);   
        RETURN NULL;   
        END;  
    $$ LANGUAGE plpgsql;

注:

a.触发器函数是触发器触发时调用,函数返回的类型必须是TRIGGER ,且不能有任何参数

b.postgresql触发器函数中自带一些特殊变量:

  • NEW:数据类型是record,在insert、update操作触发时存储新的数据行
  • OLD:数据类型是record,在update、delete操作触发时存储旧的数据行
  • TG_OP:内容为“INSERT”,“UPDATE”,“DELETE”,“TRUNCATE”,用于指定DML语句类型
  • TG_TABLE_NAME:触发器所在表的表名称 TG_SCHEMA_NAME:触发器所在表的模式 

3.创建触发器

3.1表触发器

    CREATE TRIGGER example_trigger AFTER INSERT OR UPDATE ON COMPANY  
    FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();

3.2视图触发器

    CREATE TRIGGER company_view_trigger AFTER UPDATE ON company_view 
    EXECUTE PROCEDURE auditlogfunc();

注:视图触发器不支持行级,即 不能添加FOR EACH ROW

4.删除触发器

DROP TRIGGER example_trigger on COMPANY;

5.删除函数

drop function function_name (parameters_list);

6.查看所有触发器

SELECT * FROM pg_trigger;

 7.测试

INSERT INTO COMPANY VALUES(1, '小米科技', 8, '北京市朝阳区', 9999);
UPDATE COMPANY SET NAME ='阿里巴巴' WHERE ID ='1';

 

 

 

 

 

 

### 如何在 PostgreSQL 中创建触发器 #### 基本概念 PostgreSQL 提供了两种类型的触发器:表级触发器和事件触发器。表级触发器通常用于响应 `INSERT`、`UPDATE` 或 `DELETE` 操作,而事件触发器则针对特定的 DDL 事件。 --- #### 表级触发器的创建语法 以下是创建表级触发器的标准语法: ```sql CREATE TRIGGER trigger_name { BEFORE | AFTER | INSTEAD OF } { event } ON table_name [ FOR [ EACH ] { ROW | STATEMENT } ] EXECUTE FUNCTION function_name(); ``` - **trigger_name**: 触发器名称。 - **BEFORE/AFTER/INSTEAD OF**: 定义触发器执行的时间点。 - **event**: 可以为 `INSERT`, `UPDATE`, `DELETE` 或其组合。 - **table_name**: 被监控的表名。 - **FOR EACH ROW/STATEMENT**: 指定触发器是在每一行上还是整个语句结束后执行。 - **function_name**: 触发器关联的函数名称。 示: 假设我们希望在向 `teaches` 表插入新记录之前验证某些条件,则可以定义如下触发器[^1]: ```sql CREATE OR REPLACE FUNCTION example_function() RETURNS TRIGGER AS $$ BEGIN -- 这里可以编写逻辑来处理 NEW 数据 RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER example_trigger BEFORE INSERT ON teaches FOR EACH ROW EXECUTE FUNCTION example_function(); ``` 在此上下文中,`NEW` 是一个特殊的关键字,表示即将插入的新行数据[^2]。 --- #### 事件触发器的创建语法 对于更高级的需求,如拦截或记录 DDL 操作,可以使用事件触发器。以下是其标准语法: ```sql CREATE EVENT TRIGGER trigger_name ON { ddl_command_start | ddl_command_end | sql_drop } [ WHEN condition_elements ] EXECUTE FUNCTION function_name(); ``` - **trigger_name**: 触发器名称。 - **ON**: 指定监听的事件类型 (`ddl_command_start`, `ddl_command_end`, 或 `sql_drop`)。 - **condition_elements**: (可选)进一步过滤满足条件的操作。 - **function_name**: 关联的触发器函数。 示: 如果需要阻止任何用户删除数据库中的视图,可以设置以下事件触发器[^5]: ```sql CREATE OR REPLACE FUNCTION prevent_view_drops() RETURNS event_trigger AS $$ DECLARE obj record; BEGIN FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects() LOOP IF obj.object_type = 'view' THEN RAISE EXCEPTION 'Dropping views is not allowed!'; END IF; END LOOP; END; $$ LANGUAGE plpgsql; CREATE EVENT TRIGGER no_view_drops ON sql_drop EXECUTE FUNCTION prevent_view_drops(); ``` 此代码通过捕获 `sql_drop` 事件并检查目标对象是否为视图,在必要时抛出异常以防止操作完成。 --- #### 使用场景总结 PostgreSQL触发器功能广泛应用于多种实际需求中,包括但不限于以下方面[^3]: - 输入数据的有效性校验。 - 实现复杂的业务规则。 - 自动生成唯一标识符或其他派生字段。 - 记录变更日志以便后续审计。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值