spi模块提供了多个可工作的使用服务器编程接口 (SPI) 和触发器的例子。尽管这些函数本身有一定的价值, 但它们作为修改以满足你自己需求的示例更为有用。这些函数足够通用,可以与任何表一起使用, 但在创建触发器时你必须指定表名和字段名(如下所述)。
下面描述的函数组中的每一个都作为一个独立可安装的扩展提供。
check_primary_key()和check_foreign_key()用于检查外键约束。
(当然,这个功能早已被内建的外键机制取代,但该模块仍然作为示例有用。)
check_primary_key()检查引用表。
使用时,在引用另一个表的表上创建一个 AFTER INSERT OR UPDATE 触发器,使用此函数。
作为触发器参数指定:形成外键的引用表的列名,引用的表名,以及
在引用表中形成主键/唯一键的列名。要处理多个外键,
为每个引用创建一个触发器。
check_foreign_key()检查被引用的表。
使用时,在被其他表引用的表上创建一个 AFTER DELETE OR UPDATE 触发器,使用此函数。
作为触发器参数指定:需要进行检查的引用表的数量,如果找到引用键的操作
(cascade — 删除引用行,
restrict — 如果存在引用键则中止事务,
setnull — 将引用键字段设置为 null),
被触发表的列名,这些列形成主键/唯一键,然后是引用表的名称和列名
(根据第一个参数指定的引用表数量重复)。请注意,主键/唯一键列应标记为 NOT NULL,并且应具有唯一索引。
请注意,如果这些触发器是从另一个 BEFORE 触发器中执行的,它们可能会意外失败。
例如,如果用户插入 row1,然后 BEFORE 触发器插入 row2 并调用带有
check_foreign_key() 的触发器,
check_foreign_key() 函数将无法看到 row1 并会失败。
refint.example 中有一些例子。
autoinc() 是一个触发器,将序列的下一个值存储到一个整数字段中。
这与内置的 “serial column” 特性有一些重叠,但并不相同。
只有在该值最初为零或 null(在插入或更新行的 SQL 语句执行后)时,触发器才会替换字段的值。
此外,如果序列的下一个值为零,将第二次调用 nextval() 以获取非零值。
用法是使用这个函数创建一个 BEFORE INSERT(或者 BEFORE INSERT OR UPDATE)触发器。指定两个触发器参数:要被修改的整数列名和将提供值的序列对象名(事实上,如果你想要更新多于一个自增列,你可以指定任意数量的这种名称对)。
在 autoinc.example 中有一个例子。
insert_username() 是一个触发器,将当前用户名存储到一个文本字段中。
这有助于跟踪是谁最后在一个表中修改了一个特定行。
用法是使用这个函数创建一个BEFORE INSERT和/或UPDATE触发器。指定一个触发器参数:要被修改的文本列名。
在insert_username.example中有一个例子。
moddatetime()是一个存储当前时间到一个timestamp字段的触发器。它有助于跟踪一个表中特定行最后一次的修改时间。
用法是使用这个函数创建一个BEFORE UPDATE触发器。指定一个触发器参数:要被修改的列名。该列必须是类型timestamp或timestamp with time zone。
在moddatetime.example中有一个例子。