2024 年 9 月 26 日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不受支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3

F.39. spi — 服务器编程接口功能/示例 #

spi 模块提供了一些使用 服务器编程接口 (SPI) 和触发器的实用示例。虽然这些函数本身具有一定的价值,但它们作为可修改用于自身目的的示例更为有用。这些函数通用性强,可用于任何表格,但您必须在创建触发器时指定表格和字段名称(如下所述)。

以下描述的每个函数组都作为单独可安装的扩展提供。

F.39.1. refint — 实现引用完整性功能 #

check_primary_key()check_foreign_key() 用于检查外键约束。(当然,此功能早就被内置的外键机制取代了,但该模块作为示例仍然有用。)

check_primary_key() 检查引用表格。要使用,请在引用其他表格的表格上使用此函数创建一个 BEFORE INSERT OR UPDATE 触发器。指定触发器参数:形成外键的引用表格的列名,被引用表格的名称,以及被引用表格中形成主键/唯一键的列名。要处理多个外键,请为每个引用创建一个触发器。

check_foreign_key() 检查被引用表格。要使用,请在被其他表格引用的表格上使用此函数创建一个 BEFORE DELETE OR UPDATE 触发器。指定触发器参数:必须执行检查的引用表格数量,如果找到引用键的操作(cascade — 删除引用行,restrict — 如果存在引用键,则中止事务,setnull — 将引用键字段设置为 null),触发表格中形成主键/唯一键的列名,然后是引用表格的名称和列名(重复的引用表格数量由第一个参数指定)。请注意,主键/唯一键列应标记为 NOT NULL,并且应具有唯一索引。

refint.example 中有示例。

F.39.2. autoinc — 用于自动递增字段的功能 #

autoinc() 是一个触发器,它将序列的下一个值存储到整型字段中。这与内置的 序列列 功能有一些重叠,但并不相同:autoinc() 将覆盖在插入期间尝试替换不同字段值的尝试,并且它可以选择用于在更新期间也递增字段。

要使用,请使用此函数创建一个 BEFORE INSERT(或可选的 BEFORE INSERT OR UPDATE)触发器。指定两个触发器参数:要修改的整型列的名称,以及将提供值的序列对象的名称。(实际上,如果您希望更新多个自动递增列,可以指定任意数量的这些名称对。)

autoinc.example 中有一个示例。

F.39.3. insert_username — 用于跟踪谁更改了表格的功能 #

insert_username() 是一个触发器,它将当前用户的名称存储到文本字段中。这对于跟踪谁最后修改了表格中的特定行很有用。

要使用,请使用此函数创建一个 BEFORE INSERT 和/或 UPDATE 触发器。指定一个触发器参数:要修改的文本列的名称。

insert_username.example 中有一个示例。

F.39.4. moddatetime — 用于跟踪最后修改时间的功能 #

moddatetime() 是一个触发器,它将当前时间存储到 timestamp 字段中。这对于跟踪表格中特定行的最后修改时间很有用。

要使用,请使用此函数创建一个 BEFORE UPDATE 触发器。指定一个触发器参数:要修改的列的名称。该列必须是 timestamptimestamp with time zone 类型。

moddatetime.example 中有一个示例。

提交更正

如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符或需要进一步说明,请使用 此表格 报告文档问题。