PostgreSQL 创建触发器

17 Mar 2025 | 6 分钟阅读

在本节中,我们将了解触发器函数的工作原理、触发器函数的创建、PostgreSQL 创建触发器以及Create Trigger 命令的示例

什么是触发器函数?

触发器函数类似于一致的用户定义函数。但触发器函数可以返回类型为 trigger 的值,并且不接受任何参数。

创建触发器函数的语法

创建触发器函数的语法如下

注意:我们可以通过 PostgreSQL 支持的任何语言生成触发器函数。

触发器函数可以通过称为触发器数据的特殊结构接受有关其调用环境的数据,该结构保存一组局部变量。

例如,在触发事件之前或之后,OLD 和 NEW 表示表中行的状态。

PostgreSQL 还允许我们使用其他局部变量,这些变量以 TG_ 为前缀,例如 TG_WHENTG_TABLE_NAME。

如果我们指定触发器函数,我们可以修复各种触发事件,例如 INSERTDELETEUpdate

如何创建新触发器

我们将按照以下过程在 PostgreSQL 中生成一个新触发器

步骤 1:首先,我们将借助 CREATE FUNCTION 命令创建一个触发器函数。

步骤 2:然后,我们将借助 CREATE TRIGGER 命令将触发器函数附加到表中。

什么是 PostgreSQL CREATE TRIGGER 命令?

CREATE TRIGGER 命令用于创建新触发器。

PostgreSQL CREATE TRIGGER 命令的语法

PostgreSQL CREATE TRIGGER 命令的语法如下

在上面的语法中,我们使用了以下参数,如下表所示:

参数描述
Trigger_name它用于在 TRIGGER 关键字之后定义触发器名称。
BEFORE|AFTER当我们需要在触发器执行时定义时间时,使用这些参数,并且可以在事件发生时指定为 AFTER 或 BEFORE
事件event 参数用于定义请求触发器的事件,它可以是 INSERT、UPDATE、DELETE 或 TRUNCATE。
Table_nametable_name 参数用于定义与触发器链接的表名。它在 ON 关键字之后指定。
[FOR [EACH] { ROW | STATEMENT}]这些参数可以定义触发器的类型,即行级触发器语句级触发器。
  • FOR EACH ROW 子句用于定义行级触发器。
  • FOR EACH STATEMENT 子句用于指定语句级触发器。
Trigger_function它用于在 EXECUTE PROCEDURE 关键字之后定义触发器函数名称。

注意:语句级触发器用于实现每个事务,而行级触发器用于为每一行执行。

例如,假设一个表有 50 行和两个触发器,这些触发器将在发生 DELETE 事件时执行。

如果 delete 命令删除了 50 行,则 行级触发器将执行 50 次,每删除一行执行一次。但是,语句级触发器将执行一次,而不管删除了多少行。

PostgreSQL 创建触发器的示例

让我们看一个示例来理解 PostgreSQL CREATE Trigger 命令的工作原理。

我们正在借助 CREATE 命令创建一个新表作为 Clients,并使用 INSERT 命令插入一些值。

为了将 Clients 创建到 Organization 数据库中,我们使用 CREATE 命令。

但是,在创建 Clients 表之前,如果 Organization 数据库中已经存在类似的表,我们将使用 DROP TABLE 命令

输出

执行上述命令后,我们将收到以下窗口消息: Clients 表不存在。

PostgreSQL Create Trigger

Clients 表包含各种列,例如 Client_id、First_name、Last_name 列,我们使用 Client_id 作为 GENERATED ALWAYS AS IDENTITY 约束

输出

执行上述命令后,我们将收到以下消息,该消息显示 Clients 表已成功创建到 Organization 数据库中。

PostgreSQL Create Trigger

假设当客户端的姓名发生修改时,我们希望将修改记录在名为 Client_audits 的不同表中

输出

在执行上述命令后,我们将收到以下消息窗口,该窗口显示 Client_audits 表已成功创建到 Organization 表中。

PostgreSQL Create Trigger

现在,我们将按照以下步骤为指定的表创建一个新函数

步骤 1:创建一个新函数

首先,我们使用以下命令创建一个名为 log_First_name_changes 的新函数

输出

执行上述命令后,我们将收到以下消息窗口,该窗口显示 log_First_name_changes 函数已成功创建到类似的数据库中。

PostgreSQL Create Trigger

该函数将旧的 First name 插入到 Client_audits 表中,该表包含 Client_id、First_name更改时间(如果客户端的 First_name)。

在上面的命令中,我们有以下内容

  • NEW表示将更新的新行,OLD 表示更新之前的行。
  • First_name 检索新的姓氏;另一方面,OLD.first_name 检索更新之前的名字

步骤 2:创建一个新触发器

成功创建新函数(log_First_name_changes)后,我们将触发器函数附加到 Clients 表,其中 trigger_name 为 First_name_changes

触发器函数用于在更新 First_name 列的值之前自动记录修改,如以下命令所示

输出

执行上述命令后,我们将收到以下消息,该消息显示 First_name_changes 触发器已成功创建。

PostgreSQL Create Trigger

步骤 3:插入数据

成功创建 新函数 log_First_name_changes()新触发器 First_name_changes 后,我们将使用 INSERT 命令的帮助将一些值输入到 Clients 表中。

输出

执行上述命令后,我们将收到以下消息窗口,该窗口显示两个值已成功插入到 Clients 表中。

PostgreSQL Create Trigger

步骤 4:检索数据

创建并插入 Clients 表的值后,我们将使用 SELECT 命令从 Clients 表中检索数据

输出

成功执行上述命令后,我们将得到以下结果,这表明 PostgreSQL 返回了 Clients 表中存在的数据

PostgreSQL Create Trigger

假设 Olivia Smith 将她的 First_name 修改为 Alivia Smith

步骤 5:更新 First_name

因此,在这里,我们使用 UPDATE 命令将 Olivia 的名字更新为新的名字,如下所示

输出

执行上述命令后,我们将收到以下窗口消息,该消息显示指定的值已成功更新。

PostgreSQL Create Trigger

步骤 7:在修改后验证数据

现在,我们将使用以下 SELECT 命令验证 OliviaFirst name 是否已成功更新

输出

成功执行上述命令后,我们将得到以下输出:Olivia 的名字已更新为 AliviaClients 表中

PostgreSQL Create Trigger

步骤 8:验证内容

成功执行所有上述步骤后,最后,我们将借助以下 SELECT 命令验证 Client_audits 表的内容

输出

执行上述命令后,我们将收到以下输出,该输出显示触发器在 Client_audits 表中记录了修改。

PostgreSQL Create Trigger

概述

PostgreSQL Create Trigger 部分,我们学习了以下主题

  • 我们使用 CREATE Function 命令为特定表创建一个新函数,其中触发器函数类似于一致的用户定义函数。
  • PostgreSQL Create trigger 命令用于创建一个带有示例的新触发器。