F.41. spi — 服务器编程接口功能/示例#
- F.41.1. refint — 实现引用完整性的函数
- F.41.2. autoinc — 自动递增字段的函数
- F.41.3. insert_username — 跟踪谁更改了表的函数
- F.41.4. moddatetime — 跟踪最后修改时间的函数
spi模块提供了使用服务器编程接口(SPI) 和触发器的多个可行示例。虽然这些函数本身具有一定价值,但它们作为修改为满足您自己目的的示例更有用。这些函数足够通用,可用于任何表,但您必须在创建触发器时指定表和字段名称(如下所述)。
下面描述的每个函数组都作为可单独安装的扩展提供。
F.41.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.41.2. autoinc — 自动增量字段的函数#
autoinc()
是一个触发器,它将序列的下一个值存储到一个整数字段中。这与内置的“序列列”功能有一些重叠,但它并不相同:autoinc()
将覆盖在插入期间用不同的字段值替换的尝试,并且还可以选择在更新期间增加该字段。
要使用,请使用此函数创建一个BEFORE INSERT
(或可选的BEFORE INSERT OR UPDATE
)触发器。指定两个触发器参数:要修改的整数列的名称和将提供值的序列对象的名称。(实际上,如果你想更新多个自动增量列,你可以指定任意数量的此类名称对。)
在autoinc.example
中有一个示例。
F.41.3. insert_username — 用于跟踪谁更改了表的功能#
insert_username()
是一个触发器,它将当前用户的名称存储到一个文本字段中。这对于跟踪谁最后修改了表中的特定行很有用。
要使用,请使用此函数创建一个BEFORE INSERT
和/或UPDATE
触发器。指定一个触发器参数:要修改的文本列的名称。
在insert_username.example
中有一个示例。
F.41.4. moddatetime — 用于跟踪最后修改时间的函数#
moddatetime()
是一个触发器,它将当前时间存储到timestamp
字段中。这对于跟踪表中特定行的最后修改时间很有用。
要使用,请使用此函数创建一个BEFORE UPDATE
触发器。指定一个触发器参数:要修改的列的名称。该列必须是timestamp
或timestamp with time zone
类型。
在moddatetime.example
中有一个示例。