PostgreSQL 触发器:创建、列出和删除(附示例)

⚡ 智能摘要

PostgreSQL 触发器是当对表执行 INSERT、UPDATE 或 DELETE 事件时自动运行的函数,它允许数据库强制执行规则、记录更改和审计数据,而无需额外的应用程序代码。

  • 定义: 触发器是在数据库事件(例如 INSERT、UPDATE 或 DELETE)发生时自动调用的函数。
  • 🔁 范围: FOR EACH ROW 会对每个受影响的行运行一次触发器,而 FOR EACH STATEMENT 会对每个操作运行一次触发器。
  • 🛠️ 创建: CREATE TRIGGER 将函数绑定到表,并设置 BEFORE、AFTER 或 INSTEAD OF 时间。
  • 📋 列表: 使用 SELECT tgname 查询 pg_trigger 目录,以查看数据库中的每个触发器。
  • 🗑️ 降: DROP TRIGGER 删除触发器,IF EXISTS 防止触发器缺失时发生错误。
  • 🤖 人工智能帮助: AI 助手根据简单的语言请求生成触发函数,并建议在之前或之后执行操作的时间。

PostgreSQL 触发条件

什么是触发器 PostgreSQL?

A PostgreSQL 触发端口 触发器是一个函数,当数据库对象(例如表)发生数据库事件时,该函数会自动触发。可以触发触发器的数据库事件包括 INSERT、UPDATE、DELETE 等。此外,为表创建触发器后,当该表被删除时,触发器也会自动删除。

触发器的使用方法 PostgreSQL?

触发器在创建时可以使用 FOR EACH ROW 运算符进行标记。这样的触发器会在操作修改每一行数据时执行一次。触发器在创建时也可以使用 FOR EACH STATEMENT 运算符进行标记。这样的触发器只会针对特定操作执行一次。

PostgreSQL 创建触发器

要创建触发器,我们使用 CREATE TRIGGER 函数。以下是该函数的语法:

CREATE TRIGGER trigger-name [BEFORE|AFTER|INSTEAD OF] event-name
ON table-name
[
 -- Trigger logic
];

trigger-name 是触发器的名称。

BEFORE、AFTER 和 INSTEAD OF 是确定何时调用触发器的关键字。

事件名称是触发触发器的事件名称。可以是 插入、更新、删除等。

table-name 是要创建触发器的表的名称。

如果要为 INSERT 操作创建触发器,则必须添加 ON column-name 参数。

以下语法证明了这一点:

CREATE TRIGGER trigger-name AFTER INSERT ON column-name
ON table-name
[
 -- Trigger logic
];

PostgreSQL 创建触发器示例

我们将使用下面给出的价格表:

价格:

PostgreSQL 创建触发器

让我们创建另一个表 Price_Audits,我们将在其中记录对 Price 表所做的更改:

CREATE TABLE Price_Audits (
   book_id INT NOT NULL,
    entry_date text NOT NULL
);

我们现在可以定义一个名为 auditfunc 的新函数:

CREATE OR REPLACE FUNCTION auditfunc() RETURNS TRIGGER AS $my_table$
   BEGIN
      INSERT INTO Price_Audits(book_id, entry_date) VALUES (new.ID, current_timestamp);
      RETURN NEW;
   END;
$my_table$ LANGUAGE plpgsql;

上述函数将在表 Price_Audits 中插入一条记录,其中包括新行 ID 和创建该记录的时间。

现在我们有了触发函数,接下来应该将其绑定到价格表。我们将触发器命名为 price_trigger。在创建新记录之前,该触发函数将自动调用以记录更改。以下是触发器代码:

CREATE TRIGGER price_trigger AFTER INSERT ON Price
FOR EACH ROW EXECUTE PROCEDURE auditfunc();

让我们在价格表中插入一条新记录:

INSERT INTO Price
VALUES (3, 400);

现在我们已经在 Price 表中插入了一条记录,根据我们创建的触发器,Price_Audits 表中也应该插入一条记录。让我们来验证一下:

SELECT * FROM Price_Audits;

这将返回以下内容:

PostgreSQL 创建触发器

扳機成功啟動。

PostgreSQL 列表触发器

您在 PostgreSQL 存储在 pg_trigger 表中。要查看您在 数据库,通过运行 SELECT 命令查询表,如下所示:

SELECT tgname FROM pg_trigger;

这将返回以下内容:

PostgreSQL 列表触发器

pg_trigger 表的 tgname 列表示触发器的名称。

PostgreSQL 掉落触发器

当不再需要触发器时,您可以轻松将其移除。要移除一个 PostgreSQL 触发器,我们使用 DROP TRIGGER 语句,语法如下:

