PostgreSQL Create Trigger


PostgreSQL Create Trigger

在本节中,我们要了解的工作触发功能,触发功能的创建,PostgreSQL的创建Trigger实例的的创建Trigger命令

什么是触发功能?

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

创建Trigger函数的语法

创建Trigger函数的语法如下:

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

注意:我们可以通过 PostgreSQL 在任何支持的语言的帮助下生成一个Trigger函数。

一个触发功能可以接受有关通过一个叫做特殊结构,它调用环境中的数据触发数据保存一组局部变量。

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

PostgreSQL还允许我们使用其他以TG_ 开头的局部变量,例如TG_WHENTG_TABLE_NAME。

如果我们指定一个Trigger函数,我们可以修复各种Trigger事件,例如,INSERT、DELETE和Update。

如何创建新Trigger

我们将按照以下过程在 PostgreSQL 中生成一个新的Trigger:

Step1:首先,我们将借助CREATE FUNCTION命令创建一个Trigger函数。

Step2:然后,我们将在CREATE TRIGGER命令的帮助下将Trigger函数固定到一个表中。

什么是 PostgreSQL CREATE TRIGGER 命令?

CREATE TRIGGER 命令用于创建新Trigger。

PostgreSQL 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关键字后定义Trigger名称。
BEFORE\ AFTER 当我们需要定义Trigger执行的时间时会使用这些参数,并且可以在事件发生时将其指定为AFTER 或 BEFORE
Event event 参数用于定义请求Trigger的事件,它可以是INSERT、UPDATE、DELETE 或 TRUNCATE。
Table_name table_name 参数用于定义与Trigger链接的表名。并且在ON关键字之后指定。
[FOR [EACH] { ROW \ STATEMENT}] 这些参数可以定义Trigger的类型,即行级Trigger语句级Trigger。FOR EACH ROW子句用于定义行级Trigger。和FOR EACH STATEMENT子句用于指定语句级Trigger。
Trigger_function 用于在EXECUTE PROCEDURE关键字后定义触发函数名称。

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

例如,让我们假设一个表有 50 行和两个Trigger,当DELETE事件发生时将执行这些Trigger。

如果删除命令删除了 50 行,则行级Trigger将执行 50 次,每删除一行执行一次。但是,无论删除多少行,语句级Trigger都会执行一次。

PostgreSQL 创建Trigger示例

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

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

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

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

DROP TABLE IF EXISTS Clients;

输出

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

PostgreSQL 创建Trigger

客户\表包含各列如CLIENT_ID,名字,姓氏栏,在这里我们使用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数据库中。

PostgreSQL 创建Trigger

假设当客户端名称修改时,我们希望在名为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\表中。

PostgreSQL 创建Trigger

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

步骤 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函数已成功创建到类似数据库中。

PostgreSQL 创建Trigger

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

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

  • 表示,新的行会被更新,OLD表示该行的更新之前。
  • FIRST_NAME检索新的姓氏; 另一方面,OLD.first_name检索更新前的名字

Step2:创建一个新的Trigger

成功创建新函数(log_First_name_changes )后,我们将Trigger函数固定到Trigger名称为First_name_changesClients表中。

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

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

输出

执行上述命令,我们将收到以下消息,显示First_name_changesTrigger已成功创建。

PostgreSQL 创建Trigger

Step3:插入数据

创建后的新功能*()log_First_name_changes*新的触发First_name_changes\成功,我们将进入一些值到客户端\与表的INSERT命令的帮助。

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

输出

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

PostgreSQL 创建Trigger

Step4:检索数据

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

SELECT * FROM Clients;

输出

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

PostgreSQL 创建Trigger

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

第五步:更新名字

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

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

输出

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

PostgreSQL 创建Trigger

Step7:验证修改后的数据

现在,我们将核实,如果名字Olivia已经更新成功与否使用下面的SELECT命令:

SELECT * FROM Clients;

输出

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

PostgreSQL 创建Trigger

Step8:验证内容

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

SELECT * FROM Client_audits;

输出

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

PostgreSQL 创建Trigger

概述

PostgreSQL 创建Trigger部分,我们学习了以下主题:

  • 我们已经使用 CREATE Function命令为特定表创建一个新函数,其中Trigger函数与一致的用户定义函数并行。
  • PostgreSQL的创建触发命令用来创建一个新的触发与它的一个例子。