PostgreSQL触发器介绍

注: 本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。

    触发器是在对指定表执行指定更改操作(SQL INSERT、UPDATE、DELETE 或 TRUNCATE 语句)时自动运行的一组操作。触发器对于强制执行业务规则、验证输入数据和保留审核跟踪等任务非常有用。

一、触发器介绍

1.1 触发器的用途:

  • 强制执行业务规则

  • 验证输入数据

  • 为不同文件中新插入的行生成唯一值。

  • 写入其他文件以进行审计跟踪

  • 从其他文件查询以进行交叉引用

  • 将数据复制到不同的文件,实现数据一致性

1.2 在业务中使用触发器的好处:

  • 加快应用程序开发速度。由于数据库存储触发器,因此不必将触发器操作编码到每个数据库应用程序中。

  • 业务规则的全局实施。定义触发器一次,然后将其重用于使用该数据库的任何应用程序。

  • 更易于维护。如果业务策略发生更改,则只需更改相应的触发程序,而不需要更改每个应用程序

  • 提高客户端/服务器环境中的性能。在结果返回之前,所有规则都在服务器上运行。

  • SQL 触发器的实现基于 SQL 标准。它支持大多数编程语言通用的构造。它支持局部变量的声明、控制过程流程的语句、将表达式结果分配给变量以及错误处理。

二、触发器语法

2.1 创建触发器

语法如下

图片

说明

图片

2.2 删除触发器

图片

2.3  触发器函数中的特殊变量

图片

三、示例

下面是触发函数的简单示例:

图片

现在,我们可以创建触发器,该触发器将在执行时触发关联表的触发器中指定的事件。

图片

    在上面的触发器函数中,有一个新的关键字“NEW”,它是触发器的 PostgreSQL 扩展。有两个 PostgreSQL 扩展可以触发“OLD”和“NEW”。OLD 和 NEW 不区分大小写。

  • 在触发器正文中,使用 OLD 和 NEW 关键字可以访问受触发器影响的行中的列

  • 在 INSERT 触发器中,只能使用NEW.col_name。

  • 在 UPDATE 触发器中,可以使用 OLD.col_name 在更新行之前引用行的列,NEW.col_name在更新行后引用行的列。

  • 在 DELETE 触发器中,只能使用OLD.col_name;没有新行。

    以 OLD 命名的列是只读的。您可以引用它(如果您具有 SELECT 权限),但不能修改它。如果您具有 SELECT 权限,则可以引用以 NEW 命名的列。在 BEFORE 触发器中,如果您具有 UPDATE 权限,则还可以使用 SET NEW.col_name = value 更改其值。这意味着您可以使用触发器来修改要插入到新行或用于更新行的值。

想了解更多Oracle相关的学习资料(技术文章和视频),可以微信公众号或B站搜索《云贝教育》,免费获取。顾问微:19941464235

### 创建和使用PostgreSQL触发器 #### 触发器概述 在PostgreSQL中,触发器是一种特殊的存储过程,它会在指定的表上发生某些事件(如`INSERT`、`UPDATE`或`DELETE`)时自动执行。这使得开发者能够在不影响应用程序逻辑的情况下实现复杂的业务规则。 #### 创建触发器的一般流程 为了创建一个触发器,通常先要定义一个函数作为触发动作体,该函数可以由PL/pgSQL或其他编程语言编写而成。之后再基于此函数建立相应的触发器对象[^3]。 ```sql -- 定义触发器函数 CREATE OR REPLACE FUNCTION example_function() RETURNS trigger AS $$ BEGIN -- 这里放置触发逻辑代码 END; $$ LANGUAGE plpgsql; -- 建立触发器 CREATE TRIGGER example_trigger BEFORE INSERT ON teaches FOR EACH ROW EXECUTE PROCEDURE example_function(); ``` 上述例子展示了如何构建一个名为`example_trigger`的触发器,在向`teaches`表插入新纪录之前调用`example_function()`来进行预处理工作[^4]。 对于更复杂的需求,比如想要跟踪数据库结构的变化,则可采用事件触发器的形式来捕捉DDL语句的发生时刻,进而完成诸如日志记录之类的任务[^2]。 #### 使用带有条件判断的触发器 有时候希望仅当满足一定条件下才激活触发行为,这时可以在触发器内部加入`IF`分支结构用于控制流走向: ```sql CREATE OR REPLACE FUNCTION conditional_update_func() RETURNS trigger AS $$ DECLARE old_value integer := OLD.value; -- 获取旧值 BEGIN IF NEW.value != old_value THEN -- 判断是否有变化 RAISE NOTICE 'Value changed from % to %', old_value, NEW.value; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER check_updates AFTER UPDATE OF value ON some_table FOR EACH ROW WHEN (OLD.* IS DISTINCT FROM NEW.*) EXECUTE PROCEDURE conditional_update_func(); ``` 这段脚本实现了每当`somme_table`里的某条记录被更新且其字段`value`确实发生了改变的时候发出通知消息的功能。 #### 实际应用场景举例 假设存在一张学生成绩单表格`score`,其中包含学生ID(`studentId`)及其对应的数学成绩(`math`)两列数据。现在希望通过设置触发器的方式确保每次有新的分数录入或是已有分数修改后都能及时同步到其他关联系统之中去[^5]。 ```sql CREATE TABLE score ( studentId INT PRIMARY KEY, math INT NOT NULL ); -- 插入初始测试数据... INSERT INTO score VALUES (1001,89),(1002,76); ``` 综上所述,通过合理运用PostgreSQL提供的强大而灵活的触发机制,能够极大地简化应用开发过程中涉及的数据一致性维护等工作量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值