DROP TRIGGER [IF EXISTS] trigger-name
ON table-name [ CASCADE | RESTRICT ];

trigger-name 参数表示要删除的触发器的名称。

table-name 表示要从中删除触发器的表的名称。

IF EXISTS 子句尝试删除一个存在的触发器。如果您尝试在不使用 IF EXISTS 子句的情况下删除一个不存在的触发器,则会收到错误。

CASCADE 选项将帮助您自动删除所有依赖于触发器的对象。

如果使用 RESTRICT 选项,则如果对象依赖于触发器,则不会删除该触发器。

对于实施例:

要删除表 Company 上名为 example_trigger 的触发器,请运行以下命令:

DROP TRIGGER example_trigger IF EXISTS
ON Company;

使用 pgAdmin

现在让我们看看如何使用pgAdmin来执行这三个操作。

如何在 PostgreSQL 使用 pgAdmin

以下是如何创建触发器的方法 PostgreSQL 使用 pgAdmin:

步骤 1)登录你的 pgAdmin 账户

打开pgAdmin并使用您的凭据登录您的帐户。

步骤 2)创建演示数据库

  1. 在左侧的导航栏中,单击数据库。
  2. 单击“演示”。

在以下位置创建触发器 PostgreSQL 使用 pgAdmin

步骤 3)输入查询

要创建 Price_Audits 表,请在编辑器中输入以下查询:

CREATE TABLE Price_Audits (
   book_id INT NOT NULL,
    entry_date text NOT NULL
)

步骤4)执行查询

单击执行按钮。

在以下位置创建触发器 PostgreSQL 使用 pgAdmin

步骤 5)运行 Code 用于审计函数

运行以下代码来定义函数auditfunc:

CREATE OR REPLACE FUNCTION auditfunc() RETURNS TRIGGER AS $my_table$
   BEGIN
      INSERT INTO Price_Audits(book_id, entry_date) VALUES (new.ID, current_timestamp);
      RETURN NEW;
   END;
$my_table$ LANGUAGE plpgsql

步骤 6)运行 Code 创建触发器

运行以下代码来创建触发器 price_trigger:

CREATE TRIGGER price_trigger AFTER INSERT ON Price
FOR EACH ROW EXECUTE PROCEDURE auditfunc()

步骤 7)插入新记录

  1. 运行以下命令将新记录插入到 Price 表中:
INSERT INTO Price
VALUES (3, 400)
  1. 运行以下命令检查记录是否已插入 Price_Audits 表:
SELECT * FROM Price_Audits

这应该返回以下内容:

在以下位置创建触发器 PostgreSQL 使用 pgAdmin

步骤 8)检查表内容

让我们来查看一下 Price_Audits 表的内容。

使用 pgAdmin 列出触发器

步骤1) 运行以下命令检查数据库中的触发器:

SELECT tgname FROM pg_trigger

这将返回以下内容:

使用 pgAdmin 列出触发器

Dropping 使用 pgAdmin 的触发器

要删除表 Company 上名为 example_trigger 的触发器,请运行以下命令:

DROP TRIGGER example_trigger IF EXISTS
ON Company

下载本教程使用的数据库

常见问题

BEFORE 触发器在行更改写入之前运行,因此它可以修改或拒绝该行。AFTER 触发器在更改保存之后运行,适用于日志记录和审计任务。

INSTEAD OF 触发器定义在视图上,而不是表上。它会将 INSERT、UPDATE 或 DELETE 语句替换为自定义逻辑,从而使只读视图变为可写。

触发函数通常用 PL/pgSQL 编写。 PostgreSQL 也支持PL/PythonPL/Perl、PL/Tcl 和 C,您可以选择符合您逻辑的语言。

使用 ALTER TABLE 表名 DISABLE TRIGGER 触发器名 来关闭触发器,使用 ENABLE TRIGGER 来重新启用它。这样可以避免数据丢失。ping 并在批量加载期间重新创建触发器。

是的。每个触发器都会增加受影响的每一行或每条语句的写入操作,因此繁重的触发器逻辑会降低写入速度。请尽量缩短触发器函数的长度,并为它们查询的列建立索引。

是的。如果一个触发器更改了另一个也有触发器的表,那么这些触发器也会被触发,从而产生级联触发器。 PostgreSQL 限制嵌套深度以防止无限循环。

AI 编码助手将纯语言请求转换为完整的 CREATE TRIGGER 语句和触发函数,建议 BEFORE 或 AFTER 时间,并解释生成的 PL/pgSQL 以便快速审查。

是的。像 pgai 和基于 GPT 的助手之类的工具可以将描述的规则转换为触发 SQL,并可以构建 INSERT 触发器,以便在新数据到达时自动标记或验证新数据。

总结一下这篇文章: