📅  最后修改于: 2020-11-30 09:28:54             🧑  作者: Mango
在本节中,我们将了解触发函数的工作,触发函数的创建,PostgreSQL的创建触发器,以及创建触发命令的例子。
触发函数与一致的用户定义函数平行。但是触发函数可以返回类型为trigger的值,并且不接受任何参数。
创建触发函数的语法如下:
CREATE FUNCTION trigger_function()
RETURNS TRIGGER
LANGUAGE PLPGSQL
AS $$
BEGIN
-- trigger logic goes here?
END;
$$
注意:我们可以通过PostgreSQL在任何支持的语言的帮助下生成触发函数。
触发器函数可以通过称为触发器数据的特殊结构接受其调用环境的数据,该结构包含一组局部变量。
例如,在触发事件之前或之后, OLD和NEW表示表中行的状态。
PostgreSQL还允许我们使用其他以TG_开头的局部变量,例如TG_WHEN和TG_TABLE_NAME。
如果指定触发函数,则可以修复各种触发事件,例如INSERT , DELETE和Update 。
我们将按照以下过程在PostgreSQL中生成一个新触发器:
步骤1:首先,我们将在CREATE FUNCTION命令的帮助下创建一个触发函数。
步骤2:然后,我们将在CREATE TRIGGER命令的帮助下将触发函数固定在一个表上。
CREATE 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
在上面的语法中,我们使用了以下参数,如下表所示:
Parameters | Description |
---|---|
Trigger_name | It is used to define the trigger name after the TRIGGER keyword. |
BEFORE|AFTER | These parameters are used when we need to define the timing at the trigger’s execution, and it can be specified as AFTER or BEFORE when an event occurs. |
Event | The event parameter is used to define the event which requested the trigger, and it can be INSERT, UPDATE, DELETE, or TRUNCATE. |
Table_name | The table_name parameter is used to define the table name, which is linked with the trigger. And it is specified after the ON keyword. |
[FOR [EACH] { ROW | STATEMENT}] | These parameters can define the types of the trigger, which are Row-level trigger and Statement Level trigger.
|
Trigger_function | It is used to define the trigger function name after the EXECUTE PROCEDURE keyword. |
注意:语句级触发器用于实现每个事务,而行级触发器用于执行每一行的事务。
例如,假设有一个包含50行和两个触发器的表,当发生DELETE事件时将执行该触发器。
如果delete命令删除了50行,则行级触发器将执行50次,每删除一次行一次。但是,无论删除多少行,语句级触发器都将执行一次。
让我们看一个示例示例,以了解PostgreSQL CREATE Trigger命令的工作。
我们正在CREATE命令的帮助下创建一个新表作为Clients ,并使用INSERT命令插入一些值。
要将客户创建到组织数据库中,我们使用CREATE命令。
但是,如果在组织数据库中已经存在类似的表,那么在创建客户表之前,我们将使用DROP TABLE命令。
DROP TABLE IF EXISTS 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表中。
现在,我们将按照以下步骤为指定的表创建一个新函数:
首先,我们使用以下命令创建一个名为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函数已成功创建到类似数据库中。
该函数将旧的名字插入到Client_audits表中,该表包含Client_id,First_name和客户机的First_name的更改时间。
在上面的命令中,我们具有以下内容:
成功创建新函数( log_First_name_changes)后,我们将把触发器函数固定到triggers_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触发器已成功创建。
成功创建新函数为log_First_name_changes()和新触发器为First_name_changes之后,我们将在INSERT命令的帮助下将一些值输入到Clients表中。
INSERT INTO Clients (First_name, Last_name)
VALUES ('Mike', 'Ross'),
('Olivia', 'Smith');
输出量
实施上述命令后,我们将获得以下消息窗口,该窗口显示两个值已成功插入到Clients表中。
创建并插入Clients表的值之后,我们将使用SELECT命令从Clients表中检索数据:
SELECT * FROM Clients;
输出量
成功执行上述命令后,我们将获得以下结果,该结果显示PostgreSQL返回Clients表中存在的数据:
假定奥利维亚·史密斯(Olivia Smith)将她的名字修改为Alivia Smith 。
因此,在这里,我们将借助UPDATE命令将Olivia的名字更新为新名称,如下所示:
UPDATE Clients
SET First_name = 'Alivia'
WHERE ID = 2;
输出量
在执行上述命令时,我们将获得以下窗口消息,该消息显示指定的值已成功更新。
现在,我们将使用以下SELECT命令来验证Olivia的名字是否已成功更新:
SELECT * FROM Clients;
输出量
成功执行上述命令后,我们将获得以下输出:Olivia的名字已更新为Clients表中的Alivia:
成功完成上述所有步骤之后,最后,我们将在以下SELECT命令的帮助下验证Client_audits表的内容:
SELECT * FROM Client_audits;
输出量
执行上述命令后,我们将获得以下输出,该输出显示触发器已将修改记录在Client_audits表中。
在“ PostgreSQL创建触发器”部分中,我们学习了以下主题: