PostgreSQL 触发器:示例创建、列表和删除

PostgreSQL 中的触发器是什么?

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 是关键字,用于确定触发器何时被调用。

event-name 是导致触发器被调用的事件的名称。它可以是 INSERT、UPDATE、DELETE 等。

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

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

以下语法对此进行了演示

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

PostgreSQL 创建触发器示例

我们将使用下面的 Price 表

价格

PostgreSQL Create Trigger

让我们创建另一个表 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 表。我们将触发器命名为 price_trigger。在创建新记录之前,触发器函数将被自动调用以记录更改。这是触发器

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

让我们向 Price 表插入一条新记录

INSERT INTO Price 
VALUES (3, 400);

现在我们已经向 Price 表插入了一条记录,Price_Audit 表也应该插入一条记录。这将是我们为 Price 表创建的触发器的结果。让我们检查一下

SELECT * FROM Price_Audits;

这将返回以下内容

PostgreSQL Create Trigger

触发器已成功运行。

Postgres 列出触发器

您在 PostgreSQL 中创建的所有触发器都存储在 pg_trigger 表中。要查看您在 数据库 上拥有的触发器列表,请运行下面的 SELECT 命令查询该表

SELECT tgname FROM pg_trigger;

这将返回以下内容

Postgres List Trigger

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

Postgres 删除触发器

要删除 PostgreSQL 触发器,我们使用 DROP TRIGGER 语句,其语法如下

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

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

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

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

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

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

例如

要删除 Price 表上名为 example_trigger 的触发器,我们运行以下命令

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

DROP TRIGGER example_trigger IF EXISTS
ON Company;

使用 pgAdmin

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

如何使用 pgAdmin 在 PostgreSQL 中创建触发器

这是您可以使用 pgAdmin 在 Postgres 中创建触发器的方法

步骤 1) 登录您的 pgAdmin 账户

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

步骤 2) 创建演示数据库

  1. 在左侧的导航栏中,点击 Databases。
  2. 点击 Demo。

Create Trigger in PostgreSQL using pgAdmin

步骤 3) 输入查询

要创建 Price_Audits 表,请在编辑器中键入查询

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

步骤 4) 执行查询

点击 Execute 按钮

Create Trigger in PostgreSQL using pgAdmin

步骤 5) 运行 auditfunc 的代码

运行以下代码来定义 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) 运行代码创建触发器

运行以下代码来创建 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)
  2. 运行以下命令检查是否已向 Price_Audits 表插入记录
    SELECT * FROM Price_Audits

    这应该返回以下内容

Create Trigger in PostgreSQL using pgAdmin

步骤 8) 检查表内容

让我们检查 Price_Audits 表的内容

使用 pgAdmin 列出触发器

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

SELECT tgname FROM pg_trigger

这将返回以下内容

Listing Triggers using pgAdmin

使用 pgAdmin 删除触发器

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

DROP TRIGGER example_trigger IF EXISTS
ON Company

摘要

  • PostgreSQL 触发器是指在数据库对象(如表)上发生数据库事件时自动触发的函数。
  • 此类数据库事件的示例包括 INSERT、UPDATE、DELETE 等。
  • 触发器仅在其创建的数据库对象的生命周期内存在。
  • 如果数据库对象被删除,触发器也将被删除。
  • PostgreSQL 触发器使用 CREATE TRIGGER 语句创建。
  • 每个触发器都与一个函数相关联,该函数说明触发器在被调用时将执行什么操作。

下载本教程中使用的数据库