PostgreSQL Create Trigger创建触发器

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

什么是触发器功能?

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

创建触发器函数的语法

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

CREATE FUNCTION trigger_function()   
   RETURNS TRIGGER   
   LANGUAGE PLPGSQL  
AS $$  
BEGIN  
   -- trigger logic goes here?  
END;  
$$  

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

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

PostgreSQL还允许我们在其他局部变量前面加上TG_,如TG_WHEN和TG_TABLE_NAME。

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

如何创建新触发器

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

CREATE TRIGGER trigger_name   
 {BEFORE | AFTER} { event }  
  ON table_name  
  [FOR [EACH] { ROW | STATEMENT }]  
  EXECUTE PROCEDURE trigger_function  

第一步:首先,我们将在CREATE FUNCTION命令的帮助下创建一个触发器函数。

Step2:然后,我们将借助CREATE TRIGGER命令将触发器函数固定到一个表中。

什么是 PostgreSQL CREATE TRIGGER 命令?

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

PostgreSQL CREATE TRIGGER 命令的语法:

CREATE TRIGGER trigger_name   
 {BEFORE | AFTER} { event }  
  ON table_name  
  [FOR [EACH] { ROW | STATEMENT }]  
  EXECUTE PROCEDURE trigger_function  

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

参数 描述
Trigger_name 它用于在TRIGGER关键字之后定义触发器名称。
BEFORE|AFTER 当我们需要定义触发器执行的时机时会用到这些参数,可以在事件发生时将其指定为AFTER 或BEFORE 。
Event event 参数用于定义请求触发器的事件,它可以是INSERT、UPDATE、DELETE 或 TRUNCATE。
Table_name table_name 参数用于定义与触发器链接的表名。它在ON关键字之后指定。
[FOR [EACH] { ROW | STATEMENT}] 这些参数可以定义触发器的类型,分别是Row-level trigger和Statement Level trigger。
  • FOR EACH ROW子句用于定义行级触发器。
  • FOR EACH STATEMENT子句用于指定Statement-Level 触发器。
Trigger_function 它用于在EXECUTE PROCEDURE关键字之后定义触发器函数名称。

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

如果删除命令删除了 50 行,行级触发器将执行 50 次,每个删除的行执行一次。但是,无论删除多少行,语句级触发器都会执行一次。

PostgreSQL 创建触发器示例

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

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

要将客户创建到组织数据库中,我们使用CREATE命令。

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

DROP TABLE IF EXISTS Clients;  

执行上述命令后,我们会得到如下窗口信息:Clients表不存在。

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

CREATE TABLE Clients(  
   ID INT GENERATED ALWAYS AS IDENTITY,  
   First_name VARCHAR(50) NOT NULL,  
   Last_name VARCHAR(50) NOT NULL,  
   PRIMARY KEY(ID)  
);  

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

假设当客户名称修改时,我们希望将修改记录在另一个名为Client_audits的表中:

CREATE TABLE Client_audits (  
   ID INT GENERATED ALWAYS AS IDENTITY,  
   Client_id INT NOT NULL,  
   First_name VARCHAR(50) NOT NULL,  
   changed_on TIMESTAMP(5) NOT NULL  
);  

执行上述命令后,我们会得到如下消息窗口,显示Client_audits表已成功创建到Organization表中。

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

第1步:创建一个新函数

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

CREATE OR REPLACE FUNCTION log_First_name_changes()  
  RETURNS TRIGGER   
  LANGUAGE PLPGSQL  
  AS  
$$  
BEGIN  
    IF NEW.First_name <> OLD.First_name THEN  
         INSERT INTO Client_audits(Client_id,First_name,changed_on)  
         VALUES(OLD.ID,OLD.First_name,now());  
    END IF;  
RETURN NEW;  
END;  
$$  

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

该函数将旧的 First name 插入到Client_audits表中,该表包含Client_id、First_name以及客户First_name的更改时间。

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

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

第2步:新建触发器

成功创建新函数(log_First_name_changes)后,我们将触发器函数固定到trigger_name 为First_name_changes的Clients表。

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

CREATE TRIGGER First_name_changes  
 BEFORE UPDATE  
 ON Clients  
 FOR EACH ROW  
 EXECUTE PROCEDURE log_First_name_changes();  

执行上面的命令我们会得到如下信息,显示First_name_changes触发器已经创建成功。

第3步:插入数据

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

INSERT INTO Clients (First_name, Last_name)  
VALUES ('Mike', 'Ross'),  
('Olivia', 'Smith');  

执行上述命令后,我们会得到如下消息窗口,显示这两个值已经成功插入到Clients表中。

第4步:检索数据

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

SELECT * FROM Clients;  

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

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

第5步:更新名字

所以在这里,我们在UPDATE命令的帮助下将Olivia 的名字更新为新名字,如下所示:

UPDATE Clients  
SET First_name = 'Alivia'  
WHERE ID = 2;  

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

第6步:验证修改后的数据

现在,我们将使用以下SELECT命令验证Olivia的名字是否已成功更新:

SELECT * FROM Clients;  

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

第7步:验证内容

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

SELECT * FROM Client_audits;  

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

 

热门文章

优秀文章