PostgreSQL – 触发器
PostgreSQL 触发器是一个在与表关联的事件发生时自动调用的函数。事件可以是以下任何一种:INSERT、UPDATE、DELETE 或 TRUNCATE。
触发器是与表关联的特殊用户定义函数。要创建一个新的触发器,必须先定义一个触发器函数,然后将该触发器函数绑定到一个表上。触发器和用户定义函数之间的区别在于,当事件发生时会自动调用触发器。
PostgreSQL 提供两种主要类型的触发器:
- 行级触发器
- 语句级触发器
两种类型的区别在于触发器被调用的次数和时间。例如,如果您发出影响 20 行的 UPDATE 语句,则行级触发器将被调用 20 次,而语句级触发器将被调用 1 次。
您可以指定是在事件之前还是之后调用触发器。如果触发器在事件之前被调用,它可以跳过当前行的操作,甚至更改正在更新或插入的行。如果在事件之后调用触发器,则所有更改都可用于触发器。
如果数据库被各种应用程序访问,并且您希望在修改表的数据时自动运行的数据库中保持跨功能,则触发器很有用。例如,如果您想保留数据的历史记录而不要求应用程序具有检查每个事件(如 INSERT 或 UPDATE)的逻辑。
您还可以使用触发器来维护复杂的数据完整性规则,除了在数据库级别之外,您无法在其他地方实现这些规则。例如,当向客户表中添加新行时,还必须在银行和信用表中创建其他行。
使用触发器的主要缺点是你必须知道触发器存在并理解它的逻辑才能弄清楚数据更改时的影响。
尽管 PostgreSQL 实现了 SQL 标准,但 PostgreSQL 中的触发器有一些特定的特性,如下所示:
- PostgreSQL 为TRUNCATE事件触发触发器。
- PostgreSQL 允许您在视图上定义语句级触发器。
- PostgreSQL 要求你定义一个用户定义的函数作为触发器的动作,而 SQL 标准允许你使用任意数量的 SQL 命令。
例子:
我们来看一个创建新触发器的例子。在这个例子中,我们将创建一个名为员工的新表 如下:
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
当员工姓名更改时,我们将更改记录在名为employee_audits的单独表中 :
CREATE TABLE AUDIT(
EMP_ID INT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);
首先,定义一个名为 auditlog() 的新函数:
CREATE OR REPLACE FUNCTION auditlog() RETURNS TRIGGER AS $example_table$
BEGIN
INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp);
RETURN NEW;
END;
$example_table$ LANGUAGE plpgsql;
该函数将旧的姓氏插入到employee_audits表中,包括雇员ID、姓氏和更改时间(如果雇员的姓氏发生变化)。其次,将触发器函数绑定到employees 表。触发器名称是last_name_changes 。在last_name列的值更新之前,会自动调用触发器函数来记录更改。
CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY
FOR EACH ROW EXECUTE PROCEDURE auditlog();
第三,插入一些样本数据进行测试。我们将两行插入到员工表中。
INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY)
VALUES (1, 'Raju', 25, 'New-Delhi', 33000.00 );
要检查员工表,请使用以下查询:
SELECT * FROM COMPANY;
输出: